Rozwijanie funkcji w szeregi Taylora ( Mclaurina )

Rozwijanie funkcji w szeregi Taylora ( Mclaurina )
D2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6
0

Witam wszystkich. Ostatnio dostałem zadanie o następującej treści "Napisz program do rozwijania funkcji w szeregi Taylora w ogół zadanego punktu x0". Mój problem leży bardziej po stronie matematyki i logiki niż problemu typowo koderskie. Stworzyłem podany program który, wylicza zarówno sin i cos dla podanego x i n wyrazów ciągu. Z tego co rozumiem szereg Mclaurina jest wyjątkowym przypadkiem szeregu Taylora i program powinien zwracać odpowiednio różne wartości dla x = 0 i n wyrazów ciągu ? Jeśli tak, to niestety program obecnie dla wartości x = 0 będzie zwracał wartość 0 dla każdego, podanego n i nie mam pomysłu jak przebudować całość pod ten przypadek szeregu.

Przykładowo:
f(0) = sin 0 = 0
f(i)(0) = cos 0 = 1
f(ii)(0) = −sin 0 = 0
f(iii)(0) = −cos 0 = −1
f(iv)(0) = sin 0 = 0

Dodatkowo program ma być do bólu prosty w swoje kontrukcji, bez klas, obiektów, tabel, wskaźników i przy użyciu minimalnej ilości bibliotek ( tak wiem, trochę dziwne no ale ... )
Z góry dziękuję za wszelkie uwagi/porady i przepraszam, że problem dotyczy bardziej strony matematycznej ale chce dobrze zrozumieć te zagadnienie i zasięgnąc opinni ekspertów.```

Kopiuj
#include <iostream>
#include <iomanip>

using namespace std;

double sin(double x, int n)
{
    double t = x;
    double sine = t;
    for (int a = 1; a < n; ++a)
    {
        double mult = -x * x / ((2 * a + 1) * (2 * a));
        t *= mult;
        sine += t;
    }
    return sine;
}
double cos(double x, int n)
{
    double t = x;
    double cose = t;
    for (int a = 1; a < n; ++a)
    {
        double mult = -x * x / ((2 * a - 1) * (2 * a));
        t *= mult;
        cose += t;
    }
    return cose;
}
int main()
{
    double num;
    int n;

    cout << "Wprowadz liczbe x: " << endl;
    cin >> num;
    cout << "Podaj liczbe elementow n: " << endl;
    cin >> n;
    cout << std::setprecision(20) << "sin dla x: " << sin(num, n) << std::endl;
    cout << std::setprecision(20) << "cos dla x: " << cos(num, n) << std::endl;

    return(0);
}
_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
3

Sądzisz jak zmienisz nazwę funkcji z sin na cos to nagle zacznie robić coś innego?
Albert Einstein dal definicję pewnemu zjawisku: - powtarzanie tej samej czynności znowu i znowu w oczekiwaniu innego wyniku.
Owszem dla sztuk walki to wynik w końcu może się zmienić, zaś nie dla programu.

lion137
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5025
0

Matematycznie, spróbuj zgodnie z wikipedią:
https://en.wikipedia.org/wiki/Taylor_series#Trigonometric_functions
Pseudokod sinusa:

Kopiuj
def factorial(n):
    s = 1
    while n > 0:
        s *= n
        n -= 1
    return s


def signum(n):
    if n % 2 == 0: 
        return 1
    return -1


def macLaurin_sin(x, n):
    s = 0
    for m := 0 to n - 1:
        s += signum(m) * power(x, 2 * m + 1) / factorial(2 * m + 1)
    return s

Aby mieć, power, (w, C++ pow) wystarczy dąłączyć cmath; m musi iść od zera do, n - 1, żeby, signum działało poprawnie.

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
0
Dado21 napisał(a):

Witam wszystkich. Ostatnio dostałem zadanie o następującej treści "Napisz program do rozwijania funkcji w szeregi Taylora w ogół zadanego punktu x0". Mój problem leży bardziej po stronie matematyki i logiki niż problemu typowo koderskie. Stworzyłem podany program który, wylicza zarówno sin i cos dla podanego x i n wyrazów ciągu. Z tego co rozumiem szereg Mclaurina jest wyjątkowym przypadkiem szeregu Taylora i program powinien zwracać odpowiednio różne wartości dla x = 0 i n wyrazów ciągu ? Jeśli tak, to niestety program obecnie dla wartości x = 0 będzie zwracał wartość 0 dla każdego, podanego n i nie mam pomysłu jak przebudować całość pod ten przypadek szeregu.

Przykładowo:
f(0) = sin 0 = 0
f(i)(0) = cos 0 = 1
f(ii)(0) = −sin 0 = 0
f(iii)(0) = −cos 0 = −1
f(iv)(0) = sin 0 = 0

Dodatkowo program ma być do bólu prosty w swoje kontrukcji, bez klas, obiektów, tabel, wskaźników i przy użyciu minimalnej ilości bibliotek ( tak wiem, trochę dziwne no ale ... )
Z góry dziękuję za wszelkie uwagi/porady i przepraszam, że problem dotyczy bardziej strony matematycznej ale chce dobrze zrozumieć te zagadnienie i zasięgnąc opinni ekspertów.```

Kopiuj
#include <iostream>
#include <iomanip>

using namespace std;

double sin(double x, int n)
{
    double t = x;
    double sine = t;
    for (int a = 1; a < n; ++a)
    {
        double mult = -x * x / ((2 * a + 1) * (2 * a));
        t *= mult;
        sine += t;
    }
    return sine;
}
double cos(double x, int n)
{
    double t = x;
    double cose = t;
    for (int a = 1; a < n; ++a)
    {
        double mult = -x * x / ((2 * a - 1) * (2 * a));
        t *= mult;
        cose += t;
    }
    return cose;
}
int main()
{
    double num;
    int n;

    cout << "Wprowadz liczbe x: " << endl;
    cin >> num;
    cout << "Podaj liczbe elementow n: " << endl;
    cin >> n;
    cout << std::setprecision(20) << "sin dla x: " << sin(num, n) << std::endl;
    cout << std::setprecision(20) << "cos dla x: " << cos(num, n) << std::endl;

    return(0);
}

Wygląda nienajgorzej.
Jest tylko jeden prosty błąd: https://godbolt.org/z/1PdP8r548

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.