Rozwinięcie funkcji w szereg - prośba o wytłumaczenie kilku zagadnień.

0

Cześć

Mam problem ze zrozumieniem pewnego zadania z programowania którego treść brzmi :

"Obliczyć wartość funkcji sin x dla danego x rzeczywistego, korzystając z rozwinięcia tej funkcji w następujący szereg nieskończony:"

0.png

Mam tutaj poprawny kod dot. tego zadania.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define EPS 1E-12

int main()
{
    double x,w,s;
    int n;

    printf("Podaj X: ");
    scanf("%lf",&x);
    printf("x=%f",x);

    s=0;
    w=x;
    n=2;

    while(fabs(w)>EPS)
        {

            s=s+w;
            w=(w*(-1))*(pow(x,2))/(n*(n+1));
            n=n+2;

        }

        printf("\n\t suma szeregu   : x=%.12f",s);
        printf("\n\t funkcja sin()  : x=%.12f", sin(x));

    return 0;
}

Jednak kompletnie nie rozumiem z jakich własności we wzorze wynika:

w=x;
n=2;

I

s=s+w;
w=(w*(-1))*(pow(x,2))/(n*(n+1));
n=n+2;

Mógłby mi ktoś wytłumaczyć jak "debilowi" w.w zagadnienia?
Zadanie wydaje się chyba łatwe, bo na zajęciach nie mieliśmy żadnego tłumaczenia przy pisaniu tego czym jest "szereg".

Pozdrawiam serdecznie

2

w po prostu reprezentuje kolejne wyrazy szeregu z przypisaną wartością x. Natomiast n pozwala Ci znaleźć wykładniki potęg w kolejnych wyrazach oraz wartości silni występujące w mianownikach. Innymi słowy w = f(x,n), czyli np. dla x = 5 jest to -5^3/3! lub w kolejnym kroku pętli -5^5/5!. Pętla while wykonuje się do momentu, aż dokładność rozwinięcia funkcji będzie mniejsza niż zadana wartość epsilon, czyli sprowadza się to do znalezienia takiego wyrazu szeregu, dla którego |w| < epsilon.

Zwróć uwagę, że s --> F(x) jeśli tylko weźmiesz pod uwagę wszystkie wyrazy szeregu, co jest niemożliwe, bo dążą one do nieskończoności. Stąd cięcie szeregu przy zadanej dokładności epsilon.

1

Mam tutaj poprawny kod dot. tego zadania.

Bzdura, ten kod jest akurat mega słaby. Poprawna implementacja wyliczałaby kolejny wyraz szeregu na podstawie poprzedniego. Zastanów sie, gdybyś miał wyrazy x+ x^3 + x^5 + x^7 + .... to nie trudno zauważyć że kolejny wyraz to po prostu poprzedni wyraz pomnożony przez x^2 i nie ma sensu wyliczać tych potęg za każdym razem od zera.

1
Shalom napisał(a):

Bzdura, ten kod jest akurat mega słaby.

Mylisz się. Tak właśnie to jest zrobione, jak sugerujesz:

w=(w*(-1))*(pow(x,2))/(n*(n+1));
n=n+2;
0
Pyxis napisał(a):

w po prostu reprezentuje kolejne wyrazy szeregu z przypisaną wartością x. Natomiast n pozwala Ci znaleźć wykładniki potęg w kolejnych wyrazach oraz wartości silni występujące w mianownikach. Innymi słowy w = f(x,n), czyli np. dla x = 5 jest to -5^3/3! lub w kolejnym kroku pętli -5^5/5!. Pętla while wykonuje się do momentu, aż dokładność rozwinięcia funkcji będzie mniejsza niż zadana wartość epsilon, czyli sprowadza się to do znalezienia takiego wyrazu szeregu, dla którego |w| < epsilon.

Zwróć uwagę, że s --> F(x) jeśli tylko weźmiesz pod uwagę wszystkie wyrazy szeregu, co jest niemożliwe, bo dążą one do nieskończoności. Stąd cięcie szeregu przy zadanej dokładności epsilon.

Dzięki za pomoc, dużo mi to rozjaśniło. Mam jeszcze kilka podobnych zadań, więc gdy uda mi się je zrobić to chyba wstawię je tutaj do tematu by może ktoś sprawdził, czy wszystko jest dobrze.

0

Zrobiłem teraz prawie identyczne zadanie.

title

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define EPS 1E-12

int main()
{
    double x,w,suma,n;

    do
        {
            printf("Podaj |x|<1: ");
            scanf("%lf",&x);

        }
    while(fabs(x)<1);

    suma=0;
    w=x;
    n=2;

    while(fabs(w)>EPS)
        {
            suma=suma+w;
            w=(w*(-1))*(pow(x,2))/((n+2));
            n=n+2;
        }

        printf("\n\t x=%.3f\n",x);
        printf("\n\t suma szeregu   : x=%.12f",suma);
        printf("\n\t funkcja arctg(x)  : x=%.12f",atan(x));

    return 0;
}

Nie jestem pewny, ale wydaje mi się, że mam błąd w tej linijce.

w=(w*(-1))*(pow(x,2))/((n+2));

Chciałem 1 część w.w linijki podzielić przez mianownik wyrazu poprzedniego dodając do niego 2, ale chyba nie tak to ma wyglądać. Mógłby ktoś powiedzieć, czy jest poprawnie?

Pozdrawiam

1

Zrób to tak, jak przystało na programistę. Rozpisz sobie ogólną postać tego szeregu i zbadaj zależność pomiędzy jego konsekutywnymi wyrazami (patrz załącznik). Wtedy w pętli while zwiększasz zmienną n o jeden: n++. Ponadto w kodzie masz błąd i pętla do while wykonuje się w nieskończoność, w przypadku podania prawidłowej wartości x. Zmień warunek w pętli na przeciwny fabs(x)>=1.

geo_series.png

0

Dzięki za odpowiedź.

Zastosowałem się do twoich wskazań i teraz wygląda to tak:

while(fabs(x)>=1);

    suma=0
    w=x
    n=1;

    while(fabs(w)>EPS)
        {
            suma=suma+w;
            w=(pow(-1,n))*pow(x,2*n+1)/(2*n+1);
            n=n+1;
        }

Sprawdziłem jeszcze jak to wygląda z tego wzoru:

(pow(-1,n))*pow(x,2*n+1)/(2*n+1);

I wychodzi

sddf.png

Więc wydaje mi się, że chyba wszystko jest w porządku.

1 użytkowników online, w tym zalogowanych: 0, gości: 1