Fysik

Hint til matlab (igen)

19. november 2008 af Rdefik (Slettet)

Hej igen!

Jeg har tidligere lavet et indlæg om denne opgave, men er nu igen gået i stå. Jeg skal simuler bevægelsen af en figur der bevæger sig med konstant hastighedsvektor (vx,vy). Men når den passerer x = 3.25 eller x=-3.25 (og tilsvarende for y-koordinat) flyttes tilbage (passerer den x=-3.25 rykkes den til x=3.25 og omvendt) men fortsætter med hastighedsvektoren 

Jeg kan godt få lavet en if-løkke, der løser mine krav (i hvert fald første gang figuren passerer nævnte x-værdier)

Figuren skal bevæge sig gennem tidsperioden T=[0,100] med den konstante hastighedsvektor (vx,vy) Mit krav til hvornår figuren flyttes er

If vx*t>=3.25
Fill(bla bla bla) (se evt. del af filen nederst i indlæget)
end

Samt

If
Vx*t<=-3
Fill(bla bla)
End

Det virker jo fint i første omgang.

Men når figuren rykkes tilbage fortsætter den jo med at rykke, men denne gang bremses den ikke ved x=3.25 da betingelsen til vx*t ellerede engang er opfyldt.

Mit spørgsmål er: Hvordan kan jeg helt præcis fortælle matlab at det er hver gang ved selve x-værdien x=3.25 (eller x=-3.25) at figuren skal flyttes , og ikke som jeg har lavet med vx*t

Del af m-fil


for t=[0:20]
fill([[1/5 j/5 0 -j/5 -1/5 -j/5 0 j/5]+vx*t],[[0 j/5 1/5 j/5 0 -j/5 -1/5 -j/5 ]+vy*t],'r')
axis([-10 20 -10 10])
if vx*t>=3.25
fill([[(1/5) (j/5) 0 -(j/5) -(1/5) -(j/5) 0 (j/5)]-5.25+vx*t],[[0+vy*3.25/vx j/5+vy*3.25/vx 1/5+vy*3.25/vx j/5+vy*3.25/vx 0+vy*3.25/vx -j/5+vy*3.25/vx -1/5+vy*3.25/vx -j/5+vy*3.25/vx]+vy*t],'y')
axis([-10 20 -10 10])
end
if vx*t<=-3.25
fill([[(1/5) (j/5) 0 -(j/5) -(1/5) -(j/5) 0 (j/5)]+5.25+vx*t],[[0+vy*3.25/vx j/5+vy*3.25/vx 1/5+vy*3.25/vx j/5+vy*3.25/vx 0+vy*3.25/vx -j/5+vy*3.25/vx -1/5+vy*3.25/vx -j/5+vy*3.25/vx]+vy*t],'y')
axis([-10 20 -10 10])
End
end


 


Brugbart svar (0)

Svar #1
19. november 2008 af Jerslev (Slettet)

 #0: Du kan bygge din if-løkke mere logisk op ved at benytte:

for bla bla

if bla bla

else if bla bla

else bla bla

end

end

På den måde slipper du for flere if-løkker. Hver gang matlab kører din forløkke igennem bør den spørge, om betingelserne i if-løkkerne er opfyldt eller ej, så det burde virke.

Hvis du vil kigge på selve x-værdien skal du have fat i punkterne i hver ende af din figur og spørge MatLab om disse punkter er indenfor begge grænser. Hermed er det antaget, at figuren ikke ændrer sin form undervejs, for så bliver det virkelig kompliceret (så skal matlab lede efter punktet med laveste x-værdi og højeste x-værdi i hver løkke og tjekke disse).


Brugbart svar (0)

Svar #2
20. november 2008 af Lorrik (Slettet)

Jeg synes du gør det rigtigt nok, Kunne du ikke komme over problemerne ved at kræve

if vx*t>=t*3,25?

så vil du første gang kræve x = 3,25 anden gang x=2*3,25


Svar #3
21. november 2008 af Rdefik (Slettet)

#2

Dit forslag virkede desværre ikke

Nu har jeg skrevet et program (for at prøve mig frem), hvor en trekant  flyttes langs x-aksen (hastighedsvektoren er parallel med x-aksen hvorfor vy=0)

Når trekanten når x=3 flyttes den til x=-3 hvergang den passerer x=3.

Det er dog et langt program, der må kunne skrives i underfunktioner, det har jeg dog ingen idee om hvorledes jeg gør. Da slet ikke hvis jeg skal indfører et tilsvarende krav om flytning hvis figuren når -3 (den modsatte situation hvis vx nu var negativ.


for t=[0:40];
vx=0.95;
vy=0.0;
fill([-1 0 1]+vx*t,[0 1 0]+vy*t,'r')
axis([-10 10 -10 10])
if vx*t>3.0
fill([-1 -0 1]-6.0+vx*t,[0 1 0]+vy*t,'c')
axis([-10 10 -10 10])

if vx*t>9

fill([-1 -0 1]-12.0+vx*t,[0 1 0]+vy*t,'b')
axis([-10 10 -10 10])

if vx*t>15
fill([-1 -0 1]-18.0+vx*t,[0 1 0]+vy*t,'g')
axis([-10 10 -10 10])

if vx*t>21
fill([-1 -0 1]-24.0+vx*t,[0 1 0]+vy*t,'y')
axis([-10 10 -10 10])


if vx*t>27
fill([-1 -0 1]-30.0+vx*t,[0 1 0]+vy*t,'r')
axis([-10 10 -10 10])
end

if vx*t>33
fill([-1 -0 1]-36.0+vx*t,[0 1 0]+vy*t,'b')
axis([-10 10 -10 10])
end

if vx*t>39
fill([-1 -0 1]-40.0+vx*t,[0 1 0]+vy*t,'c')
axis([-10 10 -10 10])


if vx*t>45
fill([-1 -0 1]-46.0+vx*t,[0 1 0]+vy*t,'y')
axis([-10 10 -10 10])
end


end

end

end


end
end

pause(0.5)
end


 

som det ses, gentager meget de samme kommandoer. Kan man ikke rydde lidt op i dette?


Brugbart svar (0)

Svar #4
21. november 2008 af Jerslev (Slettet)

 #3: Læs mit indlæg om 'elseif'-løkker. :)


Skriv et svar til: Hint til matlab (igen)

Du skal være logget ind, for at skrive et svar til dette spørgsmål. Klik her for at logge ind.
Har du ikke en bruger på Studieportalen.dk? Klik her for at oprette en bruger.