Cursusinhoud
Matlab Basis
Matlab Basis
Toepassing: Berekenen van 3D-Trajecten met While-Lussen
Hier leer je hoe je de trajecten van objecten die zich in de 3D-ruimte bewegen kunt berekenen, en maak je kennis met een ander aspect van programmeren: while-lussen, waarvan de unieke eigenschappen ze net zo onmisbaar maken als for-lussen en if-statements, hoewel ze minder vaak voorkomen.
Structuur van de While-lus
While-lussen lijken op for-lussen, maar het belangrijkste verschil zit in het mechanisme voor iteratiecontrole. In plaats van een vast aantal iteraties, wordt de while-lus uitgevoerd zolang de Booleaanse conditie waar is. Zo werkt het:
De Booleaanse conditie wordt eerst geëvalueerd;
Als de conditie waar is, wordt de code binnen de lus uitgevoerd;
Na het uitvoeren van de code wordt de conditie opnieuw gecontroleerd. Als deze nog steeds waar is, wordt de code opnieuw uitgevoerd. Dit gaat door zolang de conditie waar blijft;
Zodra de conditie onwaar wordt, stopt de lus en gaat het programma verder na de lus.
Deze structuur is vooral nuttig wanneer je van tevoren niet weet hoe vaak de lus moet worden uitgevoerd. De lus blijft doorgaan totdat aan een bepaalde voorwaarde is voldaan, wat het geschikt maakt voor taken waarbij het aantal iteraties afhankelijk is van dynamische factoren.
Omdat while-lussen blijven herhalen totdat de Booleaan onwaar wordt, bestaat het risico (door omstandigheden of fouten) dat de Booleaan altijd waar blijft en de while-lus oneindig blijft herhalen!
Dus als je merkt dat je programma veel langer duurt dan normaal, kun je het in Matlab stoppen door te drukken op:
ctrl
+c
;cmd
+c
.
Gebruik deze toetsencombinatie om lopende code te stoppen en de logica en code opnieuw te evalueren.
De vergelijking voor 1D-beweging met constante versnelling
In de video gebruiken we de 1D-bewegingsvergelijking:
t: tijd (in seconden);
x(t): positie van het object op tijdstip t;
xi: beginpositie van het object;
vi: beginsnelheid van het object;
a: versnelling van het object (aangenomen constant).
Dit wordt onafhankelijk toegepast op de orthogonale x-, y-, z-componenten van positie, snelheid en versnelling met behulp van componentgewijze matrixbewerkingen.
Deze vergelijking is standaard in de natuurkunde en wordt meestal algebraïsch afgeleid (iets omslachtiger, maar niet moeilijk) of door een constante versnelling tweemaal te integreren over de tijd (waarbij de resulterende constanten de beginsnelheid en beginpositie voorstellen).
Dat x, y, z orthogonaal (loodrecht) zijn, maakt het mogelijk dit op elk van deze dimensies afzonderlijk toe te passen, en tegelijkertijd kunnen we dit zien als het analyseren van een eendimensionaal geval om het begrip te vereenvoudigen.
Opdracht
Schrijf een eigen versie van het programma uit de video door de doelstellingen te begrijpen:
Importeer de begin-posities en snelheden als afzonderlijke matrices, en de objectlabels als een cell array;
Vouw deze afzonderlijk uit tot twee 3D-matrices zodat de posities (x-, y-, z-coördinaten) van elk object kunnen evolueren langs de kolommen van hun eigen 2D-laag. Doe hetzelfde voor de begin-snelheden (ook al veranderen deze niet—het blijven de begin-snelheden) om het indexeren later consistent te maken;
For-loop over de objecten zodat voor elk object de 3D-trajectorie kan worden berekend;
Bereken de trajectorie van elk object binnen een while-loop waarvan de Booleaanse waarde eerst evalueert of het object zich nog boven de grond bevindt (de z-coördinaat is ≥ 0). Pas binnen de while-loop de 1D-bewegingsvergelijking toe om de nieuwe positie te berekenen (pas deze onafhankelijk toe op de x-, y-, z-coördinaten met behulp van matrixbewerkingen). Het berekenen van de positie op ELK tijdstip mag ALLEEN afhangen van:
De begin-positie van het object;
De begin-snelheid van het object;
De geëvalueerde tijd.
Het mag niet afhangen van de vorige positie die is berekend.
Het controleren van de invoergegevens (begin-posities + snelheden) en de variabelen die deze hebben uitgevouwen tot 3D-matrices is altijd een goede manier om deze delen van het programma als bron van fouten uit te sluiten;
Beperk de for-loop tot één iteratie, of verwijder objecten 2 en 3 (gegevens en labels) uit het Excel-bestand om te zien hoe het programma presteert met één object;
Niet-parabolische trajectorieën kunnen wijzen op een probleem met de toepassing van de bewegingsvergelijking, of op foutieve programmering van componentgewijze berekeningen (denk aan punten voor vermenigvuldiging, enz.);
De begin-posities (eerste kolom van elke 2D-laag) van je 3D-trajectoriematrix moeten overeenkomen met die in het Excel-bestand;
Er mogen geen negatieve waarden zijn (elk object begon met een positieve positie en snelheid in alle x-, y-, z-richtingen);
Controleer hoe de versnelling is gedefinieerd, of probeer deze op nul te zetten. Dit zou een beweging met constante snelheid moeten opleveren, wat lijnen vormt bij het plotten (als je de bovenaanzicht van de 3D-grafiek neemt, die alleen beweging in de x-, y-richtingen toont waar de versnellingnul was, zie je hetzelfde);
Volgens ons coördinatensysteem is de zwaartekracht -9.8 m/s² (naar beneden richting de Aarde), niet +9.8.
Bedankt voor je feedback!