Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Approssimazione di funzioni con polinomio di Taylor
Forum - C/C++ - Approssimazione di funzioni con polinomio di Taylor

Avatar
Puffetta (Normal User)
Rookie


Messaggi: 21
Iscritto: 29/11/2009

Segnala al moderatore
Postato alle 23:54
Lunedì, 11/01/2010
Ciao!!!!!!!:)
Ho fatto questo codice per fare un programma che approssimi la funzione cos(x)con il polinomio di taylor. Solo che non riesco a far tornare il valore esatto del cos(x) dopo il ciclo. Mi sapete dire dove sbaglio?

Codice sorgente - presumibilmente C

  1. /*Scrivere un programma C++ che realizza un'approssimazione polinomiale (facendo uso del polinomio di Taylor con x0=0) della funzione
  2. cos(x) che sia accurata entro la tolleranza epsilon acquisita da tastiera.
  3. Considerare per il criterio di arresto il modulo dell'errore assoluto.*/
  4.  
  5. #include <stdio.h>
  6. #include<stdlib.h>
  7. #include <math.h>
  8.  
  9. double power(double, int);
  10. double fattoriale (double, int);
  11.  
  12. main()
  13. {
  14.       float x/*angolo in radianti da inserire*/, eps/*tolleranza*/, app=1/*risultato approssimato*/;
  15.       int x0=0, n=0;//grado polinomio
  16.       int sign=1;
  17.      
  18.       do
  19.         {
  20.             printf("\n CALCOLO DELLA FUNZIONE  cos x\n\n");
  21.            
  22.             printf("\n Di quanti radianti e' l'angolo x= ");
  23.             scanf("%lf", &x);
  24.         }
  25.       while((x>0)&&(x<(M_PI)/2));
  26.      
  27.       printf("\n\n Inserire la tolleranza richiesta   eps=");
  28.       scanf("%lf", &eps);
  29.      
  30.       do
  31.         {      
  32.                sign=-sign;
  33.                
  34.                app=sign*(app+(power(x, n)/ fattoriale(x, n)));
  35.                
  36.                n +=2;
  37.         }
  38.       while((fabs(cos(x)-app))<eps);  
  39.        
  40.       printf("\n Il risultato finale e' cos(x)=%lf \n\n", app);
  41.          
  42.       printf("\n La libreria matematica dice cos(x)=%lf\n\n", cos(x));
  43.      
  44.       system("PAUSE");
  45.       return 0;
  46. }
  47.  
  48. double power (double x, int n)
  49. {
  50.     int i; double p=1;
  51.    
  52.     for (i=1; i<=n; ++i)
  53.         p=p*x;
  54.        
  55.     return p;
  56. }
  57.  
  58.  
  59. double fattoriale (double x, int n)
  60. {
  61.        double fattoriale=1;
  62.        
  63.        for (int i=1; i<=n; i++) fattoriale=(fattoriale*i);
  64.        
  65.        return fattoriale;      
  66. }



Grazie mille in anticipo, mi siete di grande aiuto!:)

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 9:58
Martedì, 12/01/2010
per iniziare, converti app, eps e x in double, anzichè in float.

Se fai alcuni calcoli in double e poi memorizzi i risultati in float ottieni degli errori per troncamento di una consistente parte della mantissa (i double sono 64bit, di cui 52 di mantissa, mentre i float sono 32bit di cui mi pare solo 23 di mantissa).

Se questa correzione non fosse sufficiente proverò a debuggare il tuo codice, tempo permettendo.

Ciao ;)

Ultima modifica effettuata da TheKaneB il 12/01/2010 alle 10:00
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 22:00
Martedì, 12/01/2010
Ciao Puffetta!
Ho letto il tuo programma, e ho trovato alcuni piccoli errori.
Es.:
- La variabile app va inizializzata a zero.
- Per il calcolo della serie, va utilizzata questa formula:
   app+=sign*(power(x, n)/ fattoriale(n));
- ecc.

Ecco quì il programma corretto:
Codice sorgente - presumibilmente C

  1. #include <stdio.h>
  2. #include<stdlib.h>
  3. #include <math.h>
  4. #include <conio.h>
  5.  
  6. double power(double, int);
  7. double fattoriale (int);
  8.  
  9. main()
  10. {
  11.                 double x/*angolo in radianti da inserire*/, eps/*tolleranza*/, app=0.0/*risultato approssimato*/;
  12.                 int n=0;//grado polinomio
  13.                 int sign=1;
  14.  
  15.                 do
  16.                   {
  17.                                 printf("\n CALCOLO DELLA FUNZIONE  cos x\n\n");
  18.  
  19.                                 printf("\n Di quanti radianti e' l'angolo x= ");
  20.                                 scanf("%lf", &x);
  21.  
  22.                   }
  23.                 while((x<0.0)&&(x>(M_PI)/2.0));
  24.  
  25.                 printf("\n\n Inserire la tolleranza richiesta   eps=");
  26.                 scanf("%lf", &eps);
  27.  
  28.                 do
  29.                   {
  30.                                         app+=sign*(power(x, n)/ fattoriale(n));
  31.  
  32.                                         n +=2;
  33.  
  34.                                         sign=-sign;
  35.                   }
  36.                 while((fabs(cos(x)-app))>eps);
  37.  
  38.                 printf("\n Il risultato finale e' cos(x)=%f \n\n", app);
  39.  
  40.                 printf("\n La libreria matematica dice cos(x)=%f\n\n", cos(x));
  41.  
  42.                 while(!kbhit());
  43.  
  44.                 return 0;
  45. }
  46.  
  47. double power (double x, int n)
  48. {
  49.          int i; double p=1;
  50.  
  51.          for (i=1; i<=n; ++i)
  52.                   p=p*x;
  53.  
  54.          return p;
  55. }
  56.  
  57.  
  58. double fattoriale (int n)
  59. {
  60.                  double fattoriale=1;
  61.  
  62.                  for (int i=1; i<=n; i++) fattoriale=(fattoriale*i);
  63.  
  64.                  return fattoriale;
  65. }


PM Quote
Avatar
Puffetta (Normal User)
Rookie


Messaggi: 21
Iscritto: 29/11/2009

Segnala al moderatore
Postato alle 17:14
Mercoledì, 13/01/2010
grazie!!!!!!!!!

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 22:30
Mercoledì, 13/01/2010
Prego! :)

PM Quote