Oppure

Loading
11/01/10 22:54
Puffetta
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?

/*Scrivere un programma C++ che realizza un'approssimazione polinomiale (facendo uso del polinomio di Taylor con x0=0) della funzione
cos(x) che sia accurata entro la tolleranza epsilon acquisita da tastiera.
Considerare per il criterio di arresto il modulo dell'errore assoluto.*/

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

double power(double, int);
double fattoriale (double, int);

main()
{
      float x/*angolo in radianti da inserire*/, eps/*tolleranza*/, app=1/*risultato approssimato*/; 
      int x0=0, n=0;//grado polinomio
      int sign=1;
      
      do
        {
            printf("\n CALCOLO DELLA FUNZIONE  cos x\n\n");
            
            printf("\n Di quanti radianti e' l'angolo x= ");
            scanf("%lf", &x);
        }
      while((x>0)&&(x<(M_PI)/2));
      
      printf("\n\n Inserire la tolleranza richiesta   eps=");
      scanf("%lf", &eps);
      
      do
        {      
               sign=-sign;
               
               app=sign*(app+(power(x, n)/ fattoriale(x, n)));
               
               n +=2;
        }
      while((fabs(cos(x)-app))<eps);  
        
      printf("\n Il risultato finale e' cos(x)=%lf \n\n", app);
	 
      printf("\n La libreria matematica dice cos(x)=%lf\n\n", cos(x));
      
      system("PAUSE");
      return 0;
}

double power (double x, int n)
{
    int i; double p=1;
    
    for (i=1; i<=n; ++i)
        p=p*x;
        
    return p;
}


double fattoriale (double x, int n)
{
       double fattoriale=1;
       
       for (int i=1; i<=n; i++) fattoriale=(fattoriale*i);
       
       return fattoriale;       
}




Grazie mille in anticipo, mi siete di grande aiuto!:)
aaa
12/01/10 8:58
TheKaneB
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 12/01/10 9:00
aaa
12/01/10 21:00
Poggi Marco
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:
#include <stdio.h>
#include<stdlib.h> 
#include <math.h>
#include <conio.h>

double power(double, int);
double fattoriale (int);

main()
{
		double x/*angolo in radianti da inserire*/, eps/*tolleranza*/, app=0.0/*risultato approssimato*/;
		int n=0;//grado polinomio
		int sign=1;

		do
		  {
				printf("\n CALCOLO DELLA FUNZIONE  cos x\n\n");

				printf("\n Di quanti radianti e' l'angolo x= ");
				scanf("%lf", &x);

		  }
		while((x<0.0)&&(x>(M_PI)/2.0));

		printf("\n\n Inserire la tolleranza richiesta   eps=");
		scanf("%lf", &eps);

		do
		  {
					app+=sign*(power(x, n)/ fattoriale(n));

					n +=2;

					sign=-sign;
		  }
		while((fabs(cos(x)-app))>eps);

		printf("\n Il risultato finale e' cos(x)=%f \n\n", app);

		printf("\n La libreria matematica dice cos(x)=%f\n\n", cos(x));

		while(!kbhit());

		return 0;
}

double power (double x, int n)
{
	 int i; double p=1;

	 for (i=1; i<=n; ++i)
		  p=p*x;

	 return p;
}


double fattoriale (int n)
{
		 double fattoriale=1;

		 for (int i=1; i<=n; i++) fattoriale=(fattoriale*i);

		 return fattoriale;
}

aaa
13/01/10 16:14
Puffetta
grazie!!!!!!!!!
aaa
13/01/10 21:30
Poggi Marco
Prego! :)
aaa