Lezione del 8 marzo 2007¶
Metodi di Runge-Kutta
Implementazione MATLAB di un generico metodo di Runge-Kutta esplicito:
File RK.m
:open:
1%
2% Metodo di Runge-Kutta per sistemi di equazioni differenziali
3%
4% Ingresso
5% f = funzione per il sistema y'=f(x,y)
6% x0, y0 = dato iniziale del problema y(x0) = y0
7% xf = estremo superiore dell'intervallo di calcolo [x0,xf]
8% N = numero di intervalli in cui suddividere [x0,xf]
9%
10% Tableau struttura con campi
11% ns = numero di stadi per il metodo di Runge Kutta
12% a(:,:) = matrice
13% b(:) = vettore
14% c(:) = vettore
15%
16%
17% Uscita
18% x(:) = vettore soluzione delle 'x'
19% y(:) = vettore soluzione delle 'y'
20%
21function [x,y]=RK(f,x0,y0,xf,N,TABLEAU)
22 x(1) = x0 ;
23 y(1) = y0 ;
24 h = (xf-x0)/N ;
25 for k=1:N
26 % griglia spazio
27 x(k+1) = x(k) + h;
28 for s=1:TABLEAU.ns
29 % calcolo del coefficente Ks
30 ys = y(k) ;
31 for j=1:s-1
32 ys = ys + TABLEAU.a(s,j)*K(j,:) ;
33 end ;
34 % xs = x(k) + c(s)*h
35 % ys = y(k) + somma( a(s,j)* Kj)
36 xs = x(k)+TABLEAU.c(s)*h ;
37 K(s,:) = h*feval(f,xs,ys) ;
38 end;
39 % y(k+1) = y(k) + somma( b(s) * Ks)
40 y(k+1,:) = y(k,:) ;
41 for s=1:TABLEAU.ns
42 y(k+1,:) = y(k+1,:) + TABLEAU.b(s) * K(s,:) ;
43 end ;
44 end;
45end
il codice ha bisogno del TABLEAU del metodo in ingresso.
Generazione del TABLEAU per un Runge-Kutta di ordine 3:
File RK3.m
:open:
1function TABLEAU=RK3()
2 TABLEAU.ns = 3 ;
3 TABLEAU.c = [0 1/3 2/3] ;
4 TABLEAU.b = [1/4 0 3/4] ;
5 TABLEAU.a = [ 0 0 0 ; ...
6 1/3 0 0 ; ...
7 0 2/3 0 ] ;
8end
Generazione del TABLEAU per un Runge-Kutta di ordine 4:
File RK4.m
:open:
1%
2% Tableau di Butcher per Runge-Kutta
3% al quarto ordine esplicito (classico)
4%
5function TABLEAU=RK4()
6 TABLEAU.ns = 4 ;
7 TABLEAU.c = [0 1/2 1/2 1] ;
8 TABLEAU.b = [1/6 1/3 1/3 1/6] ;
9 TABLEAU.a = [ 0 0 0 0 ; ...
10 1/2 0 0 0 ; ...
11 0 1/2 0 0 ; ...
12 0 0 1 0 ] ;
13end
Generazione del TABLEAU per il metodo di Heun:
File RKHeun.m
:open:
1function TABLEAU=RKHeun()
2 TABLEAU.ns = 2 ;
3 TABLEAU.c = [0,1] ;
4 TABLEAU.b = [1/2,1/2] ;
5 TABLEAU.a = [ 0 0 ; ...
6 1 0 ] ;
7end