[C] szereg i wartość dokładna[Solved]

Witam, dostałem projekt którego celem jest policzenie wartości funkcji we wszystkich punktach podziału na n części przedziału [a,b]. Funkcja f dana jest w postaci rozwinięcia w szereg potęgowy i w postaci wzoru analitycznego. Obliczanie sumy szeregu wykonać mam z dokładnością e (epsilon). Algorytm obliczenia sumy szeregu ma być w oddzielnej funkcji. Poniżej zamieszczam szereg i wzór analityczny (przepraszam z góry za jakość)

http://img151.imageshack.us/i/skanowanie0001nc.jpg/

Problem tkwi w tym że niestety wartość ze wzoru analitycznego nie zgadza mi sie z tą wyliczoną przez szereg… poza tym przy dołożonym warunku (poniżej) funkcja zwraca cały czas 0 nawet gdy dokładność wyniku ustalę na 0.00000001.

if (fabs(wyraz)
		{

			suma=0;

		}

Proszę o pomoc i wskazanie mi błędu w funkcji liczącej szereg bo ja nie mogę się doszukać.

#include 

#include 

#include 


double silnia(double liczba)

{

    double silnia, i;


    if (liczba < 0)

    {

        return 0;

    }

    else if (liczba < 2)

    {

        return 1;

    }

    else

    {

        i = 1;

        silnia = 1;

        while (i++ < liczba)

        {

            silnia *= i;

        }

        return silnia;

    }

}

double szereg(double pp, double k, double eps)

{

	double wyraz=1, suma=0, i, x=k-pp;


	for(i=0; fabs(wyraz)>=eps; i+=4)

	{

		if (x!=0)

		{

			wyraz=((pow(x,i)*cos(pp))/silnia(i))-((pow(x,i+1)*sin(pp))/silnia(i+1))-((pow(x,i+2)*cos(pp))/silnia(i+2))+((pow(x,i+3)*cos(pp))/silnia(i+3));

			suma+=wyraz;

		}

		else

		{

			wyraz=(cos(pp)/silnia(i))-(sin(pp)/silnia(i+1))-(cos(pp)/silnia(i+2))+(sin(pp)/silnia(i+3));

			suma+=wyraz;

		}

		if (fabs(wyraz)
		{

			suma=0;

		}

	}

	return suma;

}

int main()

{

    double pp, kp, krok, eps, licznik, k, x;

	int j;

	double *tablica1;

	double *tablica2;

	double *tablica3;


	printf("Podaj poczatek przedzialu ");

    scanf("%lf", &pp);

	printf("Podaj koniec przedzialu ");

    scanf("%lf", &kp);

	printf("Podaj krok ");

    scanf("%lf", &krok);

	printf("Podaj dokladnosc ");

    scanf("%lf", &eps);

	if (pp>kp)

	{

		printf("Przedzial nie istnieje\n");

	}


	licznik = (kp-pp)/krok;


	tablica1 = malloc(licznik * sizeof *tablica1);

	tablica2 = malloc(licznik * sizeof *tablica2);

	tablica3 = malloc(licznik * sizeof *tablica3);


	for(j=0, k=pp; j<=licznik; j++, k+=krok)

	{

		tablica1[j]=cos(k);

		tablica2[j]=szereg(pp, k, eps);

		tablica3[j]=k;

	}

	for(j=0; j<=licznik; j++)

	{

		printf("%lf\t%lf\t%lf\n",tablica3[j] ,tablica2[j], tablica1[j]);

	}


	system("PAUSE");

	return 0;

}

Skoro każesz zwracać funkcji 0 to chyba nic dziwnego, że tyle zwraca. A gdybyś nie starał się wszystkiego zmieścić w jednej linii zauważył byś, ze masz w kodzie 3 cosinusy i tylko jeden sinus :stuck_out_tongue:

Ja bym to zapisał np. tak (choć nie jestem pewien jak wyciągnięcie wspólnej części wpływa na dokładność :))

double w1 = 1 * cos(pp);

double w2 = x /(i+1)* sin(pp);

double w3 = x * x /(i+1)/(i+2) *cos(pp);

double w4 = x*x*x /(i+1)/(i+2)/(i+3) * sin(pp);

wyraz= pow(x,i) / silnia(i)*(w1-w2-w3+w4);

suma+=wyraz;

wystarczyło zmienić cos na sinus w moim kodzie i działa :slight_smile: