Soluzione di equazioni differenziali ordinarie

Soluzione di equazioni differenziali
ordinarie
• Come riferimento consideriamo una singola equazione
differenziale del primo ordine
• Considereremo i seguenti metodi:
– Eulero esplicito
– Eulero implicito
– Runge-Kutta
– Cenni su metodi “stiff stable”
Metodo di Eulero esplicito
• L’incognita del problema è la funzione x(t)
• La soluzione numerica sarà rappresentata da un vettore
di punti campionati nel tempo: x(ti)
Metodo di Eulero
• Per costruire il metodo numerico più semplice possiamo
approssimare la derivata prima con il rapporto
incrementale:
• Il termine Δt rappresenta il salto nel tempo (passo) e
come vedremo rappresenta il parametro algoritmico su
cui abbiamo possibilità di fare scelte.
• L’equazione differenziale si trasforma in:
Metodo di Eulero
• Con pochi passaggi algebrici si può ricavare la formula
generica per l’algoritmo di Eulero:
• Resta da stabilire come valutare f.
– Se f(ti,x(i)) allora Eulero Esplicito
– Se f(ti+1,x(i+1)) allora Eulero Implicito
• Esplicito: la formula fornisce direttamente x(i+1)
• Implicito: Si deve risolvere una equazione algebrica in x
(i+1). (ovviamente più oneroso)
Implementazione del metodo di Eulero
esplicito
function [t,x]=eulero(effe,dt,t0,tf,x0,camp);
%effe nome secondo membro
%dt passo nel tempo
%t0 tempo iniziale
%tf tempo finale
%x0 cndizione a t0
%camp campionamento
%sono conservati dati ogni camp unità di tempo
j=1;
t(j)=t0;
x(j,:)=x0;
old=x0;
tempo=t0;
while t(j)<tf
while tempo<j*camp
new=old+dt*feval(effe,tempo,old);
tempo=tempo+dt;
old=new;
end
j=j+1;
t(j)=tempo;
x(j,:)=new;
end
Esempio scalare
• Equazione differenziale
function [xpunto]=xp1(t,x);
xpunto(1)=-x(1);
• Dopo aver immesso la funzione rappresentativa del
secondo membro possiamo integrare:
>>[t x]=eulero('xp1',0.5,0,10,[1],0.5);
>>plot(t,x,’*’)
Interpretazione del metodo di Eulero
• Possiamo partire dall’espansione in serie di Taylor della
funzione x(t) al generico tempo t.
• Se trascuriamo termini superiore al quadratico:
Pendenza a i
Interpretazione del metodo di Eulero
• E’ evidente che al variare di Dt varia la qualità della
approssimazione della soluzione esatta.
• Consideriamo l’equazione differenziale:
• Al variare della CI
si ha la famiglia
a destra
Interpretazione del metodo di Eulero
• Il risultato dell’integrazione numerica con Δt=0.5
Interpretazione del metodo di Eulero
• Il risultato dell’integrazione numerica con vari Δt
*
*
*
*
Esatta
0.5
0.25
0.125
0.0625
Stabilità numerica
• L’integrazione dell’equazione simile a quella usata implica
che:
• Questa relazione converge alla giusta soluzione se:
Stabilità numerica
• Ovvero se
• Altrimenti la soluzione diverge, il metodo numerico è
instabile.
Eulero implicito
• L’accuratezza è identica a quella di Eulero esplicito
• Le proprietà di stabilità nettamente migliori.
Pendenza a i+1
• La precedente equazione contiene l’incognita x(i+1)
anche in f. Si deve risolvere una equazione (in genere
nonlineare) in x(i+1) del tipo:
• Si può usare Newton.
– Algoritmo più oneroso ma …
Stabilità Eulero implicito
• Nel caso di Eulero implicito si può facilmente dimostrare
che:
• L’algoritmo converge sempre alla giusta soluzione, ovvero
è stabile indipendentemente dal valore di Δt.
• Algoritmi di Eulero:
– Pregio: semplicità
– Difetto: scarsa accuratezza con Δt ragionevoli
– In genere Δt variabile e non costante
Dinamica del CSTR
• Salvate in un file chiamato parametri.m il valore dei
parametri
k0=9703*3600;
DeltaH=5960;
Eatt=11843;
rhocp=500;
UA=150;
R=1.987;
F=1;
V=1;
Cain=10;
Tin=298;
Tj=298;
Dinamica del CSTR
• Il secondo membro delle due equazioni differenziali che
rappresenta il CSTR diabatico lo implementate nella
funzione cstr.m
function xdot=cstr(t,x)
Ca=x(1);
Temp=x(2);
parametri;
FV=F/V;
UAV=UA/V;
rate=k0*exp(-Eatt/R/Temp)*Ca;
dcadt=FV*(Cain-Ca)-rate;
dTdt=FV*(Tin-Temp)+DeltaH/rhocp*rateUAV/rhocp*(Temp-Tj);
xdot(1)=dcadt;
xdot(2)=dTdt;
%xdot=xdot'; rimuovere % per ode45
Dinamica del CSTR
• Per effettuare l’integrazione digitare
>>x0=[5,380];
>>[t x]=eulero('cstr',0.01,0,10,x0);
>>plot(t,x(:,1))
>>figure
>>plot(t,x(:,2))
Migliorare l’accuratezza
• Per migliorare l’accuratezza a parità di passo nel tempo
si può fare uso dei metodi di Runge-Kutta
• In questo caso il miglioramento deriva da una migliore
approssimazione della pendenza.
• Non esiste un algoritmo di RK ma piuttosto una classe di
algoritmi caratterizzati da accuratezze diverse.
• L’idea di base è che per valutare la pendenza si fa una
specie di media nell’intervallo dello step.
Migliorare l’accuratezza
• Uno semplice step (0.5) alla Eulero
Migliorare l’accuratezza
• Uno step (0.5) alla Eulero e l’analogo alla RK 2
RK II e IV ordine
• L’algoritmo per RK del II ordine:
• Analogamente è possibile costruire algoritmi di
accuratezza via via crescente.
• In Matlab sono disponibili due integratori alla RK ode23
e ode34:
>>[t,x]=ode45(‘cstr’,[t0,tf],x0)
Commenti
• Eulero passi piccoli
• RK passi via via crescenti al crescere dell’ordine.
• In genere il passo è di dimensione variabile
• Problemi stiff: Il modello contiene più tempi
caratteristici molto diversi tra loro.
– Il tempo più breve detta il passo di tempo da usare.
– Perché non si arrivi a passi troppo piccoli si devono usare algoritmi
impliciti (stiff stable)
– Sono disponibili in Matlab algoritmi stiff stable:
ode15s, ode23s