Scelta di un risolutore ODE
Equazioni differenziali ordinarie
Un'equazione differenziale ordinaria (ODE) contiene una o più derivate di una variabile dipendente y, rispetto a una singola variabile indipendente t, solitamente indicata come tempo. La notazione qui utilizzata per rappresentare le derivate di y rispetto a t è per una prima derivata, per una seconda derivata e così via. L'ordine dell'ODE è uguale alla derivata di ordine più alto di y che compare nell'equazione.
Ad esempio, questa è un'ODE di secondo ordine:
In un problema di valore iniziale, l'ODE viene risolta partendo da uno stato iniziale. Utilizzando la condizione iniziale e un periodo di tempo durante il quale deve essere ottenuta la risposta , la soluzione viene ottenuta in modo iterativo. Ad ogni passo il risolutore applica un algoritmo specifico ai risultati dei passi precedenti. Al primo passo di questo tipo, la condizione iniziale fornisce le informazioni necessarie che consentono di procedere con l'integrazione. Il risultato finale è che il risolutore dell'ODE restituisce un vettore di passi temporali e la soluzione corrispondente a ciascun passo .
Tipi di ODE
I risolutori dell'ODE in MATLAB® risolvono questi tipi di ODE di primo ordine:
ODE esplicite della forma .
ODE linearmente implicite della forma , dove è una matrice di massa non singolare. La matrice di massa può essere dipendente dal tempo o dallo stato, oppure può essere una matrice costante. Le ODE linearmente implicite comportano combinazioni lineari della prima derivata di y, che sono codificate nella matrice di massa.
Le ODE linearmente implicite possono sempre essere trasformate in una forma esplicita, . Tuttavia, specificando direttamente la matrice di massa al risolutore dell'ODE si evita questa trasformazione, che è scomoda e può risultare onerosa dal punto di vista computazionale.
Se alcuni componenti di sono assenti, le equazioni sono chiamate equazioni differenziali algebriche, o DAE, e il sistema DAE contiene alcune variabili algebriche. Le variabili algebriche sono variabili dipendenti le cui derivate non compaiono nelle equazioni. Un sistema di DAE può essere riscritto come un sistema equivalente di ODE di primo ordine derivando le equazioni per eliminare le variabili algebriche. Il numero di derivate necessarie per riscrivere una DAE come ODE è chiamato indice differenziale. I risolutori
ode15seode23tpossono risolvere DAE di indice 1.ODE completamente implicite della forma . Le ODE completamente implicite non possono essere riscritte in forma esplicita e potrebbero anche contenere alcune variabili algebriche. Il risolutore
ode15iè progettato per problemi completamente impliciti, comprese le DAE di indice 1.
Sistemi di ODE
È possibile specificare un numero qualsiasi di equazioni ODE accoppiate da risolvere e, in linea di principio, il numero di equazioni è limitato solo dalla memoria disponibile del computer. Se il sistema di equazioni presenta n equazioni
quindi la funzione che codifica le equazioni restituisce un vettore con n elementi, corrispondenti ai valori di . Ad esempio, si consideri il sistema di due equazioni
Una funzione che codifica queste equazioni è
function dy = myODE(t,y) dy(1) = y(2); dy(2) = y(1)*y(2)-2; end
ODE di ordine superiore
I risolutori dell'ODE in MATLAB risolvono solo equazioni di primo ordine. È necessario riscrivere le ODE di ordine superiore come un sistema equivalente di equazioni di primo ordine utilizzando le sostituzioni generiche
Il risultato di queste sostituzioni è un sistema di n equazioni di primo ordine
Ad esempio, si consideri l'ODE di terzo ordine
Utilizzando le sostituzioni
si ottiene il sistema equivalente di primo ordine
Il codice per questo sistema di equazioni è quindi
function dydt = f(t,y) dydt(1) = y(2); dydt(2) = y(3); dydt(3) = y(1)*y(3)-1; end
ODE complesse
Si consideri l'ODE complessa
dove .
È possibile creare un oggetto ode per rappresentare l'ODE complessa e utilizzare la funzione solve per risolverla. Quando si crea l'oggetto ode, specificare la proprietà dell'oggetto ode chiamata SeparateComplexParts come "on" e la proprietà ODEFcn come un'ODE complessa. Per maggiori informazioni, vedere Solve Complex ODE. (da R2025a)
Per risolvere un'ODE complessa, separare le parti reali e immaginarie in diversi componenti della soluzione, quindi ricombinare i risultati alla fine. La proprietà SeparateComplexParts dell'oggetto ode esegue automaticamente tale separazione quando viene specificata come "on". In alternativa, per la release R2024b di MATLAB e precedenti, è possibile eseguire questa procedura manualmente. A livello concettuale, queste equazioni mostrano come sia possibile separare le parti reali e quelle immaginarie:
Ad esempio, se l'ODE è , è possibile utilizzare il file di funzione per rappresentare l'equazione:
function f = complexf(t,y) f = y.*t + 2*i; end
Quindi, è possibile separare manualmente le parti reali e immaginarie utilizzando questo codice.
function fv = imaginaryODE(t,yv) % Construct y from the real and imaginary components y = yv(1) + i*yv(2); % Evaluate the function yp = complexf(t,y); % Return real and imaginary in separate components fv = [real(yp); imag(yp)]; end
Quando si esegue un risolutore per ottenere la soluzione, anche la condizione iniziale y0 viene separata in parti reali e parti immaginarie per fornire una condizione iniziale per ciascuna componente della soluzione.
y0 = 1+i; yv0 = [real(y0); imag(y0)]; tspan = [0 2]; [t,yv] = ode45(@imaginaryODE, tspan, yv0);
Una volta ottenuta la soluzione, combinare le componenti reali e immaginarie per ottenere il risultato finale.
y = yv(:,1) + i*yv(:,2);
Selezione del risolutore di base
ode45 funziona bene con la maggior parte dei problemi ODE e dovrebbe essere generalmente la prima scelta come risolutore. Tuttavia, ode23, ode78, ode89 e ode113 possono risultare più efficienti di ode45 per problemi con requisiti di precisione più o meno rigidi.
Alcuni problemi ODE presentano rigidità, ossia difficoltà di valutazione. La rigidità è un termine che sfugge a una definizione precisa, ma in generale si verifica quando nel problema esiste una differenza di scala. Ad esempio, se un'ODE ha due componenti della soluzione che variano su scale temporali drasticamente diverse, allora l'equazione potrebbe essere rigida. È possibile identificare un problema come rigido se i risolutori non rigidi (come ode45) non sono in grado di risolverlo o sono estremamente lenti. Se si nota che un risolutore non rigido è molto lento, provare a utilizzare invece un risolutore rigido come ode15s. Quando si utilizza un risolutore rigido, è possibile migliorare l'affidabilità e l'efficienza fornendo la matrice jacobiana o il suo pattern di sparsità.
È possibile utilizzare oggetti ode per automatizzare la selezione del risolutore in base alle proprietà del problema. In caso di dubbi sulla scelta del risolutore da utilizzare, questa tabella fornisce delle linee guida generali su quando utilizzare ciascun risolutore.
| Risolutore | Tipo di problema | Precisione | Quando utilizzare |
|---|---|---|---|
ode45 | Non rigido | Medio | La maggior parte delle volte. |
ode23 | Basso |
| |
ode113 | Da basso a alto |
| |
ode78 | Alto |
| |
ode89 | Alto |
| |
ode15s | Rigido | Da basso a medio | Provare |
ode23s | Basso |
Se è presente una matrice di massa, questa deve essere costante. | |
ode23t | Basso | Utilizzare
| |
ode23tb | Basso | Come | |
ode15i | Completamente implicito | Basso | Utilizzare |
Per dettagli e ulteriori consigli su quando utilizzare ciascun risolutore, vedere [5].
Riepilogo degli esempi e dei file ODE
Sono disponibili diversi file di esempio che costituiscono ottimi punti di partenza per la maggior parte dei problemi ODE. Per eseguire l'app Esempi di equazioni differenziali, che consente di scoprire ed eseguire facilmente gli esempi, digitare
odeexamples
Per aprire un singolo file di esempio per la modifica, digitare
edit exampleFileName.mPer eseguire un esempio, digitare
exampleFileName
Questa tabella contiene un elenco dei file di esempio ODE e DAE disponibili, nonché dei risolutori e delle opzioni che utilizzano. Sono inclusi i link per il sottoinsieme di esempi che sono pubblicati direttamente anche nella documentazione.
| File di esempio | Risolutore utilizzato | Opzioni specificate | Descrizione | Link alla documentazione |
|---|---|---|---|---|
amp1dae | ode23t |
| DAE rigida: circuito elettrico con matrice di massa costante e singolare | Solve Stiff Transistor Differential Algebraic Equation |
ballode | ode23 |
| Posizione semplice dell'evento: palla rimbalzante | ODE Event Location |
batonode | ode45 |
| ODE con matrice di massa dipendente dal tempo e dallo stato: movimento di un bastone | Solve Equations of Motion for Baton Thrown into Air |
brussode | ode15s |
| Problema rigido di grandi dimensioni: diffusione in una reazione chimica (il Brusselator) | Solve Stiff ODEs |
burgersode | ode15s |
| ODE con matrice di massa fortemente dipendente dallo stato: equazione di Burgers risolta utilizzando una tecnica di griglia mobile | Solve ODE with Strongly State-Dependent Mass Matrix |
fem1ode | ode15s |
| Problema rigido con matrice di massa dipendente dal tempo: metodo degli elementi finiti | — |
fem2ode | ode23s |
| Problema rigido con matrice di massa costante: metodo degli elementi finiti | — |
hb1ode | ode15s | — | Problema ODE rigido risolto su un intervallo molto lungo: reazione chimica di Robertson | — |
hb1dae | ode15s |
| DAE rigida e linearmente implicita derivante da una legge di conservazione: reazione chimica di Robertson | Solve Robertson Problem as Semi-Explicit Differential Algebraic Equations (DAEs) |
ihb1dae | ode15i |
| DAE rigida e completamente implicita: reazione chimica di Robertson | Solve Robertson Problem as Implicit Differential Algebraic Equations (DAEs) |
iburgersode | ode15i |
| Sistema ODE implicito: equazione di Burgers | — |
kneeode | ode15s |
| Il "problema del ginocchio" con vincoli di non negatività | Nonnegative ODE Solution |
orbitode | ode45 |
| Posizione avanzata dell'evento: problema dei tre corpi vincolato | ODE Event Location |
rigidode | ode45 | — | Problema non rigido: equazioni di Eulero per un corpo rigido senza forze esterne | Solve Nonstiff ODEs |
vdpode | ode15s |
| Equazione parametrizzabile di Van der Pol (rigida per μ elevato) | Solve Stiff ODEs |
Riferimenti
[1] Shampine, L. F. and M. K. Gordon, Computer Solution of Ordinary Differential Equations: the Initial Value Problem, W. H. Freeman, San Francisco, 1975.
[2] Forsythe, G., M. Malcolm, and C. Moler, Computer Methods for Mathematical Computations, Prentice-Hall, New Jersey, 1977.
[3] Kahaner, D., C. Moler, and S. Nash, Numerical Methods and Software, Prentice-Hall, New Jersey, 1989.
[4] Shampine, L. F., Numerical Solution of Ordinary Differential Equations, Chapman & Hall, New York, 1994.
[5] Shampine, L. F. and M. W. Reichelt, “The MATLAB ODE Suite,” SIAM Journal on Scientific Computing, Vol. 18, 1997, pp. 1–22.
[6] Shampine, L. F., Gladwell, I. and S. Thompson, Solving ODEs with MATLAB, Cambridge University Press, Cambridge UK, 2003.