Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2012
    Messaggi
    18

    [c++] Calcolo seno con approssimazione desiderata

    Salve,
    ho un problema nel costruire l'algoritmo che mi permette di ricavare la funzione seno come somma della serie di Taylor.
    Vi posto il testo della prova:

    Assegnati l'argomento x del seno in radianti e l'approssimazione epsilon desiderata piccola a piacere ed immesse entrambe in ingresso, determinare il sen(x) come somma della serie di Taylor.
    [Sviluppandola viene : sen(x) = x - (x^3)/3! + (x^5)/5! - (x^7)/7! + (x^9)/9! - (x^11)/11! +... ]
    In particolare si progetti e si sviluppi una funzione per la costruzione del fattoriale di n, la cui dichiarazione è la seguente :
    unsigned long fattoriale (unsigned long n) {}

    Tale funzione dovrà essere richiamata per il calcolo del seno.
    Lo studente focalizzi la sua attenzione sul numero di iterazioni che vengono effettuate prima di raggiungere l'approssimazione desiderata e stampi il valore della somma della serie per ogni iterazione.
    Effettui inoltre una comparazione fra il valore della funzione trigonometrica ottenuta con il suo algoritmo e quella ottenuta includendo la libreria matematica corrispondente.
    Infine calcoli e stampi l'errore percentuale relativo ottenuto scegliendo come valore quello ottenuto dalla funzione trigonometrica calcolata dal proprio algoritmo.

  2. #2
    Ok, che problemi incontri esattamente?
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2012
    Messaggi
    18

    [c++] Seno

    Il codice che ho scritto finora è questo :
    Codice PHP:
    #include <iostream> 
    #include <stdlib.h> 
    #include <cmath> 
    using namespace std;
    unsigned long fattoriale (unsigned long ); //Prototipo della funzione fattoriale 
    int main () 
    double xepsilonfattpotenze_x
     
    cout << "Inserire un valore in radianti per l'argomento del seno : "
    cin >> x
    double termine=xsomma=x
    cout <<"Inserire il valore di epsilon compreso tra 0 e 1 : ";
    cin >> epsilon
    while ((
    fabs(termine))> (epsilon*(fabs(somma)))){ 
    for(
    int j=3j<6j+=2){ // incrementa j da 3 a 6 con passi di 2 
    potenze_x pow (x,j); 
    fatt fattoriale(j); 
    termine potenze_x * (1/fatt); 
    somma += termine
    cout << "iterazione # " <<j<<"\n"
    cout << " valore parziale " << somma << endl
      } 

    cout <<"\nvalore finale " << somma << endl
    cout << "\nvalore calcolato con la funzione di libreria " << sin(x) << endl
    cout << "\nerrore computato in percentuale " << "\n " <<((sin(x) - somma) /sin(x) )* 100 << endl 
    system("Pause"); 
    return 
    0
    }
     
    //Definisco la funzione fattoriale 
    unsigned long fattoriale (unsigned long n

    unsigned long fatt 1
    for (
    int i=1i<=ni++) 
    fatt *= i
    return 
    fatt



    Il problema è che così facendo non riesco a sommare i termini della serie con il segno appropriato (x-x^3/3! +...), dovrei far variare j in modo tale da avere una potenza col segno positivo e l'altra con il segno negativo e questo mi risulta difficile.

  4. #4
    Puoi risolvere in più maniere... la più semplice può essere:
    codice:
    if((j-1)/2%2)
        termine*=-1;
    somma += termine;
    ... a te capire cosa fa questo codice.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2012
    Messaggi
    18
    if((j-1)/2%2)
    termine*=-1;
    somma += termine;

    suppongo j=3 --> j-1= 2; 2/2 = 1; 1%2 è diverso da zero
    suppongo j=5 --> j-1 = 4 ; 4/2 = 2 ; 2%2 =0
    se il resto della divisione per 2 è diverso da zero, li somma negativamente?
    Praticamente prende gli indici di posto dispari?
    Non si dovrebbe confrontare la condizione con zero?
    es: if((j-1)/2%2 ==0)
    termine*=1;
    else
    termine *=-1;

    somma += termine;

  6. #6
    Originariamente inviato da Miss_Joy
    if((j-1)/2%2)
    termine*=-1;
    somma += termine;

    suppongo j=3 --> j-1= 2; 2/2 = 1; 1%2 è diverso da zero
    suppongo j=5 --> j-1 = 4 ; 4/2 = 2 ; 2%2 =0
    se il resto della divisione per 2 è diverso da zero, li somma negativamente?
    Praticamente prende gli indici di posto dispari?
    Esatto.
    Non si dovrebbe confrontare la condizione con zero?
    es: if((j-1)/2%2 ==0)
    termine*=1;
    else
    termine *=-1;

    somma += termine;
    È inutile: se è zero moltiplichi per 1, ovvero non cambi niente, il caso in cui c'è effettivamente da fare qualcosa è quello in cui è diverso da zero.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2012
    Messaggi
    18
    Grazie mille!!!!
    Il codice adesso è perfetto! Già eseguito!

  8. #8
    Amaro C++, il gusto pieno dell'undefined behavior.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.