Complementi di Matematica e Calcolo Numerico A.A. 2013-2014 Laboratorio 11 - Metodi numerici per equazioni differenziali ordinarie Cosideriamo il Problema di Cauchy: y (t) = f(t,y(t)) t I, y(t 0 ) = y 0 dove I = [t 0,t max ] R, y 0 R ed f : I R R funzione assegnata. Scegliano t n = t 0 +nh per n = 0,...N con t N t max punti equispaziati in I. Metodo di Runge-Kutta 4 A partire da y 0 si calcolino y 1, y 2,..., y N attraverso la relazione y n+1 = y n + h 6 (K 1 +2(K 2 +K 3 )+K 4 ) K 1 = f(t n,y n ) ( K 2 = f t n + h 2,y n + h ) 2 K 1 ( K 3 = f t n + h 2,y n + h ) 2 K 2 K 4 = f(t n+1,y n +hk 3 )
Il metodo di Runge-Kutta 4 (RK4) è esplicito. Esercizio 1 Si scriva una function matlab che implementi il metodo di Runge- Kutta 4 con la seguente sintassi: [T,Y] = RK4 (fun,t,y0), input: fun = f(t,y) funzione data di due variabili T = [t 0,t 1,...t N ] vettore riga dei tempi y 0 condizione iniziale del problema output: T = [t 0,t 1,...,t N ] vettore colonna dei tempi Y = [y 0,y 1,...,y N ] vettore colonna della soluzione approssimata agli istanti in T Esercizio 2 Si risolvano con il metodo di Runge-Kutta 4 i problemi di Cauchy: y (t) = 2ty 2 (t) t [0,2], Sol: y(t) = 1 y(0) = 1 1+t 2 y (t) = 25y t [0,2], y(0) = 1 Sol: y(t) = e 25t 2
con passso uniforme h = 0.01. Si disegni il grafico della soluzione approssimata a confronto con quella esatta. Si calcoli il massimo errore commesso nei nodi di approssimazione. Esercizio 3 Si consideri il problema di Cauchy y (t) = 5t 4 (1 y(t)), 0 t 5 y(0) = 6 la cui soluzione esatta è y(t) = 1+5exp( t 5 ). 1. Approssimare il problema di Cauchy con il metodo di Runge- Kutta 4. 2. Calcolare la norma infinito dell errore tra la soluzione esatta e quella approssimata in tutti i passi calcolati. Eseguire prove per h = 2 10 k, per k = 1,2,3,4 e compilare la tabella. k h errore Runge-Kutta 4 1 2 3 4 3. Dedurre dalla tabella l ordine del metodo di Runge-Kutta 4, motivando la risposta. 4. Tracciare il grafico sovrapposto della soluzione esatta (in rosso) e di quella approssimata (in blu) per k = 5. 5. Spiegare il risultato ottenuto per k = 1. 3
Sistemi di Equazioni Differenziali Ordinarie Consideriamo un sistema di equazioni differenziali ordinarie del primo ordine con condizioni iniziali del tipo: Y (t) = F(t,Y(t)) t I, Y(t 0 ) = Y 0 dove I = [t 0,t max ] R, Y 0 = (y 0 1,...,y 0 n) R n, Y : I R n, Y C 1 (I) è la funzione da determinare Y(t) = (y 1 (t),y 2 (t),...y n (t)) ed F : I R n R n è una funzione assegnata F(t,y 1,...,y n ) = (f 1 (t,y 1,...,y n ),...f n (t,y 1,...,y n ) Un esempio di sistema di questo tipo è: y 1(t) = 2y 2 +2t t [0,3] y 2(t) = y 2 y 1 +1 t t [0,3] y 1 (0) = 2 y 2 (0) = 1 (1) La cui soluzione esatta è y 1 (t) = 2e t y 2 (t) = e t +t Per risolvere un sistema di ODE del tipo sopra descritto con Matlab, possiamo utilizzare le stesse funzioni predefinite già viste nel 4
caso di equazioni scalari alle derivare ordinarie con l accortezza di utilizzare una sintassi vettoriale per le funzioni coinvolte. Ovvero per risolvere il sistema (1) utilizziamo la function ode45() nel modo seguente: F=inline( [-2*y(2)+2*t; -y(1)+y(2)+1-t], t, y ); [T,Y]=ode45(F,[0,3],[2 1]); figure(1) plot(t,2*exp(-t), g,t,exp(-t)+t, m ) title( soluzione esatta ) figure(2) plot(t,y(:,1), r,t,y(:,2), b ) title( soluzione numerica ) 3.5 soluzione esatta 3.5 soluzione numerica 3 3 2.5 2.5 2 2 1.5 1.5 1 1 0.5 0.5 0 0 0.5 1 1.5 2 2.5 3 0 0 0.5 1 1.5 2 2.5 3 Quando la funzione F è più complicata può convenire definirla con una vera e propria function matlab Frhs() e poi passarla ad ode45 attraverso un function handle @Frhs o puntatore alla funzione. Un function handle è un tipo Matlab che contiene tutte 5
le informazioni utili per poter eseguire la funzione a cui si riferisce. Nell esempio precedente definiano la function Frhs() nel file Frhs.m function dydt=frhs(t,y) dydt=[-2*y(2)+2*t; -y(1)+y(2)+1-t]; che verrà successivamente passata ad ode45 nel modo seguente: [T,Y]=ode45(@Frhs,[0,3],[2 1]); Poichè l handle viene utilizzato esattamente come se fosse il nome della function è corretta anche la seguente sintassi: [T,Y]=ode45( Frhs,[0,3],[2 1]); Se nella definizione del termine noto F compaiono dei parametri P 1,P 2 etc. (F = F(t,y,P 1,P 2,...)) per passare tali parametri alla function Frhs che la implementa, si modifica la chiamata al solutore ode45 come segue: [T,Y]=ode45(@Frhs,[to,tmax],[y01 y02],[],p1,p2); 6
Il sistema di Lorenz Il sistema di Lorenz è un sistema di tre equazioni differenziali ordinarie nonlineari che descrive in maniera semplificata il moto di un fluido. dx = σ(y x) dt t [0,T] dy = ρx xz y dt t [0,T] dz = xy βz dt t [0,T] x(0) = x 0, y(0) = y 0, z(0) = z 0 Supponiamo che i parametri assumano i seguenti valori: σ ρ β T x 0 y 0 z 0 10 28 8/3 200 1 0 0 Risolviamo il sistema di Lorenz con il risolutore Matlab ode45. Prima di tutto dobbiamo costruire una function che implementa il termine noto del sistema. function dydt=lor_fun(t,y,sigma,beta,rho) dydt(1)=sigma*(y(2)-y(1)); dydt(2)=rho*y(1)-y(1)*y(3)-y(2); dydt(3)=y(1)*y(2)-beta*y(3); dydt=dydt ; 7
Poi costruiamo uno script-file che esegue i seguenti comandi: % CONDIZIONI INIZIALI x0=1; y0=0; z0=0; v0=[x0 y0 z0] ; % PARAMETRI sigma=10; beta=8/3; rho=28; % SOLUZIONE [t,y]=ode45(@lor_fun,[0 200],v0,[],sigma,beta,rho); % GRAFICO plot3(y(:,1),y(:,2),y(:,3)) xlabel( x, Fontsize,14); ylabel( y, Fontsize,14); zlabel( z, Fontsize,14) 8