You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 21 Next »

Læringsmål:

  •  Funksjoner

Pensum:

  •  Kap 3.7

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. Det er ikke nødvendig å forstå fysikken bak bevegelsene, siden det blir oppgitt riktige formler og hvor de skal brukes. Men det kreves en liten intuisjon for hva som foregår. Hvis høyden er lik 5 så er startposisjonen x = 0 og y = 5.

For å bergene kulebanen, må man vite hvor kulen er, hvilken fart og  akselerasjon den har. Dette er initialbetingelsene. Det velges så en liten tidsenhet, dt, feks 0.1 sekund. Ved å benytte initialbetingelsene kan man regne ut den nye posisjonen, farten og akselerasjonen, etter 0.1 sekund. Dette gjentas i helt til høyden, y-koordinatet er 0. Da har kulen landet. x-verdien er da lengden på kastet. 

a)

Fra posisjon, vinkel og initial-fart kan farten dekomponeres i x og y-retning:
v_x = cos(angle)*speed
v_y = sin(angle)*speed

Skriv funksjonen initVelocity( initAngle, speed). Denne skal returnere initialhastighet i x og y-retning som en liste. 

Tips: cos og sin i Matlab regner med radianer. Bruk derfor cosd og sind eller benytt følgende: grader = radianer*(180/pi)

[ivx, ivy] = initVelocity (0, 100) % skal returnere x = 100 , y = 0
 
[ivx, ivy] = initVelocity (pi /2, 100) % skal returnere x = 6.1232e -15 , y = 100
 
[ivx, ivy] = initVelocity (pi /4, 100) % skal returnere x = 70.7107 , y = 70.7107

 

b)

Farten i x og y-retning (etter dt, 0.1 sekund) er beregnet. Av fart*tid = strekning blir den nye posisjonen blir gitt ved: 

 

 Lag funksjonen position(x,y,  vx, vy,  dt) som returnerer [x,y] (koordinatene). 

[x, y] = position (10 , 10, 0, 1, 1)  % skal returnere x = 10, y = 11
 
[x, y] = position (10 , 10, 1, 0, 1) % skal returnere x = 11, y = 10
 
[x, y] = position (10 , 10, 1, 1, 0.1) % skal returnere x = 10.1 , y = 10.1

 

c)

 

 , 

k = 0.01 og representerer luftmotstanden. g = 9.81 , gravitasjonskonstanten. 

Skriv function [ax, ay] = acceleration(vx, vy). 

 

[ax, ay] = acceleration (0, 0) % skal returnere x = 0, y = -9.81
 
[ax, ay] = acceleration (10 , 10) % skal returnere x = -1, y = -10.81

 

d)

Skriv function [vx, vy] = velocity(ax, ay, vx, vy, dt). Denne beregner farten i det neste steget gitt nåværende fart og akselerasjon.

e)

Skriv function [xv, yv] = trajectory( initialSpeed, initialAngle, height ) . Denne funksjonen benytter seg av initialSpeed, acceleration, velocity og position. Den skal returnere to lister: en for x og en for y-koordinater. 
Tiden kulen bruker på å treffe bakken er ukjent, en while løkke må derfor benyttes. Stopp denne når høyden (y) blir mindre enn 0.

f)

Lag funksjonen plotTrajectory. Denne skal ha samme parameterene som trajectory. Den skal benytte seg av plot-funksjonen for å vise kulens bane.  

g)

Lag funksjonen plotTrajectoryLength. Den skal kalle trajectory med vinkler mellom 0 og pi/2 (0 og 90 grader). Deretter skal den plotte vinkel mot lengden av kulestøtet. 
Velg pi/32 som steglengde for vinkelen.
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?

 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;
   	 % Lite spennende
    % Look away
    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])

% Spennende
	for i = [1:length(xliste)]          % printer plottet, ett steg lengre for hver
                                    % "frame" eller steg/dt.
    	hold on;                        % Vil beholde det eksisterende plottet.
    	plot(xliste(1:i),yliste(1:i), '-k'); % Hva skjer her?
    	pause(dt);                      % Koden kjører for fort, ber den pause med "dt"
end
  • No labels