Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Tillämpning: Beräkning av 3D-Banor med While-Loopar | Visualiseringar
Matlab-Grunder
course content

Kursinnehåll

Matlab-Grunder

Matlab-Grunder

1. Grundläggande Syntax och Kodning med en Textredigerare
2. Kodningsgrunder
3. Lärande Genom Tillämpningar
4. Visualiseringar
5. Rekursion och Matrismultiplikation

book
Tillämpning: Beräkning av 3D-Banor med While-Loopar

Här får du lära dig hur man beräknar banor för objekt som rör sig i 3D-rymden, samt en annan aspekt av programmering: while-loopar, vars unika egenskaper gör dem lika grundläggande som for-loopar och if-satser, även om de inte används lika ofta.

Struktur för while-loop

While-loopar liknar for-loopar, men deras huvudsakliga skillnad ligger i kontrollmekanismen för iteration. Istället för ett fast antal upprepningar körs while-loopen så länge booleskt villkor är sant. Så här fungerar det:

  • Booleskt villkor utvärderas först;

  • Om villkoret är sant körs koden inuti loopen;

  • Efter att koden har körts kontrolleras villkoret igen. Om det fortfarande är sant körs koden igen. Detta fortsätter så länge villkoret förblir sant;

  • När villkoret blir falskt avslutas loopen och programmet fortsätter från punkten efter loopen.

Denna struktur är särskilt användbar när du inte vet i förväg hur många gånger loopen behöver köras. Den fortsätter att köras tills ett visst villkor är uppfyllt, vilket gör den utmärkt för uppgifter där antalet iterationer beror på dynamiska faktorer.

Eftersom while-loopar upprepas tills booleskt villkor är falskt, finns det en risk (av misstag eller omständighet) att booleskt villkor alltid är sant och att while-loopen upprepas för alltid!
Om du märker att ditt program tar mycket längre tid än vanligt är det en bra idé att stoppa det i Matlab genom att trycka:

  • ctrl + c;

  • cmd + c.

För att stoppa pågående kod och omvärdera logiken och koden.

Ekvationen för 1D-rörelse med konstant acceleration

I videon använder vi 1D-rörelseekvationen:

  • t: tid (i sekunder);

  • x(t): objektets position vid tidpunkt t;

  • xi: objektets initiala position;

  • vi: objektets initiala hastighet;

  • a: objektets acceleration (antas vara konstant).

Detta tillämpas oberoende på de ortogonala x, y, z-komponenterna av position, hastighet och acceleration med komponentvisa matrisoperationer.

Denna ekvation är standard inom fysik och härleds vanligtvis algebraiskt (lite mer omständligt, men inte svårt) eller genom att integrera en konstant acceleration två gånger över tid (och inse att de resulterande konstanterna representerar initialhastighet och position).

Att x, y, z är ortogonala (vinkelräta) möjliggör att detta kan tillämpas på var och en av dessa dimensioner separat, och samtidigt kan vi betrakta detta som analys av en endimensionell för att förenkla förståelsen.

Uppgift

Skriv din egen version av programmet i videon genom att förstå målen:

  1. Importera de initiala positionerna och hastigheterna som separata matriser, samt objektetiketterna som en cell-array;

  2. Vik ihop dessa separat till två 3D-matriser så att positionerna (x, y, z-koordinater) för varje objekt kan utvecklas längs kolumnerna i sitt eget 2D-lager. Gör samma sak för de initiala hastigheterna (även om de inte förändras—de är alltid de initiala hastigheterna) för att göra indexeringen konsekvent senare;

  3. For-loop över objekten så att vi kan beräkna varje objekts 3D-bana;

  4. Beräkna varje objekts bana inom en while-loop vars Boolean först utvärderar om objektet fortfarande är ovanför marken (dess z-koordinat är ≥ 0). Inom while-loopen, tillämpa 1D-rörelseekvationen för att beräkna den nya positionen (tillämpa den på x, y, z-koordinaterna oberoende med matrisoperationer). Beräkningen av positionen vid EN TIDPUNKT ska ENDAST bero på:

    • Objektets initiala position;

    • Objektets initiala hastighet;

    • Den tid som utvärderas.

Den ska inte bero på den föregående positionen som beräknats.

  • Att verifiera indata (initiala positioner + hastigheter) och de variabler som vikt ihop dessa till 3D-matriser är alltid ett bra sätt att utesluta dessa delar av programmet som felsökning;

  • Begränsa for-loopen till en iteration, eller ta bort objekt 2 och 3 (data och etiketter) från Excel-filen för att se hur ditt program fungerar med ett objekt;

  • Icke-paraboliska banor kan tyda på ett problem med hur rörelseekvationen tillämpades, eller felaktig programmering av komponentvisa beräkningar (kom ihåg punkter före multiplikation, etc.);

  • De initiala positionerna (första kolumnen i varje 2D-lager) i din 3D-banmatris ska vara samma som de som finns i Excel-filen;

  • Det ska inte finnas några negativa värden (varje objekt startade med en positiv position och hastighet i alla x, y, z-riktningar);

  • Kontrollera hur accelerationen definierades, eller försök sätta den till noll. Detta ska ge rörelse med konstant hastighet, vilket ska bilda linjer vid plottning (om du tar toppvyn av 3D-grafen, som bara visar rörelse i x, y-riktningarna där accelerationen var noll, ser du samma sak);

  • Enligt vårt koordinatsystem är gravitationen -9.8 m/s² (nedåt mot jorden), inte +9.8.

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 4. Kapitel 3

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

course content

Kursinnehåll

Matlab-Grunder

Matlab-Grunder

1. Grundläggande Syntax och Kodning med en Textredigerare
2. Kodningsgrunder
3. Lärande Genom Tillämpningar
4. Visualiseringar
5. Rekursion och Matrismultiplikation

book
Tillämpning: Beräkning av 3D-Banor med While-Loopar

Här får du lära dig hur man beräknar banor för objekt som rör sig i 3D-rymden, samt en annan aspekt av programmering: while-loopar, vars unika egenskaper gör dem lika grundläggande som for-loopar och if-satser, även om de inte används lika ofta.

Struktur för while-loop

While-loopar liknar for-loopar, men deras huvudsakliga skillnad ligger i kontrollmekanismen för iteration. Istället för ett fast antal upprepningar körs while-loopen så länge booleskt villkor är sant. Så här fungerar det:

  • Booleskt villkor utvärderas först;

  • Om villkoret är sant körs koden inuti loopen;

  • Efter att koden har körts kontrolleras villkoret igen. Om det fortfarande är sant körs koden igen. Detta fortsätter så länge villkoret förblir sant;

  • När villkoret blir falskt avslutas loopen och programmet fortsätter från punkten efter loopen.

Denna struktur är särskilt användbar när du inte vet i förväg hur många gånger loopen behöver köras. Den fortsätter att köras tills ett visst villkor är uppfyllt, vilket gör den utmärkt för uppgifter där antalet iterationer beror på dynamiska faktorer.

Eftersom while-loopar upprepas tills booleskt villkor är falskt, finns det en risk (av misstag eller omständighet) att booleskt villkor alltid är sant och att while-loopen upprepas för alltid!
Om du märker att ditt program tar mycket längre tid än vanligt är det en bra idé att stoppa det i Matlab genom att trycka:

  • ctrl + c;

  • cmd + c.

För att stoppa pågående kod och omvärdera logiken och koden.

Ekvationen för 1D-rörelse med konstant acceleration

I videon använder vi 1D-rörelseekvationen:

  • t: tid (i sekunder);

  • x(t): objektets position vid tidpunkt t;

  • xi: objektets initiala position;

  • vi: objektets initiala hastighet;

  • a: objektets acceleration (antas vara konstant).

Detta tillämpas oberoende på de ortogonala x, y, z-komponenterna av position, hastighet och acceleration med komponentvisa matrisoperationer.

Denna ekvation är standard inom fysik och härleds vanligtvis algebraiskt (lite mer omständligt, men inte svårt) eller genom att integrera en konstant acceleration två gånger över tid (och inse att de resulterande konstanterna representerar initialhastighet och position).

Att x, y, z är ortogonala (vinkelräta) möjliggör att detta kan tillämpas på var och en av dessa dimensioner separat, och samtidigt kan vi betrakta detta som analys av en endimensionell för att förenkla förståelsen.

Uppgift

Skriv din egen version av programmet i videon genom att förstå målen:

  1. Importera de initiala positionerna och hastigheterna som separata matriser, samt objektetiketterna som en cell-array;

  2. Vik ihop dessa separat till två 3D-matriser så att positionerna (x, y, z-koordinater) för varje objekt kan utvecklas längs kolumnerna i sitt eget 2D-lager. Gör samma sak för de initiala hastigheterna (även om de inte förändras—de är alltid de initiala hastigheterna) för att göra indexeringen konsekvent senare;

  3. For-loop över objekten så att vi kan beräkna varje objekts 3D-bana;

  4. Beräkna varje objekts bana inom en while-loop vars Boolean först utvärderar om objektet fortfarande är ovanför marken (dess z-koordinat är ≥ 0). Inom while-loopen, tillämpa 1D-rörelseekvationen för att beräkna den nya positionen (tillämpa den på x, y, z-koordinaterna oberoende med matrisoperationer). Beräkningen av positionen vid EN TIDPUNKT ska ENDAST bero på:

    • Objektets initiala position;

    • Objektets initiala hastighet;

    • Den tid som utvärderas.

Den ska inte bero på den föregående positionen som beräknats.

  • Att verifiera indata (initiala positioner + hastigheter) och de variabler som vikt ihop dessa till 3D-matriser är alltid ett bra sätt att utesluta dessa delar av programmet som felsökning;

  • Begränsa for-loopen till en iteration, eller ta bort objekt 2 och 3 (data och etiketter) från Excel-filen för att se hur ditt program fungerar med ett objekt;

  • Icke-paraboliska banor kan tyda på ett problem med hur rörelseekvationen tillämpades, eller felaktig programmering av komponentvisa beräkningar (kom ihåg punkter före multiplikation, etc.);

  • De initiala positionerna (första kolumnen i varje 2D-lager) i din 3D-banmatris ska vara samma som de som finns i Excel-filen;

  • Det ska inte finnas några negativa värden (varje objekt startade med en positiv position och hastighet i alla x, y, z-riktningar);

  • Kontrollera hur accelerationen definierades, eller försök sätta den till noll. Detta ska ge rörelse med konstant hastighet, vilket ska bilda linjer vid plottning (om du tar toppvyn av 3D-grafen, som bara visar rörelse i x, y-riktningarna där accelerationen var noll, ser du samma sak);

  • Enligt vårt koordinatsystem är gravitationen -9.8 m/s² (nedåt mot jorden), inte +9.8.

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 4. Kapitel 3
some-alt