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(t i )
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(t i,x(i)) allora Eulero Esplicito Se f(t i+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
Equazione differenziale Esempio scalare 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*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)
Eulero passi piccoli Commenti 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