Lezione 9
Lezione 9
Equazioni Differenziali

In questa lezione introdurremo alcuni metodi per la risoluzione di equazioni differenziali ordinarie. Implementeremo la risoluzione numerica di queste equazioni con i metodi di Eulero e di Runge-Kutta.
Per risolvere l'esercizio vedremo come è possibile costruire una classe che implementi le operazioni di algebra lineare per i vettori. Questo ci permetterà di realizzare i metodi di integrazione numerica usando una notazione vettoriale, molto simile al formalismo matematico.


ESERCIZIO 9.0 - Algebra vettoriale:
Come per l'operatore di assegnazione, visto nella Lezione 2, quasi tutti gli operatori possono venire definiti sugli elementi di una data classe. In questo esercizio costruiremo una classe VettoreLineare, derivata da Vettore, ridefinendo gli operatori di addizione e moltiplicazione per implementare in maniera compatta l'algebra vettoriale ed il prodotto scalare di due vettori.
Per verificare il corretto funzionamento degli operatori appena costruiti provate a realizzare un semplice programma che scriva a video le componenti della risultate di due forze (vettori tridimensionali) e le componenti del versore della risultante.

Brevi Richiami
Overload di operatori matematici.

Implementazione dell'overloading

ESERCIZIO 9.1 - Risoluzione tramite metodo di Eulero:
Implementare un codice per la risoluzione numerica di un'equazione differenziale descrivente il moto di un oscillatore armonico tramite il metodo di Eulero. Graficare l'andamento della posizione in funzione del tempo al variare del passo di integrazione e confrontare l'errore commesso con la soluzione esatta.
Struttureremo la soluzione del problema in modo simile a quanto fatto nelle precedenti lezioni su ricerca degli zeri e integrazione numerica:
  1. Definiamo una classe astratta FunzioneVettorialeBase con un unico metodo Eval, puramente virtuale, che dato un VettoreLineare ed un double, rappresentante il tempo, restituisce il valore della derivata prima nel punto e nell'istante considerati.
  2. Da questa classe astratta, deriviamo una classe concreta che descriva le leggi del modo di un oscillatore armonico, permettendo di definirne la frequenza, o nel construttore o con degli opportuni metodi per leggere/definire dei parametri.
  3. Definiamo una classe astratta EquazioneDifferenzialeBase che ha un unico metodo Passo, puramente virtuale, che dati il tempo t, un vettore x, il passo di integrazione h e un puntatore ad una FunzioneVettorialeBase, restituisce la una stima di del valore della posizione x al tempo t+h. Avere il tempo t come argomento permetterà in esercizi futuri (come ad esempio il 9.4) di avere forzanti esterne o parametri dipendenti dal tempo.
  4. Da questa classe astratta, deriviamo una classe concreta che implementi il metodo di Eulero.
Per testare il metodo, risolviamo l'equazione differenziale:
Equazione differenziale
con passi di integrazione da 0.1 a 0.001, mettendo in grafico il valore della x in funzione del tempo ed anche il suo errore rispetto alla soluzione esatta del problema: x=sint. Si consiglia di svolgere l'integrazione per un certo numero di periodi, in modo da vedere se l'ampiezza di oscillazione rimane costante. Integrare fino a t=70 s permette di vedere circa 10 periodi.

Brevi Richiami
Il metodo di Eulero

Struttura del programma

Cosa ci aspettiamo?


ESERCIZIO 9.2 - Risoluzione tramite Runge-Kutta (da consegnare):
Ripetere l'esercizio 9.1 con il metodo di risoluzione di equazioni differenziali di Runge-Kutta (del quarto ordine) e confrontare quindi in condizioni analoghe (t massimo e h) la stabilità dei due metodi.
Per svolgere l'esercizio, basterà realizzare una nuova classe concreta a partire da EquazioneDifferenzialeBase.

Brevi richiami
Il metodo di Runge-Kutta

Cosa ci aspettiamo?


ESERCIZIO 9.3 - Moto del pendolo (da consegnare):
Implementare la risoluzione dell'equazione del pendolo usando i metodi precedentemente implementati. Fare quindi un grafico del periodo di oscillazione e verificare che per angoli grandi le oscillazioni non sono più isocrone.

Brevi richiami
Il moto del pendolo

Calcolo del periodo



ESERCIZIO 9.4 - Oscillazione forzate e risonanza (da consegnare):
Implementare la risoluzione dell'equazione di un oscillatore armonico smorzato con forzante. Fare quindi un grafico della soluzione stazionaria in funzione della frequenza dell'oscillatore, ricostruendo la curva di risonanza.

Brevi richiami
Oscillatore armonico con forzante

ESERCIZIO 9.5 - Moto in campo gravitazionale:
Implementare la risoluzione dell'equazione del moto di un corpo in un campo gravitazionale. Verificare, nel caso del sistema Terra-Sole, che il periodo di rivoluzione della Terra intorno al Sole sia effettivamente di un anno e che l'orbita sia periodica. Calcolare quindi il rapporto tra perielio ed afelio.
Provare ad aggiungere una piccola perturbazione al potenziale gravitazionale (ad esempio un termine proporzionale ad 1/r3 nella forza) e verificare che le orbite non sono più chiuse ma formano una rosetta.

Brevi richiami
Moto in campo gravitazionale

ESERCIZIO 9.6 - Moto di una particella carica in un campo elettrico e magnetico uniforme :
Implementare la risoluzione dell'equazione del moto di una particella carica in un campo elettrico e magnetico uniforme. Disegnare la traiettoria della particella e determinarne il diametro. Se si aggiunge un campo elettrico con componente lungo l'asse x pari a Ex = 10000 V/m, in che direzione si muove ora la particella?

Brevi richiami
Moto in campo elettrico e magnetico uniformi


ESERCIZIO 9.7 - Sempre più overloading:
Implementare per la classe VettoreLineare l'overloading anche degli operatori -, /, +=, -=, *=, /=.
Realizzare un programma che, avendo in ingresso due vettori tridimensionali, a e b, restituisca le componenti di b parallele e perpendicolari ad a.

Brevi richiami
Uso di this

Proiezioni di vettori

Back to Home Page