Oppure

Loading
11/01/10 11:48
stella.p
Ciao a tutti, avrei bisogno di un suggerimento. Ho scritto un codice sull'approssimazione di un integrale definito e il risultato si trova, ma in ultimo la traccia chiede di stampare la sequenza degli errori ed il rapporto tra gli errori consecutivi :om: qualcuno sa darmi qualche suggerimento??? GRAZIE MILLE A TUTTI..

/*APPLICARE IL METODO DEI TRAPEZI, DELLE PARABOLE E DEI RETTANGOLI 
ALL'APPROSSIMAZIONE DELL'INTEGRALE DEFINITO e^(-x^2) NELL'INTERVALLO
[1,2]. SUDDIVIDERE PROGRESSIVAMENTE L'INTERVALLO DI INTEGRAZIONE IN 2^k 
SOTTOINTERVALLI, k=0,1,...,11. STAMPARE LA SEQUENZA DEGLI ERRORI ED IL RAPPORTO
TRA GLI ERRORI CONSECUTIVI.*/

#include <math.h>
#include <stdlib.h>
#include <stdio.h>

#define A 1 /* Estremi dell’intervallo */
#define B 2 /* di integrazione */


double funzione(double x);
double rettangoli(double(*fp)(double), double a, double b, int n_int);
double trapezi(double(*fp)(double), double a, double b, int n_int);
double simpson(double(*fp)(double), double a, double b, int n_int);


int main(void){
    
    int k, N_INT;
    
    for (k=0;k<=11;k++)
         N_INT=pow(2,k);

printf("\nL’ integrale della funzione vale :\n\n");
printf("Metodo dei rettangoli: %f\n", rettangoli(funzione, A, B, N_INT));
printf("Metodo dei trapezi : %f\n", trapezi(funzione, A, B, N_INT));
printf("Metodo simpson : %f\n", simpson(funzione, A, B, N_INT));

system ("pause"); return 0;
}

double funzione(double x){
return exp(-(x*x)); /* Funzione da integrare */
}

double rettangoli(double(*fp)(double), double a, double b, int n_int){
double h=0, value=0, i=0;
h=(b-a)/n_int;
for(i=a;i<b;i+=h) value+=h*(*fp)(i+h/2);
return value;
}

double trapezi(double(*fp)(double), double a, double b, int n_int){
double h=0, value=0, i=0;
h=(b-a)/n_int;
for(i=a;i<b;i+=h) value+=(((*fp)(i)+(*fp)(i+h))*h/2);
return value ;
}


double simpson(double(*fp)(double), double a, double b, int n_int){
double h=0, i=0, par=0, dis=0;
int j=0;
if ( n_int % 2 ) ++n_int;
h=(b-a)/n_int;
for(i=a+h;i<b;i+=h){
if(j%2==0) par+=(*fp)(i);
else dis+=(*fp)(i);
j++;
}
return h* ((*fp)(a)/3 + 4*par/3 + 2*dis/3 + (*fp)(b)/3);
}
aaa
13/01/10 16:27
Il Totem
Dovresti usare le formule di errore date per le varie casistiche. Non capisce se il problema è reperirle o usarlo (o altro):
utenti.multimania.it/GiuseppeTalo/…
aaa
13/01/10 17:49
stella.p
Il problema è che non so nè dove reperirle nè come applicarle!!!:-| tu puoi darmi qualche suggerimento??
Grazie mille..
aaa
14/01/10 15:20
Il Totem
dima.unige.it/~zappa/smid/…(8:9)-capitolo3.pdf
Nell'ultima pagina sono riportate le formule degli errori per ogni metodo. Puoi vedere K come max(f''(x)) in [a,b].
Tuttavia, mi sembra che nel tuo caso non solo sia difficile usare quelle formule (perchè dovresti ricavare le derivate della funzione), ma anche non corretto. Se il testo dice "errori consecutivi", si sta probabilmente riferendo all'errore nella valutazione dell'area in un dato intervallo.
Quindi, posto che in un intervallo [a,b], hai un punto ei in cui calcoli la funzione (che nel tuo caso coincide col punto medio dell'intervallo), possiamo stimare che il massimo errore che puoi commettere è:
E = (max(f[a,b]) - min(f[a,b])) * h
Quindi il rapporto tra l'errore precedente ed il successivo si calcola ponendo E in funzione di i, cosa di cui già disponi.
E(i) = (max(f[h*i, h*(i+1)]) - min(f[h*i, h*(i+1)])) * h
aaa