Skip to end of metadata
Go to start of metadata

Læringsmål:

  • Funksjoner med flere enn én returvariabel 
  • While-Løkker
  • FOR-Løkker
  • Plot

Pensum:

  • 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.

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

 

Vi starter med å skrive 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
>> [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)

Nå har vi regnet ut startfarten i x- og y-retning. Siden strekning = fart * tid vil den nye posisjonen være gitt ved: 


\( x_{n+1} = x_n + v_{xn} \cdot dt \text{ og }y_{n+1} = y_n + v_{yn} \cdot 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)

Denne skal kalkulerere x- og y-koordinatet i neste steg, ut ifra det nåværende stegets posisjon og fart.    

 

Eksempel på kjøring
>> [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:

  \( a_{x_{n+1}} = -k \cdot v_{x_n} \cdot abs(v_{x_n}) \text{ , } a_{y_{n+1}} = -k \cdot v_{y_n} \cdot abs(v_{y_n})-g \)

 

Her har vi en konstant, k = 0.01, som representerer luftmotstanden og g, som er gravitasjonskonstanten (9.81 på jorden). 


Skriv funksjonen function[ax, ay] = acceleration(vx, vy), som regner ut akselerasjonen, ut ifra formelen gitt ovenfor. 

 

Eksempel på kjøring
>> [ax, ay] = acceleration (0, 0)
ax =
     0
ay =
   -9.8100
>> [ax, ay] = acceleration (10 , 10)
ax =
    -1
ay =
  -10.8100

 

 

d)

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
>> [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 funksjonen function[x, y] = trajectory(initialSpeed, initialAngle, height).

Denne funksjonen benytter seg av initialVelocity(), acceleration(), velocity() og position().

Funksjonen skal returnere én liste for x-koordinater og én liste for y-koordinater.
Tiden kulen bruker på å treffe bakken er ukjent, en while-løkke må derfor benyttes. Denne skal avslutte når høyden blir mindre enn 0.



f)

Lag funksjonen plotTrajectory(initialSpeed, initialAngle, height). Denne har de samme parameterene som trajectory().

Den skal benytte seg av plot()-funksjonen for å vise kulens bane.  

Eksempel på kjøring
>> 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
>> 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. 
 

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);
    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