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

[C++] Wzór Maclaurina na obliczanie arctan szeregiem potęgowym

Ostatnio zmodyfikowano 2014-10-29 21:29
Autor Wiadomość
Roofy5
Temat założony przez niniejszego użytkownika
[C++] Wzór Maclaurina na obliczanie arctan szeregiem potęgowym
» 2014-10-29 15:47:54
Witam!

Na studiach zaczęliśmy naukę języka C. Dla tych którzy już coś kiedyś programowali jest możliwość napisania trzech projektów i dzięki temu jest się zwolnionym z egzaminów.

Moje zadanie to: Napisać funkcję, która na podstawie rozwinięcia w szereg oblicza wartość funkcji arctg(x).
Na internecie znalazłem jak takie rozwinięcie wygląda:

http://www.matematyka.pl/latexrender/pictures/9/e/9ed7385696335d5c3ad92a24d73edc65.png

Oto mój kod:

C/C++
#include <stdio.h>
#include <math.h>
#define n 100 //Dokladnosc pomiaru

double szeregowanie( double x )
{
    double licznik = 1; //Bo (-1)^0 = 1
    double mianownik, dlax, pomocnik;
   
    int i;
    int j;
   
    dlax = x;
   
    for( j = 0; j <= n; j++ ) //Powtarza obliczanie wyniku z coraz to wieksza dokladnoscia
    {
       
        for( i = 1; i < j; i++ )
        {
            licznik = licznik *( - 1 ); // Licznik: (-1)^n
        }
       
        mianownik = 2 * j + 1; // Mianownik 2n+1
       
        for( i = 1; i < 2 * j + 1; i++ )
        {
            dlax = dlax * x; // Dodatek x^(2n+1)
        }
       
        pomocnik = pomocnik +( licznik / mianownik ) * dlax;
        licznik = 0;
        mianownik = 0;
        dlax = x;
       
    }
   
    return pomocnik;
}

Niestety funkcja nie działa prawidłowo. Arctan(x) nie jest taki jaki powinien.

Macie jakieś pomysły?
P-119618
DejaVu
» 2014-10-29 21:29:29
C/C++
#include <cstdio>
#include <cmath>

// Funkcja oblicza arctg(x) za pomocą szeregu Maclaurina.
float obliczSzeregMaclaurina( float _x, float _dokladnosc )
{
    float wynik = 0.0f;
    for( int n = 0; n < _dokladnosc; ++n )
    {
        float licznik = n % 2 == 0 ? 1.0f: - 1.0f;
        float mianownik = 2.0f * n + 1.0f;
        float wartosc = std::pow( _x, 2 * n + 1 );
        wynik +=( licznik / mianownik ) * wartosc;
    } //for
    return wynik;
}

int main()
{
    float wartosc = 0.1f;
    float wartoscReferencyjna = std::atan( wartosc );
    float wartoscObliczona = obliczSzeregMaclaurina( wartosc, 100000 );
    printf( "wartoscReferencyjna = %.5f;\n", wartoscReferencyjna );
    printf( "wartoscObliczona    = %.5f;\n", wartoscObliczona );
    return 0;
}
Standardowe wyjście programu:
wartoscReferencyjna = 0.09967;
wartoscObliczona    = 0.09967;
P-119654
« 1 »
  Strona 1 z 1