Użycie szeregu MacLaurina, błędny wynik

0

Witam, dostałem zadanie obliczenia sin(PI/3) przy użyciu szeregu MacLaurina, tylko za bardzo mi to nie chce wyjść :-(
Napisałem taki kod:

#include <stdio.h>
#define PI 3.14159
double sinx = PI / 3;
int whilex, liczba;
double obliczenia, sinx_do_trzeciej, mianownik, ulamek, ulamek_razy_minus_jeden, podwojnysinx,
    dwa_razy_whilex, dwa_razy_whilex_plus_jeden;
int main()
{
    printf("Proszê podaæ liczbê szeregu: \n");
    scanf("%d", &liczba);
    whilex = 1;
    while (whilex <= liczba)
    {
        if (whilex == 1)
        {
            sinx_do_trzeciej = sinx * sinx * sinx;
            obliczenia = sinx_do_trzeciej / 6;
        }
        else
        {
            podwojnysinx = sinx * sinx;
            dwa_razy_whilex = whilex * 2;
            dwa_razy_whilex_plus_jeden = dwa_razy_whilex + 1;
            mianownik = dwa_razy_whilex * dwa_razy_whilex_plus_jeden;
            ulamek = podwojnysinx / mianownik;
            ulamek_razy_minus_jeden = ulamek * (-1);
            obliczenia = obliczenia - ulamek_razy_minus_jeden;
        }
        printf("Operacja numer: %ld, %0.20f.\n", whilex, obliczenia);
        whilex++;
    }
    // Dla sprawdzenia, nie wiem czy wynik_sinx jest potrzebny, ale chyba tak bo wynik "prawie" się
    // zgadza
    double wynik_sinx = sinx - obliczenia;
    printf("Koncowa operacja %0.20f.\n", wynik_sinx);
    getchar();
    getchar();
    return 0;
}

user image
Czy ktoś byłby mi w stanie wytłumaczyć co robię źle? Dzięki z góry za pomoc :-)

0

Twoje obliczenia nie mają nic wspólnego z rozwinięciem sinusa w szereg, dodatkowo nazywasz zmienne totalnie z d**y.
sinx_do_trzeciej = sinx * sinx * sinx; WTF? Przecież to jest x3 i żadnego sinusa tam nie ma!
Poza tym chyba nie widzisz że wzór zaczyna sie od x a nie od x3...
Kod to jakis dramat. Żadnego dzikiego ifa tam nie trzeba jeśli napiszesz ten kod po ludzku. I użyj petli for() jeśli robisz zadaną liczbę iteracji.

0

zamiast pisać wszystko w main, napisz funkcję na szereg Maclaurina.

double SinMaclaurin(double x, int n)
{
    double result = 0.0;
    for (i=0; i<n; ++i)
    {
          … … … // twoje obliczenia
    }
    return result;
}
0

obliczenia = sinx_do_trzeciej / 6;
Poza tym to dzielenie wydaje się bez sensu, albo czegoś nie rozumiem (przydałyby się komentarze w kodzie dla zrozumienia).

0

Panie, prostą rzecz tak skomplikować.

Zadanie domowe:

  1. Zamiast ilości iteracji przerywać obliczenia w momencie, gdy |curr| < EPS, gdzie EPS to pewna stała (np. 10-16)
  2. Zamiast stałej, użyć wzoru Taylora wraz z resztą i szacować niezbędną ilość iteracji w oparciu o nią. Zakładamy, że gdy reszta jest poniżej epsilona maszynowego, to stop.
double
my_sin(double x, int i)
{
	double cur, sum, sq;
	int n;

	cur = x;
	sq = x * x;
	sum = cur;

	n = 1;
	do {
		cur *= -1.0 * sq / (2.0 * n) / (2.0 * n + 1.0);
		sum += cur;
		n++;
	} while (n < i);

	return (sum);
}

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