Esercizio n.5 a) Dimostrare che, dato un qualunque > 0, se m’ : | I m’ + 1 I m’ | allora 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: affinché sia verificata la | I n I | per tutti gli n successivi. Dato e la formula del metodo trapezoidale supponendo che f(x) C 2 [a,b].
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 per vari gradi di precisione e confrontando il risultato 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.
Soluzione n.5a a) Indichiamo con Dato un > 0, supponiamo che m : allora, essendo, ma sappiamo che * quindi da cui e dalla (5.1) * vero a patto che f(x) C 2 [a,b] e ricordando che, in questo caso, |R T | < M/n 2 si ha che(5.1) Dunque abbiamo dimostrato che seallora 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)
Soluzione n.5b 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 Algoritmo
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 */ #include 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; 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); } double f ( double x) { double funz ; funz = exp(x); return funz; }
Soluzione n.5c 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 il risultato è I = che si ottiene con 58 intervalli di integrazione