Contenuto principale

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 è y' per una prima derivata, y'' 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:

y''=9y

In un problema di valore iniziale, l'ODE viene risolta partendo da uno stato iniziale. Utilizzando la condizione iniziale y0 e un periodo di tempo durante il quale deve essere ottenuta la risposta (t0,tf), 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 t=[t0,t1,t2,...,tf] e la soluzione corrispondente a ciascun passo y=[y0,y1,y2,...,yf].

Tipi di ODE

I risolutori dell'ODE in MATLAB® risolvono questi tipi di ODE di primo ordine:

  • ODE esplicite della forma y'=f(t,y).

  • ODE linearmente implicite della forma M(t,y)y'=f(t,y), dove M(t,y) è 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, y'=M1(t,y)f(t,y). 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 y' 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 ode15s e ode23t possono risolvere DAE di indice 1.

  • ODE completamente implicite della forma f(t,y,y')=0. 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

(y'1y'2y'n)=(f1(t,y1,y2,...,yn)f2(t,y1,y2,...,yn)fn(t,y1,y2,...,yn)),

quindi la funzione che codifica le equazioni restituisce un vettore con n elementi, corrispondenti ai valori di y'1,y'2,,y'n. Ad esempio, si consideri il sistema di due equazioni

{y'1=y2y'2=y1y22.

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

y1=yy2=y'y3=y''yn=y(n1).

Il risultato di queste sostituzioni è un sistema di n equazioni di primo ordine

{y'1=y2y'2=y3y'n=f(t,y1,y2,...,yn).

Ad esempio, si consideri l'ODE di terzo ordine

y'''y''y+1=0.

Utilizzando le sostituzioni

y1=yy2=y'y3=y''

si ottiene il sistema equivalente di primo ordine

{y'1=y2y'2=y3y'3=y1y31.

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

y'=f(t,y),

dove y=y1+iy2.

È 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:

yv=[Real(y)Imag(y)]fv=[Real(f(t,y))Imag(f(t,y))].

Ad esempio, se l'ODE è y'=yt+2i, è 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.

RisolutoreTipo di problemaPrecisioneQuando utilizzare
ode45Non rigidoMedio

La maggior parte delle volte. ode45 dovrebbe essere il primo risolutore da provare.

ode23Basso

ode23 può essere più efficiente di ode45 per i problemi con tolleranze approssimative o in presenza di rigidità moderata.

ode113Da basso a alto

ode113 può essere più efficiente di ode45 per i problemi con tolleranze di errore rigorose o quando la funzione ODE è costosa da valutare.

ode78Alto

ode78 può essere più efficiente di ode45 per i problemi con soluzioni semplici che richiedono un'elevata precisione.

ode89Alto

ode89 può essere più efficiente di ode78 per i problemi molto semplici, quando si integra su intervalli di tempo lunghi o quando le tolleranze sono particolarmente strette.

ode15sRigidoDa basso a medio

Provare ode15s quando ode45 non funziona o è inefficace e si sospetta che il problema sia rigido. Utilizzare anche ode15s per risolvere equazioni differenziali algebriche (DAE).

ode23sBasso

ode23s può essere più efficiente di ode15s per i problemi con tolleranze di errore approssimative. Può risolvere alcuni problemi rigidi per i quali ode15s non è efficace.

ode23s calcola il Jacobiano a ogni passo, quindi è utile fornirlo tramite odeset per massimizzare l'efficienza e la precisione.

Se è presente una matrice di massa, questa deve essere costante.

ode23tBasso

Utilizzare ode23t se il problema è solo moderatamente rigido e occorre una soluzione senza smorzamento numerico.

ode23t può risolvere equazioni differenziali algebriche (DAE).

ode23tbBasso

Come ode23s, il risolutore ode23tb potrebbe essere più efficiente di ode15s per i problemi con tolleranze di errore approssimative.

ode15iCompletamente implicitoBasso

Utilizzare ode15i per problemi completamente impliciti f(t,y,y’) = 0 e per equazioni differenziali algebriche (DAE) di indice 1.

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.m

Per 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 esempioRisolutore utilizzatoOpzioni specificateDescrizioneLink alla documentazione
amp1daeode23t
  • 'Mass'

DAE rigida: circuito elettrico con matrice di massa costante e singolare

Solve Stiff Transistor Differential Algebraic Equation
ballodeode23
  • 'Events'

  • 'OutputFcn'

  • 'OutputSel'

  • 'Refine'

  • 'InitialStep'

  • 'MaxStep'

Posizione semplice dell'evento: palla rimbalzante

ODE Event Location
batonodeode45
  • 'Mass'

ODE con matrice di massa dipendente dal tempo e dallo stato: movimento di un bastone

Solve Equations of Motion for Baton Thrown into Air
brussodeode15s
  • 'JPattern'

  • 'Vectorized'

Problema rigido di grandi dimensioni: diffusione in una reazione chimica (il Brusselator)

Solve Stiff ODEs
burgersodeode15s
  • 'Mass'

  • 'MStateDependence'

  • 'JPattern'

  • 'MvPattern'

  • 'RelTol'

  • 'AbsTol'

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
fem1odeode15s
  • 'Mass'

  • 'MStateDependence'

  • 'Jacobian'

Problema rigido con matrice di massa dipendente dal tempo: metodo degli elementi finiti

fem2odeode23s
  • 'Mass'

Problema rigido con matrice di massa costante: metodo degli elementi finiti

hb1odeode15s

Problema ODE rigido risolto su un intervallo molto lungo: reazione chimica di Robertson

hb1daeode15s
  • 'Mass'

  • 'RelTol'

  • 'AbsTol'

  • 'Vectorized'

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)
ihb1daeode15i
  • 'RelTol'

  • 'AbsTol'

  • 'Jacobian'

DAE rigida e completamente implicita: reazione chimica di Robertson

Solve Robertson Problem as Implicit Differential Algebraic Equations (DAEs)
iburgersodeode15i
  • 'RelTol'

  • 'AbsTol'

  • 'Jacobian'

  • 'JPattern'

Sistema ODE implicito: equazione di Burgers

kneeodeode15s
  • 'NonNegative'

Il "problema del ginocchio" con vincoli di non negatività

Nonnegative ODE Solution
orbitodeode45
  • 'RelTol'

  • 'AbsTol'

  • 'Events'

  • 'OutputFcn'

Posizione avanzata dell'evento: problema dei tre corpi vincolato

ODE Event Location
rigidodeode45

Problema non rigido: equazioni di Eulero per un corpo rigido senza forze esterne

Solve Nonstiff ODEs
vdpodeode15s
  • 'Jacobian'

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.

Vedi anche

| |

Argomenti

Risorse didattiche