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

Rozwinięcie w szereg ln(x+1) w jezyku C
J1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 104
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

Kopiuj
#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;
}
  • Rejestracja: dni
  • Ostatnio: dni
0
Kopiuj
        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));
	}
J1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 104
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

  • Rejestracja: dni
  • Ostatnio: dni
0
Kopiuj
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;
	}
flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12316
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.

  • Rejestracja: dni
  • Ostatnio: dni
0
Kopiuj
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.

J1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 104
0

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

Kopiuj
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;
}
  • Rejestracja: dni
  • Ostatnio: dni
0

Program ma sumować taki ciąg:

Kopiuj
x - (x^2)/2 + (x^3)/3 - (x^4)/4 + (x^5)/5...
-, +, -, +, -, +, -, +...
J1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 104
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ś.

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12316
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.

J1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 104
0

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

Kopiuj
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;
}
atmal
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 913
1

To:

Kopiuj
if(helper == -1)
	helper = 1;
else
	helper = -1;

Możesz zastąpić tym:

Kopiuj
helper *= -1;
flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12316
2

Miałeś uniknąć warunku, a wyszło jeszcze więcej kodu… ;)

Kopiuj
helper = -helper;
J1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 104
0

No tak, to prawda. Mimo to, wydaje mi sie ze wynik jest dalej zle. Chyba zle wsadzilem tego helpera, choc sam juz nie wiem.

Nie rozumiem tego, zrobiłem analogicznie do przykladu sin(x), ktory mialem podany i on wygladal tak:

Kopiuj
double szereg(double x)
{
double s, w;
int i;
s=x;
w=x;
for(i=1;i<n;i=++)
{
w=-w*x*x/(2*i*(2*i+1));
s=s+w;
}
return s;
} 
J1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 104
0

Jak coś to tak ma być finalnie :)

Kopiuj
#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=2; i<n; i++)
    {
        w=((-w*x)/i)*(i-1);
        s=s+w;
    }
    return s;
}

int main()
{
    int lp;
    double a, b, krok, x;

    do
    {
        printf("podaj konce przedzialow i liczbe podprzedzialow\n");
    scanf("%lf %lf %d",&a,&b,&lp);
    }
    while(a<-1 || b>=1);

    krok=(b-a)/lp;
    printf("krok=%6.2lf\n\n\n",krok);
    printf(" ----------------------------\n\n");
    printf("      x  szereg(x)  ln(1+x)\n----------------------------\n");
    for (x=a; x<=b; x+=krok)
        printf("%10.2lf %7.4lf %7.4lf\n",x,szereg(x),log(1+x));
    printf(" ----------------------------\n\n");
    return 0;
}

Tam na dole uwzględniłem też ze dziedzina tego to jest od -1 do 1 wg wikipedii ;p

  • Rejestracja: dni
  • Ostatnio: dni
0
Kopiuj
p=x;
s=x;
for(i=2;i < N;i++)
{
 p=p*(-x);
 s+=(p/i);
}
return s;

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.