Esercitazioni di MATLAB: Lezione del 5 Maggio 2008¶
Controesempio di runge
Uno script per plottare l’esempio di Runge con nodi equispaziati:
File runge.m
:open:
1%
2% Codici MATLAB per il corso di Calcolo Numerico 2007/2008
3% Esercitazione n.4 (Enrico Bertolazzi)
4%
5% Esempio di Runge per verificare la NON CONVERGENZA
6% della intepolazione polinomiale.
7%
8function runge
9
10 % metto i parametri per la interpolazione polinomiale in un cell array.
11 % I numeri sono il grado del polinomio interpolante,
12 % le stringhe sono la formattazione per il comanfo plot.
13 N = { {4,'-k'}, ...
14 {8,'-g'}, ...
15 {12,'-m'} } ;
16 % sopra il grado 12 ployfit da un avvertimento perche' non riesce
17 % a calcolare "bene" il polinomio interpolante a causa del
18 % cattivo condizionamento del problema
19
20 % x contiene le ascisse per il plottaggio delle curve e dei polinomi interpolanti
21 x = -5:0.01:5;
22
23 hold on ; % da adesso in poi il comando plot scrive sulla stessa finestra
24 axis([-5 5 -1 1.1]) ; % dimensiono l'area di plottaggio
25 plot( x, rfun(x), '-r', 'LineWidth', 2 ) ; % disegna la curva y = 1/(1+x^2)
26 for k=1:length(N)
27 % N{k}{1} = grado del polinomio interpolante
28 % N{k}{2} = stringa formattazione per plot
29 xp = -5:10/N{k}{1}:5 ; % costruisco vettore delle x con i punti di interpolazione equispaziati
30 p = polyfit( xp, rfun(xp), N{k}{1} ) ; % costruisco il polinomio interpolante,
31 % fai doc polyfit per avere piu' informazioni
32 plot( x, polyval(p, x), N{k}{2} ); % plottaggio del polinomio interpolante,
33 % fai doc polyval per avere piu' informazioni
34 end
35 hold off ; % da adesso in poi il comando plot NON scrive sulla stessa finestra
36
37end
38
39function y = rfun( x )
40 y = 1 ./ ( 1 + x .^ 2 ) ;
41end
Uno script per plottare l’esempio di Runge con nodi di Chebishev:
File chebyshev.m
:open:
1%
2% Codici MATLAB per il corso di Calcolo Numerico 2007/2008
3% Esercitazione n.4 (Enrico Bertolazzi)
4%
5% Esempio di Runge con nodi di Chebyshev.
6%
7function chebyshev
8
9 % metto i parametri per la interpolazione polinomiale in un cell array.
10 % I numeri sono il grado del polinomio interpolante,
11 % le stringhe sono la formattazione per il comanfo plot.
12 N = { {4,'-k'}, ...
13 {8,'-g'}, ...
14 {12,'-m'}, ...
15 {16,'-b'} } ;
16 % sopra il grado 12 ployfit da un avvertimento perche' non riesce
17 % a calcolare "bene" il polinomio interpolante a causa del
18 % cattivo condizionamento del problema
19
20 % x contiene le ascisse per il plottaggio delle curve e dei polinomi interpolanti
21 x = -5:0.01:5;
22
23 hold on ; % da adesso in poi il comando plot scrive sulla stessa finestra
24 axis([-5 5 -0.2 1]) ; % dimensiono l'area di plottaggio
25 plot( x, rfun(x), '-r', 'LineWidth', 2 ) ; % disegna la curva y = 1/(1+x^2)
26 for k=1:length(N)
27 % N{k}{1} = grado del polinomio interpolante
28 % N{k}{2} = stringa formattazione per plot
29 xp = 5*cheb( N{k}{1} ) % costruisco vettore delle x con i punti di interpolazione equispaziati
30 p = polyfit( xp, rfun(xp), N{k}{1} ) ; % costruisco il polinomio interpolante,
31 % fai doc polyfit per avere piu' informazioni
32 plot( x, polyval(p, x), N{k}{2} ); % plottaggio del polinomio interpolante,
33 % fai doc polyval per avere piu' informazioni
34 end
35 hold off ; % da adesso in poi il comando plot NON scrive sulla stessa finestra
36
37end
38
39% fuzione di Runge
40function y = rfun( x )
41 y = 1 ./ ( 1 + x .^ 2 ) ;
42end
43
44% nodi di Chebyshev
45function x = cheb( n )
46 x = cos( [0:1/n:1] .* pi ) ;
47end
Integrazione numerica
La funzione di Runge:
File rfun.m
:open:
1%
2% Codici MATLAB per il corso di Calcolo Numerico 2007/2008
3% Esercitazione n.4 (Enrico Bertolazzi)
4%
5% Funzione di Runge
6%
7function y = rfun( x )
8 y = 1 ./ ( 1 + x .^ 2 ) ;
9end
Esercizio proposto dal prof. Ana Alonso
File alonso.m
:open:
1%
2% Codici MATLAB per il corso di Calcolo Numerico 2007/2008
3% Esercitazione n.4 (Enrico Bertolazzi)
4%
5% Esercizio proposto dal prof. Ana Alonso
6%
7function alonso( N, a, b, fun )
8
9 % nodi di interpolazione equispaziati
10 xequ = [a:(b-a)/N:b] ;
11
12 % nodi di interpolazione di Chebichev
13 xcheb = (a+b)/2 + ((b-a)/2) * cheb(N) ;
14
15 % polinomio interpolante con nodi equispaziati
16 pequ = polyfit( xequ, feval( fun, xequ), N ) ;
17
18 % polinomio interpolante con nodi di Chebichev
19 pcheb = polyfit( xcheb, feval( fun, xcheb), N ) ;
20
21 % Primitiva del polinomio interpolante con nodi equispaziati
22 Ipequ = polyint( pequ ) ;
23
24 % Primitiva del polinomio interpolante con nodi di Chebichev
25 Ipcheb = polyint( pcheb ) ;
26
27 % calcolo integrale del polinomio pequ nell'intervallo [a,b]
28 Iequ = polyval( Ipequ, b) - polyval( Ipequ, a) ;
29
30 % calcolo integrale del polinomio pcheb nell'intervallo [a,b]
31 Icheb = polyval( Ipcheb, b) - polyval( Ipcheb, a) ;
32
33 % calcolo integrale della funzione fun con il comando quad
34 Iquad = quad( fun, a, b ) ;
35
36 % stampa dei risultati
37 disp( sprintf( 'Integrale con nodi equispaziati %f', Iequ) ) ;
38 disp( sprintf( 'Integrale con nodi di Chebyshev %f', Icheb) ) ;
39 disp( sprintf( 'Integrale con funzione MATLAB quad %f', Iquad) ) ;
40 disp( sprintf( 'Errore con nodi equispaziati %f', Iequ-Iquad) ) ;
41 disp( sprintf( 'Errore con nodi di Chebyshev %f', Icheb-Iquad) ) ;
42
43end
44
45% nodi di Chebyshev nell'intervallo [-1,1]
46function x = cheb( n )
47 x = cos( [0:1/n:1] .* pi ) ;
48end
Integrazione adattativa con il metodo dei trapezi:
File trapezi.m
:open:
1%
2% Codici MATLAB per il corso di Calcolo Numerico 2007/2008
3% Esercitazione n.4 (Enrico Bertolazzi)
4%
5% Funzione che calcola con preciszione stimata epsi l'integrale della funzione fun
6%
7% fun = puntatore alla funzione da integrare
8% a = estremo sinistro di integrazione
9% b = estremo destro di integrazione
10% epsi = tolleranza
11%
12function res = trapezi( fun, a, b, epsi )
13
14 % alcuni controlli sei dati
15 if b < a ; error( 'intervallo di integrazione errato b < a!' ) ; end ;
16 if epsi < 1E-10 ; error( 'tolleranza troppo stretta (<1E-10) eo negativa' ) ; end ;
17
18 % calcolo integrale con un solo trapezio
19 n = 1 ;
20 res = trap( fun, a, b, n ) ;
21
22 for k=1:10
23 % salva l'integrale precedentemente calcolato
24 res_old = res ;
25
26 % raddoppia il numero di intervalli
27 n = n * 2 ;
28 res = trap( fun, a, b, n ) ;
29
30 % stima dell'errore con la formula di estrapolazione
31 err = (res - res_old) / 3 ;
32
33 % se l'errore stimato e' sotto la tolleranza
34 % interrompo le iterate
35 if abs( err ) < epsi ; break ; end ;
36 end
37end
38
39%
40% Calcola l'integrale approssimato con la formula dei trapezi
41%
42function res = trap( fun, a, b, n )
43 % nodi quadratura
44 h = (b-a)/n ;
45 xnode = [a+h:h:b-h] ;
46 % contributo nodi interni
47 res = h * sum(feval(fun, xnode)) ;
48 % contributo estremi
49 res = res + (h/2)*( feval( fun, a ) + feval( fun, b ) ) ;
50end
Tutti i file MATLAB in un unico archivio