Integració Numèrica de funcions
En aquesta pràctica veurem com es pot aproximar la integral definida d'una funció a partir del càlcul de l'area entre la funció i l'eix x.
Exemple del càlcul de la integral d'una funció

format long e; %per veure els valors numèrics amb el màxim de precisió
N=10; %número de divisions de l'interval
h=(b-a)/N; % pas entre cada punt
x=a:h:b; % tenim N+1 punts (inclou els extrems)
%-------- fem el dibuix -------
Regla dels rectangles (suma de Riemann)
Consisteix en aproximar l'area de la funció pel rectangle definit per les imatges de 
on
. La subdivisió de l'interval
es fa amb pas
i els punts
es defineixen com
,
. Així
també satisfà que
.
Rectangles superiors i inferiors:
Si prenem
com un dels extrems de l'interval,
o
respectivament, com que la funció
de l'exemple és decreixent el màxim en l'interval s'assoleix en l'extrem inferior de l'interval, mentre que el mínim s'assoleix en l'extrem superior. AreaSup=AreaSup+(x(i+1)-x(i))*y(i); %base per altura: h*f(x(i))
AreaInf=AreaInf+(x(i+1)-x(i))*y(i+1); %base per altura: h*f(x(i+1))
fprintf('Arees calculades: Asup= %24.16e, Ainf= %24.16e \n',AreaSup,AreaInf)
Arees calculades: Asup= 1.0764828026941020e+00, Ainf= 9.1940317001461258e-01
%-------- fem el dibuix dels rectangles ------
set(gcf, 'Position', [200,200, 900, 400])
subplot(1,2,1) %superior en vermell
plot([x(i),x(i)],[0,y(i)],'r')
plot([x(i),x(i+1)],[y(i),y(i)],'r')
plot([x(i+1),x(i+1)],[0,y(i)],'r')
subplot(1,2,2) %inferior en verd
plot([x(i),x(i)],[0,y(i+1)],'g')
plot([x(i),x(i+1)],[y(i+1),y(i+1)],'g')
plot([x(i+1),x(i+1)],[0,y(i+1)],'g')
Regla dels trapezis
Consisteix en aproximar l'area de la funció pel trapezi definit per les imatges de f(x)
La fórmula general (composta) és:
on
per i=0...N, on N és el número de divisions (npunts-1) i 
AreaTrap=0; %calculem fent un bucle sobre cada trapezi
AreaTrap=AreaTrap+0.5*(x(i+1)-x(i))*(y(i)+y(i+1)); %àrea del trapezi
fprintf('Arees calculades: Asup= %24.16e, Ainf= %24.16e, ATrap= %24.16e \n',AreaSup,AreaInf,AreaTrap)
Arees calculades: Asup= 1.0764828026941020e+00, Ainf= 9.1940317001461258e-01, ATrap= 9.9794298635435719e-01
% Formula composta: (equivalent a l'anterior, però més eficient)
AreaTrapComp= ((b-a)/(2*N))*(y(1)+2*sum(y(2:end-1))+y(end));
%veiem que dona el mateix:
[AreaTrap, AreaTrapComp, AreaTrap-AreaTrapComp]
9.979429863543572e-01 9.979429863543573e-01 -1.110223024625157e-16
% error comès sobre el valor de la integral (recordem que dona 1)
fprintf('Trapezis: Error comès amb N= %d divisions er=%24.16e \n',N,er);
Trapezis: Error comès amb N= 10 divisions er= 2.0570136456427024e-03
%-------- fem el dibuix dels trapezis ------
plot([x(i),x(i)],[0,y(i)],'r')
plot([x(i),x(i+1)],[y(i),y(i+1)],'r')
plot([x(i+1),x(i+1)],[0,y(i+1)],'r')
Mètode de Simpson
Una millora notable en la precisió consisteix en aproximar l'area de la funció, per l'area calculada en aproximar cada 3 punts per un segment de paràbola (noteu que el cas dels trapezis és el mateix però aproximant per una recta cada 2 punts)
La fórmula composta és:
Obs.- Pel mètode de Simpson el múmero de divisions, N, ha de ser parell (npunts imparell !!)
AreaSimp=((b-a)/(3*N))*(y(1)+4*sum(y(2:2:(end-1)))+2*sum(y(3:2:(end-1)))+y(end));
fprintf('Arees calculades: Asup= %16.10e, Ainf= %16.10e, ATrap= %16.10e, ASimp= %16.10e \n',AreaSup,AreaInf,AreaTrap,AreaSimp)
Arees calculades: Asup= 1.0764828027e+00, Ainf= 9.1940317001e-01, ATrap= 9.9794298635e-01, ASimp= 1.0000033922e+00
fprintf('Simpson: Error comès amb N= %d divisions er=%24.16e \n',N,er);
Simpson: Error comès amb N= 10 divisions er= 3.3922209004000337e-06
Funcions del Matlab
El Matlab ja te implementada una funció trapezis: trapz
AreaTrapzMatlab = trapz(x,y); %noteu que el valor coincideix amb el càlcul anterior
er=abs(AreaTrapzMatlab-1);
fprintf('Trapz Matlab: Error comès amb N= %d, valor=%24.16e divisions er=%24.16e \n',length(x)-1,AreaTrapzMatlab,er);
Trapz Matlab: Error comès amb N= 10, valor= 9.9794298635435719e-01 divisions er= 2.0570136456428134e-03
% Obs: Si es vol millorar la precisió s'han de tenir més punts per la funció (només en
% tenim 11), per exemple si prenem els punts que fem servir per dibuixar (en tindrem 101)
AreaTrapzMatlab2 = trapz(xplot,yplot);
er=abs(AreaTrapzMatlab2-1);
fprintf('Trapz Matlab: Error comès amb N= %d, valor=%24.16e divisions er=%24.16e \n',length(x)-1,AreaTrapzMatlab2,er);
Trapz Matlab: Error comès amb N= 10, valor= 9.9997943823960755e-01 divisions er= 2.0561760392445727e-05
% També el Matlab té la funció *integral* que és un mètode de Simpson adaptatiu.
% Requereix definir la funció de forma inline o en un fitxer de funció i dona el resultat amb un error relatiu per defecte de 10^-6
AreaInt = integral(f,a,b);
fprintf('Trapz Matlab: valor= %24.16e, error comès error=%24.16e \n',AreaInt,er);
Trapz Matlab: valor= 9.9999999999999989e-01, error comès error= 1.1102230246251565e-16
Exercici 1
(by P. Gutiérrez)
Ens proposem calcular numèricament la integral
el valor exacte de la qual és
, aplicant els mètodes de trapezis i Simpson amb diferents passos d'integració i veure l'error comès en cada cas. (1.1) Calculeu els valors T1, T2, T3 obtinguts aplicant el mètode dels trapezis amb N=50,500,5000 subintervals respectivament (és a dir, 51,501,5001 punts), usant la funció trapz.
fprintf('T1=%.12f\n',T1) %amb 12 decimals i saltem linia
(1.2) L'error en el mètode dels trapezis és
. Això vol dir que si dividim el pas d'integració per 10, l'error es dividirà aproximadament per 100 (és a dir, guanyem 2 xifres decimals correctes). Per verificar aquest fet, calculeu el valor exacte I i calculeu els errors err1=|I-T1|, err2=|I-T2|, err3=|I-T3| obtinguts amb cada aproximació. A continuació, calculeu els quocients err1/err2, err2/err3 (han de ser valors propers a 100).
fprintf('err1=%.6e\n',err1) %format exponencial amb 6 decimals
fprintf('err2=%.6e\n',err2)
fprintf('err3=%.6e\n\n',err3)
(1.3) Calculeu els valors S1, S2, S3 obtinguts aplicant el mètode de Simpson amb N=50,500,5000 subintervals respectivament, aplicant el sumatori de coeficients 1,4,2,4,...,2,4,1.
S1=h1/3*(y1(1)+4*sum(y1(2:2:N))+2*sum(y1(3:2:N-1))+y1(N+1));
%no cal repetir el calcul del pas h1 i dels vectors x1,y1
S2=h2/3*(y2(1)+4*sum(y2(2:2:N))+2*sum(y2(3:2:N-1))+y2(N+1));
S3=h3/3*(y3(1)+4*sum(y3(2:2:N))+2*sum(y3(3:2:N-1))+y3(N+1));
(1.4) L'error en el mètode de Simpson és
. Això vol dir que si dividim el pas d'integració per 10, l'error es dividirà aproximadament per 10000 (és a dir, guanyem 4 xifres decimals correctes). Per verificar aquest fet, calculeu el valor exacte I i calculeu els errors err1=|I-S1|, err2=|I-S2|, err3=|I-S3| obtinguts amb cada aproximació. A continuació, calculeu els quocients err1/err2, err2/err3 (han de ser valors propers a 10000).
fprintf('err1=%.6e\n',err1)
fprintf('err2=%.6e\n',err2)
fprintf('err3=%.6e\n\n',err3)
(1.5) Per calcular l'aproximació amb el mètode de Simpson, una alternativa al sumatori és aplicar la fórmula d'extrapolació que la relaciona amb el mètode dels trapezis aplicat amb dos passos d'integració diferents: Per calcular el valor
de Simpson amb pas d'integració h, primer calculem els valors
i
de trapezis amb passos h i
respectivament, i apliquem la fórmula Useu aquesta fórmula d'extrapolació per calcular Simpson amb N=50 subintervals (ha de coincidir amb el valor S1 calculat anteriorment).
T50=trapz(x50,y50); %trapezis amb pas h
T25=trapz(x25,y25); %trapezis amb pas 2*h
S50=(4*T50-T25)/3; %formula d'extrapolacio
fprintf('S50=%.12f\n',S50)
dif=S50-S1 %comparem amb el valor S1 ja calculat amb el sumatori
dif =
3.552713678800501e-15
Exercici 2
Calculeu la integral definida
el valor exacte de la qual és
. Feu el càlcul amb: - el mètode dels trapezis amb 32 i 64 divisions i calculeu l'error absolut respecte el valor exacte.
Sol: T(32)= 2.500970952556458e-01, error= 9.709525564577381e-05
Sol: T(64)= 2.500242744345849e-01, error= 2.427443458485889e-05
- el mètode de Simpson amb 64 divisions, S(64) i el seu error
Sol: S(64)= 2.500000008275646e-01, error= 8.275645724253877e-10
- Verifiqueu que es compleix
(extrapolació de Richardson)
(c) NumFactory 2022