Una equazione differenziale ordinaria (ODE) è definita da:
\[\dot{x} = f(t, x)\]
\[x : \mathbb{R} \mapsto \mathbb{R}^n\]
Informalmente, una eq. diff. ord. definisce un sistema dinamico
È sufficiente limitarsi alla derivata del primo ordine
Per esempio:
\[\ddot{x} = a t^2\]
Introducendo \(y = \dot{x}\), diventa:
\[\left(\begin{array}{c} \dot{x} \\ \dot{y} \end{array}\right) = \left(\begin{array}{c} y \\ a t^2 \end{array}\right)\]
Quando si risolve una ODE, l’obiettivo è determinare \(x\)
Ma \(x\) è una funzione! Quindi vogliamo determinarne l’andamento
In questo modo otteniamo un problema ai valori inziali:
\[\begin{align} & \dot{x} = f(t, x) \\ & x(0) = x_0 \end{align}\]
Intuitivamente, si tratta di simulare il sistema dinamico
Matlab mette a disposizione diversi risolutori di ODE
Quello che utilizzeremo principalmente è accessibile mediante:
Per quanto riguarda i parametri di ingresso/uscita:
f
è la funzione che definisce la ODE. La sua interfaccia deve essere:t
è il “tempo”x
è lo stato corrente (un vettore)dx
è la derivata dello stato corrente (un vettore colonna)Matlab mette a disposizione diversi risolutori di ODE
Quello che utilizzeremo principalmente è accessibile mediante:
Per quanto riguarda i parametri di ingresso/uscita:
tspan
è un vettore con i due estremi dell’intervallo di simulazione
tspan = [0, 3600]
x0
è lo stato inizialeT
contiene tutti gli istanti di tempo visitati dall’algoritmoX
contiene uno stato visitato
simulate
L’attrattiva principale dell’Expo 1964 fu un sottomarino
Per muoversi in verticale un sottomarino carica/scarica acqua
In questo modo esso varia la sua densità
Per precisione, il sottomarino è soggetto a tre forze principali:
Sia \(L\) il volume dell’acqua a bordo, allora abbiamo che:
La forza di gravità è data da (asse cartesiano orientato verso l’alto):
\[F_g = -g (m + \rho L)\]
La forza di galleggiamento è data da (principio di Archimede):
\[F_b = g \rho V\]
Sia \(L\) il volume dell’acqua a bordo, allora abbiamo che:
\[F_t = -\frac{1}{2} \rho A C_D\, v |v|\]
Supponiamo che l’acqua a bordo vari nel modo seguente:
In pratica, \(L\) varia secondo una funzione lineare a tratti
interp1
Tp
e Lp
che definiscono la funzione sono in es_submarine.m
Si desidera calcolare la quota del PX-8 nel tempo
\[\ddot{x} = \frac{1}{m + \rho L} (F_g + F_b + F_t)\]
Dobbiamo risolvere un problema ai valori iniziali
Per farlo, dovremo invocare:
function [T, X] = ode45(f, tspan, x0)
Quindi dobbiamo determinare:
f
che ne calcola la derivataPer definire f
è utile procedere nel solito modo:
function dx = dstate(t,x,g,V,M,rhoW,Cd,S,Tp,Lp)
% x(1) = altitudine, x(2) = velocita'
Fb = g * rhoW * V; % Galleggiamento
L = interp1(Tp, Lp, t); % Carico d'acqua
Fg = -(g*M + g*rhoW * L); % Gravità
Ft = -0.5 * x(2) * abs(x(2)) * Cd * S * rhoW;
% Calcolo le derivate
dx(1) = x(2);
dx(2) = (Fb+Fg+Ft) / (M + rhoW * L);
end
Per definire f
è utile procedere nel solito modo:
La funzione anonima potrà essere utilizzata per invocare ode45
dX = @(t, x) dstate(t,x,g,V,M,rhoW,Cd,S,Tp,Lp)';
x0 = [-5, 0]; % Stato iniziale
tspan = [0, 1800];
[t, X] = ode45(dX, tspan, x0);
dX
deve restituire un vettore colonna…dstate
A questo punto possiamo recuperare quota e velocità
Possiamo disegnare l’andamento della quota:
A questo punto possiamo recuperare quota e velocità
Ed ottenere la quota dopo 10, 20, 30 minuti:
interp1
perché la “funzione quota” x
è definita per puntiUna BMW i8 accelera a tavoletta su un rettilineo
Una BMW i8 accelera a tavoletta su un rettilineo
Supponiamo che il motore eroghi una forza costante \(F\)
Si oppone alla direzione del moto la forza di trascinamento:
\[F_t = -\frac{1}{2} \rho C_D S v |v|\]
Quindi il sistema è definito dall’ODE:
\[\ddot{x} = \frac{1}{m} (F + F_t)\]
Tutti i dati sono nel file es_bmw.m
Vogliamo riscaldare una stanza con un convettore
Possiamo modellare il sistema utilizzando un circuito RC equivalente:
Vogliamo ottenere un modello tempo-continuo
Ogni capacità si può modellare con una equazione differenziale:
\[\begin{align} & \dot{T}_a = \frac{1}{C_a} (w_{ca} - w_{aw}) && \dot{T}_w = \frac{1}{C_w} (w_{aw} - w_{wo}) \end{align}\]
Vogliamo ottenere un modello tempo-continuo
I flussi invece si calcolano mediante equazioni lineari:
\[\begin{align} & w_{ca} = \frac{1}{R_{ca}} (T_c - T_a) \\ & w_{aw} = \frac{1}{R_{aw}} (T_a - T_w) \\ & w_{wo} = \frac{1}{R_{wo}} (T_w - T_o) \\ \end{align}\]
Quindi nel complesso abbiamo le equazioni differenziali:
\[\begin{align} & \dot{T}_a = \frac{1}{C_a} (w_{ca} - w_{aw}) && \dot{T}_w = \frac{1}{C_w} (w_{aw} - w_{wo}) \\ \end{align}\]
Dove:
\[\begin{align} & w_{ca} = \frac{1}{R_{ca}} (T_c - T_a) \\ & w_{aw} = \frac{1}{R_{aw}} (T_a - T_w) \\ & w_{wo} = \frac{1}{R_{wo}} (T_w - T_o) \\ \end{align}\]
Tutti dati del problema sono disponibile ne file es_heating2.m
Nel libro di Jule Verne “Dalle Terra alla Luna”…
Durante il viaggio, la navicella è soggetta a forze gravitazionali
Esse sono regolate dalla legge di gravitazione di Newton:
\[F_{12} = -G \frac{m_1 m_2}{r_{12} \|r_{12}\|}\]
Si desidera modellare il moto della navicella
\[\ddot{x} = \frac{1}{m_s} (F_{se} + F_{sm})\]
Inoltre, assumiamo che:
La navicella deve così raggiungere la quota \(D-r_M\)
I dati del problema sono nel file es_moonshot.m
Tre serbatoi comunicano attraverso condotte
Tre serbatoi comunicano attraverso condotte
Il sistema è descritto dalle equazioni differenziali:
\[\begin{align} & \dot{P}_1 = \frac{1}{C_1} (q_{31} - q_{12}) && \dot{P}_2 = \frac{1}{C_2} (q_{12} - q_{23}) \\ & \dot{P}_2 = \frac{1}{C_3} (q_{23} - q_{31}) \end{align}\]
Con:
\[\begin{align} & q_{12} = \frac{1}{R_{12}} (P_1 - P_2) && q_{23} = \frac{1}{R_{23}} (P_2 - P_3) \\ & q_{31} = \frac{1}{R_{31}} (P_3 - P_1) \end{align}\]
Tutti i dati del problema sono nel file es_tubes.m