Contenuti del Corso
Basi di Matlab
Basi di Matlab
Applicazione: Calcolo di Traiettorie 3D con Cicli While
Qui imparerai come calcolare le traiettorie degli oggetti che si muovono nello spazio 3D, e anche un altro aspetto della programmazione: i cicli while, le cui proprietà uniche li rendono tanto fondamentali quanto i cicli for e le istruzioni if, anche se vengono utilizzati meno frequentemente.
Struttura del ciclo While
I cicli while sono simili ai cicli for, ma la loro differenza principale risiede nel meccanismo di controllo dell'iterazione. Invece di un numero fisso di iterazioni, il ciclo while viene eseguito finché la condizione booleana è vera. Ecco come funziona:
La condizione booleana viene valutata per prima;
Se la condizione è vera, il codice all'interno del ciclo viene eseguito;
Dopo l'esecuzione del codice, la condizione viene nuovamente verificata. Se è ancora vera, il codice viene eseguito di nuovo. Questo continua finché la condizione rimane vera;
Quando la condizione diventa falsa, il ciclo termina e il programma prosegue dal punto successivo al ciclo.
Questa struttura è particolarmente utile quando non si conosce in anticipo quante volte il ciclo dovrà essere eseguito. Continua a eseguire finché non viene soddisfatta una certa condizione, risultando ideale per attività in cui il numero di iterazioni dipende da fattori dinamici.
Poiché i cicli while si ripetono finché la condizione booleana è falsa, esiste il rischio (per circostanza o errore) che la condizione booleana sia sempre vera e il ciclo while si ripeta all'infinito!
Quindi, se noti che il tuo programma impiega molto più tempo del solito, è consigliabile interromperlo in Matlab premendo:
ctrl
+c
;cmd
+c
.
Per interrompere il codice in esecuzione e rivalutare la logica e il codice.
L'equazione del moto 1D con accelerazione costante
Nel video, utilizziamo la equazione del moto 1D:
t: tempo (in secondi);
x(t): posizione dell'oggetto al tempo t;
xi: posizione iniziale dell'oggetto;
vi: velocità iniziale dell'oggetto;
a: accelerazione dell'oggetto (si assume costante).
Questo viene applicato indipendentemente alle componenti ortogonali x, y, z di posizione, velocità e accelerazione utilizzando operazioni matriciali per componenti.
Questa equazione è standard in fisica e solitamente viene derivata algebricamente (un po' più laborioso, ma non difficile) oppure integrando due volte nel tempo una accelerazione costante (riconoscendo che le costanti risultanti rappresentano la velocità iniziale e la posizione iniziale).
Il fatto che x, y, z siano ortogonali (perpendicolari) permette di applicare questo principio separatamente a ciascuna di queste dimensioni, e allo stesso tempo possiamo considerare questa analisi come riferita a una singola dimensione per semplificare la comprensione.
Compito
Scrivere una propria versione del programma mostrato nel video comprendendo gli obiettivi:
Importare le posizioni e le velocità iniziali come matrici separate, e le etichette degli oggetti come un array di celle;
Disporre separatamente questi dati in due matrici 3D in modo che le posizioni (coordinate x, y, z) di ciascun oggetto possano evolvere lungo le colonne del proprio strato 2D. Si può fare lo stesso per le velocità iniziali (anche se non cambiano—sono sempre le velocità iniziali) per rendere coerente l'indicizzazione successivamente;
Utilizzare un for loop sugli oggetti per calcolare la traiettoria 3D di ciascun oggetto;
Calcolare la traiettoria di ciascun oggetto all'interno di un while loop il cui Booleano valuta innanzitutto se l'oggetto è ancora sopra il suolo (la sua coordinata z è ≥ 0). All'interno del while loop, applicare l'equazione del moto 1D per calcolare la nuova posizione (applicarla alle coordinate x, y, z indipendentemente utilizzando operazioni matriciali). Il calcolo della posizione in QUALSIASI momento deve dipendere SOLO da:
La posizione iniziale dell'oggetto;
La velocità iniziale dell'oggetto;
Il tempo considerato.
Non deve dipendere dalla posizione precedente calcolata.
Verificare i dati di input (posizioni e velocità iniziali) e le variabili che hanno disposto questi dati in matrici 3D è sempre un buon modo per escludere queste parti del programma come possibili fonti di errore;
Limitare il for loop a una sola iterazione, oppure rimuovere oggetti 2 e 3 (dati e etichette) dal file Excel per vedere come il programma si comporta con un solo oggetto;
Traiettorie non paraboliche potrebbero indicare un problema nell'applicazione dell'equazione del moto, o un errore nella programmazione dei calcoli per componenti (ricordando i punti prima delle moltiplicazioni, ecc.);
Le posizioni iniziali (prima colonna di ogni strato 2D) della tua matrice delle traiettorie 3D dovrebbero essere le stesse registrate nel file Excel;
Non dovrebbero esserci valori negativi (ogni oggetto parte con posizione e velocità positive in tutte le direzioni x, y, z);
Controllare come è stata definita l'accelerazione, oppure provare a impostarla a zero. Questo dovrebbe produrre un moto a velocità costante, che dovrebbe formare linee quando viene tracciato (se si osserva la vista dall'alto del grafico 3D, che mostra solo il moto nelle direzioni x, y dove l'accelerazione era zero, si vedrà la stessa cosa);
Secondo il nostro sistema di riferimento, la gravità è -9.8 m/s² (verso il basso, verso la Terra), non +9.8.
Grazie per i tuoi commenti!