Kursinnehåll
Matlab-Grunder
Matlab-Grunder
Tillämpning: Beräkning av 3D-Banor med While-Loopar
Här lär du dig att beräkna banorna 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.
While-loopens struktur
While-loopar liknar for-loopar, men deras huvudsakliga skillnad ligger i styrmekanismen 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 exekvera 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 fel) 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 kod som körs och omvärdera logiken och koden.
The Equation for 1D Motion With Constant Acceleration
In the video, we're using the 1D equation of motion:
where:
is time (in seconds);
is the position of the object at time t;
is the initial position of the object;
is the initial velocity of the object;
is the acceleration of the object (assumed to be constant).
This is applied independently to the orthogonal x, y, z components of position, velocity, and acceleration using component-wise matrix operations.
This equation is standard in physics and is usually derived algebraically (a little more tedious, but not bad) or by integrating a constant acceleration twice over time (and recognizing that the resulting constants represent initial velocity and position).
That x, y, z are orthogonal (perpendicular) allows this to be applied to each of these dimensions separately, and at the same time we can perceive this as analyzing a single-dimension to simplify understanding.
Uppgift
Skriv din egen version av programmet i videon genom att förstå målen:
Importera de initiala positionerna och hastigheterna som separata matriser, samt objektetiketterna som en cell-array;
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. Vi kan göra 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;
For-loop över objekten så att vi kan beräkna varje objekts 3D-bana;
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 ). 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 VILKEN tidpunkt som helst 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 eliminera dessa delar av programmet som felkällor;
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 registrerats 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 att 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 (nedåt mot jorden), inte .
Tack för dina kommentarer!