PDA

Visualizza la versione completa : [C++] Calcolo seno


Elizajaneface99
06-02-2018, 11:50
Ciao a tutti, devo calcolare il seno di un angolo utilizzando questa formula: sin(x)=x-(1/3!)*x^3 + (1/5!)*x^5 - (1/7!)*x^7 ...

Per farlo ho fatto questo programma che in teoria mi sembra giusto, ma quando il computer lo esegue o non scrive nulla o continua il ciclo all'infinito

Ecco il programma:

#include <iostream>
#include <cmath>
using namespace std;

int fatt(int a)
{
if(a==1){return 1;}
else
return a*fatt(a-1);
}
int main()
{
float x, a, sin=0;
cout<<"Inserisci l'angolo di cui vuoi sapere il seno: ";
cin>>x;;
a = (x*M_PI)/180;
for(int i=3; i<10; i+6){
sin = sin + (1/(fatt(i)))*pow(a, i)+(1/(fatt(i+2)))*pow(a, i+2)-(1/fatt(i+4))*pow(a, i+4);
}
cout<<"Il valore del seno e': "<<a-sin<<endl;
return 0;
}

Cosa è sbagliato secondo voi? Grazie in anticipo

linoma
06-02-2018, 13:19
for(int i=3; i<10; i+6){




for(int i=3; i<10; i+=6){


Usi taylor? Sicuro che la formula fosse questa?

misterx
06-02-2018, 13:28
Ciao a tutti, devo calcolare il seno di un angolo utilizzando questa formula: sin(x)=x-(1/3!)*x^3 + (1/5!)*x^5 - (1/7!)*x^7 ...

Per farlo ho fatto questo programma che in teoria mi sembra giusto, ma quando il computer lo esegue o non scrive nulla o continua il ciclo all'infinito

Ecco il programma:

#include <iostream>
#include <cmath>
using namespace std;

int fatt(int a)
{
if(a==1){return 1;}
else
return a*fatt(a-1);
}
int main()
{
float x, a, sin=0;
cout<<"Inserisci l'angolo di cui vuoi sapere il seno: ";
cin>>x;;
a = (x*M_PI)/180;
for(int i=3; i<10; i+6){
sin = sin + (1/(fatt(i)))*pow(a, i)+(1/(fatt(i+2)))*pow(a, i+2)-(1/fatt(i+4))*pow(a, i+4);
}
cout<<"Il valore del seno e': "<<a-sin<<endl;
return 0;
}

Cosa è sbagliato secondo voi? Grazie in anticipo




#include <iostream>
#include <cmath>
using namespace std;

int fatt(int a)
{
if(a==1){return 1;}
else
return a*fatt(a-1);
}
int main()
{
float x, a, sin=0;
cout<<"Inserisci l'angolo di cui vuoi sapere il seno: ";
cin>>x;;
a = (x*M_PI)/180;
for(int i=3; i<10; i+=6){
sin = sin + (1/(fatt(i)))*pow(a, i)+(1/(fatt(i+2)))*pow(a, i+2)-(1/fatt(i+4))*pow(a, i+4);
}
cout<<"Il valore del seno e': "<<a-sin<<endl;
return 0;
}

misterx
06-02-2018, 13:29
for(int i=3; i<10; i+6){




for(int i=3; i<10; i+=6){


Usi taylor? Sicuro che la formula fosse questa?


sono arrivato tardi :)

Elizajaneface99
06-02-2018, 16:46
Si, avete ragione, ora però da la risposta giusta per angoli minori o uguali a 30, ma sbaglia per gli altri:confused:

MItaly
06-02-2018, 22:49
sin = sin + (1/(fatt(i)))*pow(a, i)+(1/(fatt(i+2)))*pow(a, i+2)-(1/fatt(i+4))*pow(a, i+4);

il seno ha un'espansione in serie a segni alternati, questa formula è ovviamente sbagliata... Perché non scrivi semplicemente il termine generale in maniera esplicita e sommi quello? (possibilmente partendo dall'ultimo termine, in modo da sommare sempre valori di ordini di grandezza non troppo lontani; senza questa accortezza rischi che gli ultimi termini vengano mangiati dalla precisione dei double)

In ogni caso, anche aggiustando la formula, con Taylor più ti allontani dal centro della tua espansione in serie, maggiore sarà l'errore. Dato però che il seno è periodico, puoi sempre scrivere una espansione in serie con una buona approssimazione nel range -pi,+pi, e poi ridurre sempre il valore che ti viene passato a quel range a colpi di fmod.

Loading