Rozwinięcie w szereg ln(x+1) w jezyku C

2017-12-10 16:46
1

Witam, mam za zadanie zrobić program o treści:

Tablicowanie funkcji w zadanym przedziale, z zadaną liczbą podprzedziałów, z wykorzystaniem rozwinięcia w szereg. Dane wejściowe do programu: przedział, w którym funkcja ma być tablicowana, liczba podprzedziałów Trzeba napisać funkcję szereg, która na podstawie rozwinięcia w szereg oblicza wartość funkcji dla danego argumentu. Na ekranie mają się pojawić 3 kolumny liczb: argument (x), wartość funkcji z biblioteki matemtycznej dla x, wartość funkcji szereg dla x. W funkcji szereg nie używamy funkcji pow ani silnia; do obliczenia kolejnego wyrazu szeregu wykorzystujemy wyraz poprzedni.>

Mam to zrobić dla ln(x+1). Program jest napisany analogicznie, do tego który miałem podany w zadaniu jako przykład. Zmieniłem tutaj funkcje szeregu oraz końcówkę programu.

Chciałbym, żebyscie mi powiedzieli czy zrobiłem to dobrze, jezeli nie, to co zmienić.
Jak wygląda ogólnie szereg znalazłem na wolphramie, bądź tutaj na wikipedii: https://pl.wikipedia.org/wiki/Logarytm_naturalny

Oto mój kod

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define n 100
double szereg(double x)
{
    double s, w;
    int i;
    s=x;
    w=x;
    for(i=1; i<n; i++)
    {
        w=-w*x/i;
        s=s+w;
    }
    return s;
}
int main()
{
    int lp;
    double a, b, krok, x;
    printf("podaj konce przedzialow i liczbe podprzedzialow\n");
    scanf("%lf %lf %d",&a,&b,&lp);
    krok=(b-a)/lp;
    printf("krok=%6.2lf\n\n\n",krok);
    printf(" ----------------------------\n\n");
    printf("        x   szereg(x) log(x+1)\n -----------------------------\n");
    for (x=a; x<=b; x+=krok)
        printf("%10.2lf %7.4lf %7.4lf\n",x,szereg(x),log(x+1));
    printf(" ----------------------------\n\n");
    return 0;
}
edytowany 1x, ostatnio: jajko1233, 2017-12-10 16:47

Pozostało 580 znaków

2017-12-10 18:29
Czarny Szewc
0
        public static double szeregLnP1(double x, int maxN)
    {
        double sum = 0;
        for(int n=1;n<maxN;n++)
        {
            if(n%2==0)
              sum=sum - (Math.pow(x,n)/n);
            else
              sum=sum + (Math.pow(x,n)/n);
        }
        return sum;
    }

    public static void main(String[] args) 
    {
        System.out.println(MainStart.szeregLnP1(0.9, 100));
                System.out.println(Math.log(1+0.9));
    }

Pozostało 580 znaków

2017-12-10 18:36
0

Nie można używać ani 'pow' ani silni w tym zadaniu.
Poza tym najlepiej to by mi odpowiadało, jeżeli ktoś by przekształcił to co mam juz napisane(jezeli jest oczywisice zle), poniewaz musze sie co nie co oprzeć na przykładzie, ktory mialem podany z tego względu, ze nie mielismy np. modyfikatorow dostepu na zajeciach etc.

Co najwyzej to pętle własnie :D

edytowany 1x, ostatnio: jajko1233, 2017-12-10 18:37

Pozostało 580 znaków

2017-12-10 18:43
Czarny Szewc
0
public static double szeregLnP1(double x, int maxN)
    {
        double sum = 0;
        for(int n=1;n<maxN;n++)
        {
            if(n%2==0)
              sum=sum - (x/n);
            else
              sum=sum + (x/n);
            x=x*x;
        }
        return sum;
    }
Przyjmę, że maxN jest 100, tak jak u mnie. Powinienem teraz całą funkcję u siebie usunąc i wbić tą twoją? Bo nie czaje, jak ma mi to pomóc. - jajko1233 2017-12-10 18:46
Bądź mógłbyś powiedzieć co ja mam źle.. Bo to jest kwestia jednej linijki wydaje mi się. - jajko1233 2017-12-10 18:47

Pozostało 580 znaków

2017-12-10 18:49
0

@Czarny Szewc: jesteś niewidomy, czy masz problem z czytaniem ze zrozumieniem?

Wątek dotyczy języka C a nie dżawy, więc nie śmieć w wątku kodem, którego pytacz nie wykorzysta. Tym bardziej, że gość nie ogarnia, że tego kodu ot tak „nie wbije” do swojego projektu. Więc nie rób pytaczowi wody z mózgu.

Jak chcesz pochwalić się kodem to napisz go w C.


edytowany 1x, ostatnio: furious programming, 2017-12-10 18:50
Szczerze powiedziawszy, wczoraj kodziłem w javie do poznych godzin nocnych i nawet nie zauważyłem, ze faktycznie on to pisze w Javie, a ja prosiłem o C. <facepalm> - jajko1233 2017-12-10 18:52
To w czym kodziłeś wczoraj jest nieistotne – wątek dotyczy C i Twój kod jest napisany w C. - furious programming 2017-12-10 18:53

Pozostało 580 znaków

2017-12-10 18:53
Czarny Szewc
0
double szereg(double x)
{
    double s, w;
    int i;
    s=x;
    w=x;
    for(i=1; i<n; i++)
    {
        w=-w*x/i;
        s=s+w;
    }
    return s;
}

To ma działać tak, że przy pozycjach parzystych znak sumy ma być ujemny a przy nieparzystych dodatni. U ciebie w kodzie wszystko jest ok tylko znak cały czas jest ujemny.

Pozostało 580 znaków

2017-12-10 19:00
0

*Czarny Szewc
W takim razie, tak to powinienem zrobić?

double szereg(double x)
{
    double s, w;
    int i;
    s=x;
    w=x;
    for(i=1; i<n; i++)
    {
        if(i%2==0)
            w=-w*x/i;
        else 
            w=w*x/i;
        s=s+w;
    }
    return s;
}
edytowany 1x, ostatnio: jajko1233, 2017-12-10 19:01

Pozostało 580 znaków

2017-12-10 19:41
Czarny Szewc
0

Program ma sumować taki ciąg:

x - (x^2)/2 + (x^3)/3 - (x^4)/4 + (x^5)/5...
-, +, -, +, -, +, -, +...
edytowany 2x, ostatnio: furious programming, 2017-12-10 20:59

Pozostało 580 znaków

2017-12-10 20:10
0

No tak rozumiem Cie, ale to jak to teraz zaimplementować, bo nie do końca rozumiem tematu, a co dopiero jeszcze to zrobić :P
Wiem, ze powinienem na samym poczatku zrozumiec temat w pelni, ale te szeregi nie sa moja mocna strona, tym bardziej, ze na temat moment robimy granice na analizie.

Zrobiłem po prostu analogicznie do tego, co Ty napisałeś.

Pozostało 580 znaków

2017-12-10 21:03
0

Skoro masz na zmianę obsługiwać + i -, to zadeklaruj sobie pomocniczą zmienną liczbową, nadaj jej wartość -1. Użyj jej do obliczeń w pętli, a na koniec iteracji zmień jej znak. W ten sposób skrócisz zapis, bo pozbędziesz się warunku.

Powinieneś też mieć kod do liczenia potęgi – u Ciebie go nie ma.


edytowany 1x, ostatnio: furious programming, 2017-12-10 21:05

Pozostało 580 znaków

2017-12-10 21:12
0

@furious programming: O coś takiego Ci chodziło?

double szereg(double x)
{
    double s, w;
    int i;
    int helper = -1;
    s=x;
    w=x;
    for(i=1; i<n; i++)
    {
        w=-w*helper*x/i;
        s=s+w;

        if(helper==-1)
            helper = 1;
        else
            helper = -1;
    }
    return s;
}

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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