Professional Documents
Culture Documents
Gabriella Puppo
Integrazione numerica
%
% calcola l'accuratezza del metodo dei trapezi e del metodo di Simpson
% usando la funzione exp(x/10)*sin(x) su (-5,5)
%
f = inline('exp(x/10).*sin(x)');
exa=inline('10/101*exp(x/10)*(sin(x)-10*cos(x))');
exa_int=exa(5)-exa(-5);
n=10; nmax=8; % Fissa i parametri iniziali
fprintf(' n trapezi Simpson \n')
continua ...
Calcola l’errore su diverse griglie per il metodo dei trapezi ed il
metodo di Simpson
for k=1:nmax
trap=trapezi(f,-5,5,n);
simp=simpson(f,-5,5,n);
err_trap(k)=abs(trap - exa_int);
err_simp(k)=abs(simp - exa_int);
n=n*2; % Raddoppia il numero di intervalli
fprintf('%4.0f %12.6e %12.6e \n',n,err_trap(k),err_simp(k))
end
continua ...
Usa gli errori calcolati sulle diverse griglie per stimare l’accuratezza
per il metodo dei trapezi ed il metodo di Simpson
%stampa l'accuratezza
fprintf('\n accuratezza \n')
for k=2:nmax
acc_trap=log(err_trap(k-1)/err_trap(k))/log(2);
acc_simp=log(err_simp(k-1)/err_simp(k))/log(2);
fprintf('%4.0f %12.6e %12.6e \n',k,acc_trap,acc_simp)
end
Ottengo i seguenti risultati: >> acc_smooth
n trapezi Simpson
20 6.086964e-03 1.334895e-04
40 1.621858e-03 7.938893e-06
80 4.114187e-04 4.900996e-07
Accuratezza delle formule di 160 1.032223e-04 3.053709e-08
quadratura per la funzione: 320 2.582847e-05 1.907099e-09
f(x) = exp(x/10) * sin(x) 640 6.458547e-06 1.191728e-10
1280 1.614726e-06 7.446599e-12
2560 4.036871e-07 4.635181e-13
accuratezza
2 1.908075e+00 4.071645e+00
3 1.978968e+00 4.017791e+00
4 1.994853e+00 4.004440e+00
5 1.998720e+00 4.001111e+00
6 1.999680e+00 4.000253e+00
7 1.999920e+00 4.000329e+00
8 1.999980e+00 4.005884e+00
Se invece integro una funzione non regolare, l’accuratezza si
deteriora:
>> acc_sing
n trapezi Simpson
20 2.286208e-03 2.068921e-03
40 2.123243e-03 1.472841e-03
Accuratezza delle 80 5.738197e-04 8.744110e-05
formule di quadratura per 160 7.787410e-05 3.487619e-05
la funzione: 320 6.688622e-06 8.602118e-06
f(x) = abs( cos(x) ) 640 8.123744e-06 4.534397e-06
sull’intervallo [0,3]. 1280 1.369862e-06 5.218913e-07
2560 4.895294e-08 1.439013e-07
accuratezza
2 1.066872e-01 4.902775e-01
3 1.887600e+00 4.074146e+00
4 2.881382e+00 1.326069e+00
5 3.541363e+00 2.019479e+00
6 -2.804357e-01 9.237810e-01
7 2.568114e+00 3.119090e+00
8 4.806491e+00 1.858669e+00
Funzioni di quadratura di
Matlab
>> f=inline('log(x).^2');
>> int = quad(f,1,3)
int =
1.02917317609112
Per avere una stima del numero di operazioni che sono state
effettuate, uso un secondo argomento (opzionale) in output:
>> f=inline('log(x).^2');
>> [int, op] = quad(f,1,3)
int =
1.02917317609112
op =
25
Calcolando l’integrale due volte, con due valori diversi della tolleranza,
posso avere una stima del numero di cifre significative.
Per esempio
>> [int,c]=quad(f,1,3,1e-4)
Nella stima del primo
int =
integrale ci sono circa 5 cifre
4.20867153987319
significative,
c=
perché le prime 5 cifre
29
restano invariate abbassando
>> [int,c]=quad(f,1,3,1e-5)
la tolleranza. Confrontare
int =
con il risultato esatto:
4.20867006658840
4.20867001966441
c=
45
Visualizzare la costruzione
dell’integrale
La chiamata
>> f=inline('abs(cos(x))');
>> [int,fcn]=quad(f,0,2,1e-6) In questo caso, quadl
int = richiede più operazioni a
1.09070291894070 parità di tolleranza, e inoltre
fcn = il risultato è meno accurato,
41 infatti il risultato esatto è:
>> [int,fcn]=quadl(f,0,2,1e-6)
int =
1.09070190779511 >> exa=2-sin(2)
fcn = exa =
108 1.09070257317432
Suggerimento:
Qui devo prima disegnare un grafico delle due curve, calcolare i
punti di intersezione, stabilire come è formata la regione di
integrazione, e infine stimare l’area calcolando gli integrali
richiesti con il segno corrretto.
Esercizio 2
Calcolare l’integrale di
f(x) = |cos(x)|
sull’intervallo [0, 6] con 5 cifre decimali significative
Suggerimento:
Qui la funzione integranda non è regolare, è bene spezzare il
dominio di integrazione in modo da integrare su intervalli che non
contengano punti di discontinuità
Esercizio 3
Esercizio 4