Esercizio n.5 Dato b I f ( x)dx e la formula del metodo trapezoidale a n 1 h I n f (a ) f ( xn ) 2 f ( xi ) ; xi a ih ; xn b 2 i 1 a) Dimostrare che, dato un qualunque > 0, se m’ : | Im’ + 1 Im’ | allora m m m : I m I 1 m 1 2 1 supponendo che f(x) C 2 [a,b]. Ciò consente, prefissato un certo > 0, errore massimo assoluto voluto nella approssimazione del calcolo di I, di trovare un n sufficientemente grande da verificare la: n 2 I n 1 I n 1 n 1 affinché sia verificata la | In I | per tutti gli n successivi. Esercizio n.5 b) Si scriva un programma in C per trovare una stima di I col metodo trapezoidale e in modo che l’accuratezza sia determinabile a priori secondo il metodo descritto in a). c) Si verifichi la bontà del metodo applicandolo al calcolo dell’integrale 1 per vari gradi di precisione e confrontando il risultato I e x dx 0 con la soluzione analitica per verificare che l’errore effettivo sia compatibile con la precisione richiesta. Esercizio n.5 d) Si applichi il metodo al calcolo dell’integrale con tre cifre significative. I 10 1 sin x dx x 1,E+00 8,E-01 sin x x 6,E-01 4,E-01 2,E-01 0,E+00 -2,E-01 1 -4,E-01 2 3 4 6 7 8 9 10 Soluzione n.5a a) Indichiamo con n I n I Dato un > 0, supponiamo che m : I m1 I m allora, essendo, I m1 I m I m I m1 I m I ( I m1 I ) m m1 si ha che m m1 ma sappiamo che* n1 n2 n (n 1)2 quindi m m1 (5.1) m2 m m (m 1)2 m 2 m da cui e dalla (5.1) m m m 1 m 1 m 1 2 1 1 m 2 Dunque abbiamo dimostrato che se I m1 I m allora I m I 1 m 1 ma quest’ultima disuguaglianza è in realtà valida n > m poiché m è sempre decrescente c.v.d. Nota: la stessa vale anche per il metodo rettangolare, mentre per Simpson va sostituito l’esponente 2 con 4 nella frazione n/(n+1) che va a sua volta sostituita con n/(n+2) *vero a patto che f(x) C2[a,b] e ricordando che, in questo caso, |RT| < M/n2 Soluzione n.5b Algoritmo Leggi a, b, delta Poni n = 2; h = b - a; deltaI = 1 Poni trap0 = (funz(b) + funz(a)) * h / 2 Esegui loop la prima volta e poi finché deltaI > c1 Poni c1 = delta * (1-n^2/(n+1)^2) Poni h= (b-a)/n Poni trap = 0 Esegui loop per i = 1,2,3,...,n-1 poni trap = trap + 2*funz(a + h*i) Fine loop Poni trap = (trap + funz(a) + funz(b))*h/2 Poni deltaI = Ass(trap - trap0) Poni n = n + 1 Poni trap0 = trap Fine loop Scrivi trap0, n - 1 Fine Soluzione n.5b /* ESERCIZIO 5 programma per il calcolo numerico dell'integrale di una funzione data analiticamente, tra gli estremi a e b che, usando il metodo trapezoidale, si arresta ad un numero di intervalli tali da dare una stima con errore assoluto inferiore a un delta dato. La funzione e‘ specificata in f *** compilare con l'opzione -lm */ trap0=(f(b)+f(a))*h*0.5; do { nf=(double)n; c1=delta*(1-pow(nf/(nf+1),2)); h=(b-a)/nf; trap=0; for (i=1; i < n; i=++i) { trap = trap +f(a+h*(double)i); } trap = h*trap + (f(a)+f(b))*h*0.5; deltaI = fabs (trap - trap0); n=n+1; trap0=trap; } while (deltaI > c1) printf ("integrale = %lf \n",trap); printf ("dopo %d passi. \n", n); #include <stdio.h> #include <math.h> main() { /* dichiarazione variabili */ } int i,n; double nf; double a,b,h,delta,deltaI,c1; double trap,trap0; double f( double ); /*-------------------------*/ printf ("introdurre a, b, delta: "); fflush (stdin); scanf ("%lf,%lf,%lf", &a,&b,&delta); n=2; h=b-a; double f ( double x) { double funz ; funz = exp(x); return funz; } Soluzione n.5c 0.005 0.0005 0.00005 0.000005 5E-07 n 8 20 56 172 538 In Errore effettivo 1.721203 0.0029212 1.718678 0.0003962 1.718329 0.0000472 1.718287 0.0000052 1.718282 0.0000002 I = 1.718282 Il margine d’errore imposto è sempre compatibile ( maggiore) con quello effettivamente commesso. OK! Attenzione: le variabili nel programma devono essere in doppia precisione! Soluzione n.5d I 10 1 sin x dx x il risultato è I = 0.7127 0.0005 che si ottiene con 58 intervalli di integrazione