Visualizzazione dei risultati da 1 a 6 su 6

Discussione: [C++] Calcolo seno

  1. #1

    [C++] Calcolo seno

    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

  2. #2
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,362
    codice:
    for(int i=3; i<10; i+6){
    


    codice:
    for(int i=3; i<10; i+=6){
    Usi taylor? Sicuro che la formula fosse questa?
    Per gli Spartani e Sparta usa spartan

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    563
    Quote Originariamente inviata da Elizajaneface99 Visualizza il messaggio
    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

    codice:
    #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;
     }

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    563
    Quote Originariamente inviata da linoma Visualizza il messaggio
    codice:
    for(int i=3; i<10; i+6){
    


    codice:
    for(int i=3; i<10; i+=6){
    Usi taylor? Sicuro che la formula fosse questa?
    sono arrivato tardi

  5. #5
    Si, avete ragione, ora però da la risposta giusta per angoli minori o uguali a 30, ma sbaglia per gli altri

  6. #6
    codice:
        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.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2018 vBulletin Solutions, Inc. All rights reserved.