Soluzione di equazioni differenziali...

22
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”

Transcript of Soluzione di equazioni differenziali...

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”

• 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 esplicito

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 tempoj=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

function [xpunto]=xp1(t,x);xpunto(1)=-x(1);

• Equazione differenziale

• 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

Esatta0.50.250.1250.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.

• 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 …

Pendenza a i+1

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*rate-UAV/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