Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Læringsmål:

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

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 skal det lages en funksjon som modellerer dette problemet, og vi skal nne 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. Men det kreves en liten intuisjon for hva som foregår. Hvis høyden er lik 4 så er startposisjonen x = 0 og y = 4.
FIGURE 


Image Added

For å bergene beregne kulebanen, må man vi vite hvor kulen er, hvilken fart og  akselerasjon hva farten er og hvilken 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.

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 posisjon, vinkel og initial-fart starthastighet kan farten dekomponeres i x og y-retning:v_x


vx = cos(angle)*

...

initialSpeed

...

vy =

...

sin(angle)*initialSpeed

 

Vi starter med å skrive speedSkriv funksjonen initVelocity( initAngleinitalAngle, speedinitialSpeed).

Denne skal returnere initialhastighet starthastighetene i x og y-retning som en liste

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


Code Block
languagetitlenoneEksempel på kjøring
>> [ivxvx, ivyvy] = initVelocity (0, 100)
vx %=
 skal returnere x100
vy =
 100 , y = 0
>> 
[ivxvx, ivyvy] = initVelocity (pi /290, 100)
vx %=
 skal returnere x = 6.1232e -15 , y = 0
vy =
   100
>> 
[ivxvx, ivyvy] = initVelocity (pi /445, 100)
vx %=
 skal returnere x = 70.7107
vy ,=
 y = 70.7107

 

 

b)

Farten Nå har vi regnet ut startfarten i x- og y-retning (etter dt, 0.1 sekund) er beregnet. Av . Siden strekning = fart * tid = strekning blir d vil den nye posisjonen blir være gitt ved: x_{n+1} = x_n + v_{xn}*dt og y_{n+1} = y_n + v_{yn}*dt .Lag funksjonen  


       

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.    

 

Code Block
titleEksempel på kjøring
>> 

...

languagenone
[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)

a_x_{n+1} = -k*v_{x_n}*abs(v_x_n)

a_y_{n+1} = -k*v_{y_n}*abs(v_y_n)-g

 Akselerasjonen er i denne oppgaven gitt ved:

 

 

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


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

 

Code Block
languagetitlenoneEksempel på kjøring
>> [ax, ay] = acceleration (0, 0)
ax %=
 skal returnere x = 0,
ay =
 y = -9.818100
>> 
[ax, ay] = acceleration (10 , 10)
ax %=
 skal returnere x = -1,
ay y=
 = -10.818100

 

 

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.

 

Code Block
titleEksempel 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 Skriv funksjonen function[xvx, yvy] = trajectory(initialSpeed, initialAngle, height).

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

Funksjonen Den skal returnere to lister: 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. Stopp denne Denne skal avslutte når høyden (y) blir mindre enn 0.



f)

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

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

Code Block
titleEksempel på kjøring
>> plotTrajectory(100,45,10)


Utskriften fra funksjonen skal se nogenlunde slik ut:
Image Added

 

 

g)

Lag funksjonen plotTrajectoryLength(initialSpeed, start, step, stop, height).

Den skal kalle trajectory med vinkler mellom 0 og pi/2 (0 og 90 grader)() med vinkler mellom start og stop, med steglengde step. Deretter skal den plotte vinkel vinklene mot lengden de korresponderende lengdene 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?

 

Code Block
titleEksempel på kjøring
>> plotTrajectoryLength(100,0,45/8,90,10)


Utskriften fra funksjonen skal se nogenlunde slik ut:

Image Added


 

 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
languagenone
function animate(initialSpeed, initialAngle, height)
	[xliste, yliste]= trajectory(initialSpeed, initialAngle, height);
	dt=0.1;
    % LiteSetter spennendetidsintervall
    % 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 iterasjon
    	hold on;                               % "frame" eller steg/dt.
    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