Esercitazioni di MATLAB: Lezione del 16 Maggio 2008¶
Problema proposto
Soluzione proposta
Implementazione del metodo di Eulero:
File eulero.m
:open:
1%
2% Codici MATLAB per il corso di Calcolo Numerico 2007/2008
3% Esercitazione n.5 (Enrico Bertolazzi)
4%
5% Solutore di Eulero
6%
7function [t,y] = eulero( fun, t0, y0, T, N )
8 h = T/N ; % calcola passo avanzamento
9 t = t0:h:t0+T ; % calcola vettore tempi discrtizzati
10 y(1) = y0 ; % condizione iniziale
11 for k=1:N
12 % avanzamento con la formula di eulero
13 y(k+1) = y(k) + h*feval(fun, t(k), y(k) ) ;
14 end ;
15end
Funzione per testare il solutore:
Filefun.m
:open:
1%
2% Codici MATLAB per il corso di Calcolo Numerico 2007/2008
3% Esercitazione n.5 (Enrico Bertolazzi)
4%
5% Funzione per ODE
6%
7function res = fun( t, y )
8 res = 2*y./t + t.^2 .* exp(t) ;
9end
Soluzione esatta per la funzione proposta:
File esatta.m
:open:
1%
2% Codici MATLAB per il corso di Calcolo Numerico 2007/2008
3% Esercitazione n.5 (Enrico Bertolazzi)
4%
5% Soluzione esatta per ODE
6%
7function res = esatta( t )
8 res = t.^2 .* ( exp(t) - exp(1) ) ;
9end
Programma per testare il solutore:
File checkOrder.m
:open:
1%
2% Codici MATLAB per il corso di Calcolo Numerico 2007/2008
3% Esercitazione n.5 (Enrico Bertolazzi)
4%
5% Controllo errore
6clear all
7
8Ns = { 5, 10, 20, 40, 80, 160, 320, 640 } ;
9
10hold on
11
12for k=1:length(Ns)
13 [t,y] = eulero( @fun, 1, 0, 2, Ns{k} ) ;
14 plot(t,y) ;
15 err(k) = norm(y-esatta(t),inf) ;
16end
17
18t=1:0.001:3 ;
19plot(t, esatta(t),'-r', 'LineWidth', 2 ) ;
20
21
22disp('controllo a posteriori dell''errore' ) ;
23for k=2:length(Ns)
24 disp( sprintf('Ordine stimato %f', log(err(k-1)/err(k))/log(2) ) ) ;
25end
26
27
28hold off
Tutti i file MATLAB in un unico archivio