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