...
For å beregne kulebanen, må vi vite hvor kulen er, hva farten er og hvilken akselerasjon den har. Dette er initialbetingelsene.
Videre lar vi det gå en tidsenhet, f.eks 0.01 sekunder, slik at kulen flytter seg litt og deretter kalkulerer vi variablene på nytt.
Dette gjentar vi så lenge y-koordinatet er større enn 0. Da har kulen truffet bakken, og lengden av kastet vil være gitt av x-koordinatet.
a)
Fra vinkel og starthastighet kan farten dekomponeres i x og y-retning:vx = cos(angle)*initialSpeed
vy = sin(angle)*initialSpeed
Skriv funksjonen initVelocity(initalAngle, initialSpeed)
. Denne skal returnere starthastighetene i x og y-retning.
Tips: cos og sin i Matlab regner med radianer. Bruk derfor cosd
og sind
eller benytt følgende: grader = radianer*(180/pi)
Eksempel på kjøring:
Code Block | ||
---|---|---|
| ||
>> [vx,vy] = initVelocity(0,100) vx = 100 vy = 0 >> [vx,vy] = initVelocity(90,100) vx = 0 vy = 100 >> [vx,vy] = initVelocity(45,100) vx = 70.7107 vy = 70.7107 |
b)
Farten Nå har vi regnet ut startfarten i x- og y-retning er beregnetretning. Siden strekning = fart * tid vil den nye posisjonen være gitt ved:
hvor dt
her har vi en konstant, dt
, som er et tidsintervall på 0.01 sekunder.
Skriv funksjonen med signaturen function[x, y] = position(x, y, vx, vy, dt)
som kalkulerer x- og y-koordinatet i neste steg, ut ifra det nåværende stegets posisjon og fart. Eksempel på kjøring:
Code Block | ||
---|---|---|
| ||
>> [x, y] = position (10, 10, 1, 1, 0.1) x = 10.1000 y = 10.1000 >> [x, y] = position (10, 10, 1, 0, 1) x = 11 y = 10 >> [x, y] = position (10, 10, 0, 1, 1) x = 10 y = 11 |
...
Akselerasjonen er i denne oppgaven gitt ved:
Her har vi en konstant, k = 0.01
og , som representerer luftmotstanden og g
er , som er gravitasjonskonstanten (9.81 på jorden).
Skriv Skriv funksjonen function[ax, ay] = acceleration(vx, vy)
, som regner ut akselerasjonen, ut ifra formelen gitt ovenfor.
Eksempel på kjøring:
Code Block | ||
---|---|---|
| ||
>> [ax, ay] = acceleration (0, 0) ax = 0 ay = -9.8100 >> [ax, ay] = acceleration (10 , 10) ax = -1 ay = -10.8100 |
d)
Skriv Skriv nå funksjonen function[vx, vy] = velocity(ax, ay, vx, vy, dt)
. Denne beregner farten i det neste steget gitt nåværende fart og akselerasjon.Eksempel på kjøring:
Code Block | ||
---|---|---|
| ||
>> [vx,vy] = velocity(1,1,0,0,0.1) vx = 0.1000 vy = 0.1000 >> [vx,vy] = velocity(-3,-9.81,50,20,1) vx = 47 vy = 10.1900 |
e)
Skriv Skriv funksjonen function[x, y] = trajectory(initialSpeed, initialAngle,
height)
. Denne funksjonen benytter seg av initialVelocity(),
acceleration(),
velocity()
og position()
.
Funksjonen Den skal returnere en én liste for x-koordinater og en én liste for y-koordinater.
Tiden kulen bruker på å treffe bakken er ukjent, en while-løkke må derfor benyttes. Denne skal terminere avslutte når høyden blir mindre enn 0.
f)
Lag funksjonen plotTrajectory
. Denne skal ha har de samme parameterene som (initialSpeed, initialAngle,
height)
trajectory()
. Den skal benytte seg av plot()
-funksjonen for å vise kulens bane.
Code Block | ||
---|---|---|
| ||
>> plotTrajectory(100,45,10) |
Utskriften fra funksjonen skal se nogenlunde slik ut:
g)
Lag funksjonen plotTrajectoryLength(initialSpeed, start, step, stop, height).
Den skal kalle trajectory()
med vinkler mellom start
og stop
, med steglengde step
. Deretter skal den plotte vinklene mot de korresponderende lengdene av kulestøtet. Eksempel på kjøring:
Code Block | ||
---|---|---|
| ||
>> plotTrajectoryLength(100,0,45/8,90,10) |
Til ettertanke:
Hvilken vinkel gir best resultat?
Hva skjer om man endrer på høyden?
Hva skjer om k og g endres?
Har farten noe å si for vinkelen?
Utskriften fra funksjonen skal se nogenlunde slik ut:
h)
Det ønskes en enkel måte å visualisere kulestøtet som en animasjon. Se om alt fungerer ved å lagre koden under og kjøre den med noen verdier.
...