Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Approssimazione integrale
Forum - C/C++ - Approssimazione integrale

Avatar
stella.p (Normal User)
Newbie


Messaggi: 11
Iscritto: 31/10/2009

Segnala al moderatore
Postato alle 12:48
Lunedì, 11/01/2010
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..

Codice sorgente - presumibilmente C

  1. /*APPLICARE IL METODO DEI TRAPEZI, DELLE PARABOLE E DEI RETTANGOLI
  2. ALL'APPROSSIMAZIONE DELL'INTEGRALE DEFINITO e^(-x^2) NELL'INTERVALLO
  3. [1,2]. SUDDIVIDERE PROGRESSIVAMENTE L'INTERVALLO DI INTEGRAZIONE IN 2^k
  4. SOTTOINTERVALLI, k=0,1,...,11. STAMPARE LA SEQUENZA DEGLI ERRORI ED IL RAPPORTO
  5. TRA GLI ERRORI CONSECUTIVI.*/
  6.  
  7. #include <math.h>
  8. #include <stdlib.h>
  9. #include <stdio.h>
  10.  
  11. #define A 1 /* Estremi dell’intervallo */
  12. #define B 2 /* di integrazione */
  13.  
  14.  
  15. double funzione(double x);
  16. double rettangoli(double(*fp)(double), double a, double b, int n_int);
  17. double trapezi(double(*fp)(double), double a, double b, int n_int);
  18. double simpson(double(*fp)(double), double a, double b, int n_int);
  19.  
  20.  
  21. int main(void){
  22.    
  23.     int k, N_INT;
  24.    
  25.     for (k=0;k<=11;k++)
  26.          N_INT=pow(2,k);
  27.  
  28. printf("\nL’ integrale della funzione vale :\n\n");
  29. printf("Metodo dei rettangoli: %f\n", rettangoli(funzione, A, B, N_INT));
  30. printf("Metodo dei trapezi : %f\n", trapezi(funzione, A, B, N_INT));
  31. printf("Metodo simpson : %f\n", simpson(funzione, A, B, N_INT));
  32.  
  33. system ("pause"); return 0;
  34. }
  35.  
  36. double funzione(double x){
  37. return exp(-(x*x)); /* Funzione da integrare */
  38. }
  39.  
  40. double rettangoli(double(*fp)(double), double a, double b, int n_int){
  41. double h=0, value=0, i=0;
  42. h=(b-a)/n_int;
  43. for(i=a;i<b;i+=h) value+=h*(*fp)(i+h/2);
  44. return value;
  45. }
  46.  
  47. double trapezi(double(*fp)(double), double a, double b, int n_int){
  48. double h=0, value=0, i=0;
  49. h=(b-a)/n_int;
  50. for(i=a;i<b;i+=h) value+=(((*fp)(i)+(*fp)(i+h))*h/2);
  51. return value ;
  52. }
  53.  
  54.  
  55. double simpson(double(*fp)(double), double a, double b, int n_int){
  56. double h=0, i=0, par=0, dis=0;
  57. int j=0;
  58. if ( n_int % 2 ) ++n_int;
  59. h=(b-a)/n_int;
  60. for(i=a+h;i<b;i+=h){
  61. if(j%2==0) par+=(*fp)(i);
  62. else dis+=(*fp)(i);
  63. j++;
  64. }
  65. return h* ((*fp)(a)/3 + 4*par/3 + 2*dis/3 + (*fp)(b)/3);
  66. }


PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 17:27
Mercoledì, 13/01/2010
Dovresti usare le formule di errore date per le varie casistiche. Non capisce se il problema è reperirle o usarlo (o altro):
http://utenti.multimania.it/GiuseppeTalo/rettangoli.htm


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote
Avatar
stella.p (Normal User)
Newbie


Messaggi: 11
Iscritto: 31/10/2009

Segnala al moderatore
Postato alle 18:49
Mercoledì, 13/01/2010
Il problema è che non so nè dove reperirle nè come applicarle!!!:-| tu puoi darmi qualche suggerimento??
Grazie mille..

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 16:20
Giovedì, 14/01/2010
http://www.dima.unige.it/~zappa/smid/Analisi2-SMID(8:9)-ca ...
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


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote