1 Francesca Mazzia Dipartimento Interuniversitario di Matematica Università di Bari MATLAB: Integrazione Il Matlab contiene le funzioni predefinite quad, quadl e quad8 che calcolano l integrale definito di una funzione f all interno di un fissato intervallo. Tali funzioni accettano come dati in input: funz stringa contenente il nome del file in cui inserire la funzione integranda a estremo sinistro dell intervallo b estremo destro dell intervallo tol tolleranza dell errore desiderata. Il parametro di tolleranza tol ha come valore di default 10 3 e quindi può essere omesso. Hanno come dato di output: q integrale della funzione f. Nel caso la funzione non riescano a calcolare il valore dell integrale con la precisione desiderata, verrà posto q =. Vengono richiamate mediante: q = quad( funz, a, b, tol) q = quadl( funz, a, b, tol) q = quad8( funz, a, b, tol) ESEMPIO: Risolvere il problema dell approssimazione di b a (e x sin(x) + 2x + 6)dx Per risolvere tale problema possiamo costruire la function fint1.m e quindi utilizzare le function predefinite quad e quadl e quad8:
2 >> type fint1.m function y=fint1(x) y = exp(sqrt(x)).*sin(x)+2*x+6; >> quad( fint1,0,12,1e-5,1) 1.8835e+002 >> quadl( fint1,0,12,1e-5) 1.8835e+02 >> quad8( fint1,0,12,1e-5) 1.8835e+002 Possiamo fare un altro esempio: quad( sin,0,pi,1e-3) 2.0000 >> quad8( sin,0,pi,1e-3) 2.0000e+00 >> quadl( sin,0,pi,1e-3)
3 2.0000e+00 Ora vediamo come implementare la formula dei trapezi: FORMULA DEI TRAPEZI PER IL CALCOLO APPROSSIMATO DI INTEGRALI function trapezi(funz,a,b) DATI DI INPUT: funz = stringa contenente il nome della funzione integranda (definita in un omonimo file.m) a = estremo inferiore dell intervallo di integrazione b = estremo superiore dell intervallo di integrazione DATI DI OUTPUT: approssimazione dell integrale function trapezi(funz,a,b) h = (b-a); fa = feval(funz,a); fb = feval(funz,b); (fa + fb) * h/2; ESEMPI: Valutiamo gli integrali approssimati delle seguenti funzioni: fint1(x) = exp(sqrt(x)).*sin(x) + 2*x + 6 nell intervallo [0,12] fint2(x) = sqrt(1-x.*x) nell intervallo [-1,1] sin(x) nell intervallo [0,pi] e confrontiamoli con i valori esatti di tali integrali, che sono rispettivamente 188.35, pi/2 e 2.
4 >> type fint1.m function y=fint1(x) y = exp(sqrt(x)).*sin(x)+2*x+6; >> I1 = trapezi( fint1,0,12) I1 = 1.1315e+002 >> type fint2.m function y=fint2(x) y = sqrt(1-x.*x) ; >> I2 = trapezi( fint2,-1,1) I2 = 0 >> I3 = trapezi( sin,0,pi) I3 = 1.9237e-16 Implementiamo la formula di Simpson: FORMULA DI SIMPSON PER IL CALCOLO APPROSSIMATO DI INTEGRALI function simpson(funz,a,b)
DATI DI INPUT: funz = stringa contenente il nome della funzione integranda (definita in un omonimo file.m) a = estremo inferiore dell intervallo di integrazione b = estremo superiore dell intervallo di integrazione DATI DI OUTPUT: approssimazione dell integrale function simpson(funz,a,b) h = (b-a)/2; fa = feval(funz,a); fb = feval(funz,b); fc = feval(funz,(a+b)/2); (fa + fb + 4*fc) * h/3; 5 ESEMPI: >> I1 = simpson( fint1,0,12) I1 = 1.5582e+02 >> I2 = simpson( fint2,-1,1) I2 = 1.3333e+00 >> I3 = simpson( sin,0,pi)
6 I3 = 2.0944e+00 Formule composte. Le formule precedenti usano un unico polinomio interpolatore su tutto l intervallo [a, b]. Ciò presenta talvolta degli inconvenienti dovuti essenzialmente al fatto che per n grande il polinomio può presentare delle oscillazioni. Inoltre la formula diventa costosa. Le formule composte sono ottenute dividendo l intervallo [a, b] in un certo numero N di sottointervalli uguali, ed applicando in ognuno di questi una formula di quadratura di grado basso. Fissato h = b a N, e x i = a + ih, per i = 0, 1,..., N, si ha: b a f(x)dx = N 1 i=0 xi+1 x i f(x)dx, se nel sottointervallo [x i, x i+1 ] si usa la formula dei trapezi, si ha: = N 1 i=0 = b a 2N b a f(x)dx = x i+1 x i (f(x i ) + f(x i+1 )) + E(f) = 2 ( ) f(a) + 2 N 1 i=1 f(x i ) + f(b) Nel caso in cui f (x) sia continua in [a, b], si ottiene: + E(f). (b a)3 E(f) = 12N f (ξ), ξ [a, b]. 2 Vediamo come costruire la function Matlab che implementa la formula dei trapezi composta. Chiameremo tale funzione ctrap.m: FORMULA DEI TRAPEZI COMPOSTA PER IL CALCOLO APPROSSIMATO DI INTEGRALI
function ctrap(funz,a,b,n) DATI DI INPUT: funz = stringa contenente il nome della funzione integranda (definita in un omonimo file.m) a = estremo inferiore dell intervallo di integrazione b = estremo superiore dell intervallo di integrazione n = numero di sottointervalli a cui applicare la formula dei trapezi DATI DI OUTPUT: approssimazione dell integrale function ctrap(funz,a,b,n) h = (b-a)/n; x = a + [0:n]*h; (feval(funz,x(1)) + 2*sum(feval(funz,x(2:n)))... + feval(funz,x(n+1))) * h/2; 7 ESEMPIO: >> I1c = ctrap( fint1,0,12,10) I1c = 191.1843 >> I2c = ctrap( fint2,-1,1,10) I2c = 1.5185 >> I3c = ctrap( sin,0,pi,10)
8 I3c = 1.9835 Aumentando n, il numero di suddivisioni dell intervallo [a, b], si dovrebbe osservare un miglioramento dell approssimazione. Verifichiamolo per la funzione fint1: >> ctrap( fint1,0,12,10) ans = 191.1843 >> ctrap( fint1,0,12,20) ans = 189.0541 >> ctrap( fint1,0,12,30) ans = 188.6645 >> ctrap( fint1,0,12,40) ans = 188.5284