...
- 3.5 - Scripts to Produce and Customize Simple Plots
- 5.1 - The For loop
- 5.3 - While loops
- 10.3 - Variable Numbers of Arguments
Når man støter kule er det ikke bare hastigheten på kulen som avgjør hvor langt man støter - vinkelen man støter med og høyden over bakken spiller også en rolle. I denne oppgaven skal det lages en funksjon som modellerer dette problemet, og vi skal finne ut hvilken vinkel som er optimal for en gitt høyde.
Det skal regnes på bevegelse i to dimensjoner, x og y. Hvis høyden er lik 5 så er startposisjonen x = 0 og y = 5. Det er ikke nødvendig å forstå fysikken bak bevegelsene, siden det blir oppgitt riktige formler og hvor de skal brukes.
For å beregne kulebanen, må vi vite hvor kulen er, hva farten er og hvilken akselerasjon den har. Dette er initialbetingelsene.
...
Fra vinkel og starthastighet kan farten dekomponeres i x og y-retning:
vx = cos(angle)*initialSpeed
vy = sin(angle)*initialSpeed
Vi starter med å skrive funksjonen initVelocity(initalAngle, initialSpeed)
.
...
Tips: cos og sin i Matlab regner med radianer. Bruk derfor cosd
og sind
eller benytt følgende: grader = radianer*(180/pi)
Code Block | ||
---|---|---|
|
...
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 |
...
Nå har vi regnet ut startfarten i x- og y-retning. Siden strekning = fart * tid vil den nye posisjonen være gitt ved:
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
Denne skal kalkulerere x- og y-koordinatet i neste steg, ut ifra det nåværende stegets posisjon og fart.
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 |
c)
...
Akselerasjonen er i denne oppgaven gitt ved:
Her Her har vi en konstant, k = 0.01
, som representerer luftmotstanden og g
, som er gravitasjonskonstanten (9.81 på jorden).
...
Lag funksjonen plotTrajectory
. Denne 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) |
...
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.
...
Code Block | ||
---|---|---|
| ||
>> plotTrajectoryLength(100,0,45/8,90,10) |
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.
Code Block | ||
---|---|---|
| ||
function animate(initialSpeed, initialAngle, height) [xliste, yliste]= trajectory(initialSpeed, initialAngle, height); dt=0.1; % Setter tidsintervall xmax = max(xliste); xmin = min(xliste); ymax = max(yliste); ymin = min(yliste); xlen = length(xliste); axis([xmin xmax ymin ymax]); hFig = figure(1); set(hFig, 'Position', [xmin ymin 1200 800]) for i = [1:length(xliste)] % printer plottet, ett steg lengre for hver iterasjon hold on; % Vil beholde det eksisterende plottet. plot(xliste(1:i),yliste(1:i), '-k'); % Hva skjer her? pause(dt/initialSpeed*2); % Koden kjører for fort, ber den pause med "dt" end end |