Fysik
Hint til matlab (igen)
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
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).
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?
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.
