Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Szereg Taylora

Ostatnio zmodyfikowano 2013-10-18 16:03
Autor Wiadomość
KasiaKK
Temat założony przez niniejszego użytkownika
[C++] Szereg Taylora
» 2013-10-18 14:09:50
Dzień dobry, jestem bardzo początkująca programistką. Mam do policzenia sinus z szeregu taylora.
Póki co miałam na razie pętle.
Opieram się na tym, że iteracje są kontynuowane dopóki wyraz w
 szeregu jest większy od zadanej dokładności eps oraz  z faktu, że
 kolejny wyraz szeregu można obliczyć na podstawie wartości wyrazu poprzedniego.
A oto mój program

C/C++
#include<iostream>
#include<cmath>
#include<iomanip>
#include<math.h>

using namespace std;
int main( int argc, char ** argv ) {
   
    float y = 0; //wartosc sinusa
    float eps; // dokładność
    float x; //kąt x podany w radianach
    float w; //wyraz szeregu
    int i = 2; //licznik
    const float pi = 3.14;
    cout << "wpisz argument:";
    cin >> x * pi;
    cout << "wpisz dokladnosc:";
    cin >> eps;
   
    w =( - x * x * x ) /(( 2 * i - 2 ) *( 2 * i - 1 ) );
    y = y + w + x;
    i = 3;
    while( w > eps )
    {
       
        w =( - 1 * w * x * x ) /( 2 * i - 2 ) *( 2 * i - 1 ); //wzór na obliczenie wartosci kolejnego wyrazu
        y = y + w;
        i = i + 1;
    }
    cout << "sin wynosi: " << setprecision( 10 ) << y;
   
   
    return 0;
}
Nie wiem czemu, ale wartości sinusa wychodzą mi jakieś olbrzymie.
P-93937
akwes
» 2013-10-18 14:29:41

C/C++
cin >> x * pi;
?

Kolorowanie kodu jest opisane w » Porady dla użytkowników cpp0x.plZakładanie tematów na forum zalecenie
P-93938
KasiaKK
Temat założony przez niniejszego użytkownika
» 2013-10-18 14:37:36
To akurat już zauważyłam, tylko że program liczy mi że sinus ma wartość np 650.
Kolejny błąd powinno być tak: w = (-1*w*x*x)/((2*i-2)*(2*i-1))
Tylko, że wciąż jest źle
P-93939
DejaVu
» 2013-10-18 14:44:37
1. Nie ma w kodzie wywołania funkcji sin.
2. Funkcja sin przyjmuje wartości w radianach, a nie w stopniach.
3. » standard Csin.
P-93940
akwes
» 2013-10-18 14:47:21
Zauważyłaś i co z tym zrobiłaś? Bo jak na razie, to kod, który podałaś nawet się nie kompiluje :P

Pętla w ogóle się nie wykonuje ponieważ np. dla argumentu 10 zmienna "w" ma wartość ujemną. Już wtedy wiemy, że pętla się nie wykona bo dokładność (0.01, 0.001, 0.0001) będzie większa od każdej liczby ujemnej.

// @DejaVu,

1. Nie ma w kodzie wywołania funkcji sin.
Szereg Taylora ma przybliżać wartość sinusa, więc chodzi tutaj o napisanie funkcji liczącej sinus samemu.

// @KasiaKK,
pokaż swój aktualny kod, bo jak będziesz co chwilę coś zmieniać to się nie dogadamy :P Zmieniłaś wzór na kolejny wyraz w pętli ale już nie na początku (przed pętlą) tak ma być?
P-93941
DejaVu
» 2013-10-18 15:02:21
hyhy, no to wykazałem się niewiedzą ;p sorry :)

/edit:
W każdym razie algorytm jest po prostu źle zaimplementowany.
P-93943
KasiaKK
Temat założony przez niniejszego użytkownika
» 2013-10-18 15:05:50
Poprawione
C/C++
#include<iostream>
#include<cmath>
#include<iomanip>
#include<math.h>

using namespace std;
int main( int argc, char ** argv ) {
   
    float y = 0; //wartosc sinusa
    float eps; // dokładność
    float x; //kąt x podany w radianach
    float w; //wyraz szeregu
    int i = 2; //licznik
    const float pi = 3.14;
    cout << "wpisz argument:";
    cin >> x;
    cout << "wpisz dokladnosc:";
    cin >> eps;
   
    w =( - x * x * x ) /(( 2 * i - 2 ) *( 2 * i - 1 ) );
    y = y + w + x;
    i = 3;
    while( w > eps )
    {
       
        w =( - 1 * w * x * x ) /(( 2 * i - 2 ) *( 2 * i - 1 ) ); //wzór na obliczenie wartosci kolejnego wyrazu
        y = y + w;
        i = i + 1;
    }
    cout << "sin wynosi: " << setprecision( 10 ) << y;
   
   
    return 0;
}
P-93944
akwes
» 2013-10-18 15:23:02
Jesteś pewna, że dobrze rozwinęłaś funkcję w szereg taylora?

// Zakładając, że to radiany
Dla wartości 3.14 i dokładności 0.001 pierwszy wyraz to około -5, suma wyrazów to -2. Kolejne wyrazy będą zmieniać nieznacznie sumę, więc nie widzę szans na przejście z -2 do 0.0015...

// Zakładając, że to stopnie
Dla wartości 180 i dokładności 0.001 pierwszy wyraz to -972000, suma wyrazów to -971820. Kolejne wyrazy będą zmieniać nieznacznie sumę, więc nie widzę szans na przejście do 0.

Problem jest z matematyką a nie z algorytmem programowaniem.

Jeżeli masz wzór na sumę szeregu to sama spróbuj na kartce przejść kilka iteracji "ręcznie" i zobacz czy wyniki wychodzą zbliżone do tych z kalkulatora.

To co masz w kodzie nie przypomina tego:

// W wersji podstawowej można na żywca liczyć potęgę i silnię. W wersji optymalnej można zauważyć jak się zmienia kolejny wyraz szeregu i zastąpić pierwszą z potęg (tu się tylko zmienia znak) oraz silnię (można wykonywać operacje na wcześniejszym wyrazie obliczając nowy) i drugą z potęg (można wykonywać operacje analogiczne jak w przypadku silni).
P-93947
« 1 » 2
  Strona 1 z 2 Następna strona