wzór Maclaurina dla sin

0

Jak w tytule, próbuje rozwinać sinx z szeregu Taylora, Korzystam ze wzoru:
screenshot-20190113163214.png

Mój kod wyznacza jednak złe wartości, moze ktoś wie co jest w nim źle?

double mySin(double x, int n){
	double silnia=1;
	double suma=0;
	int i;
	for(i=2*n+1;i>0;i--){
		silnia*=i;
	}
	int k;
	double poww;
	int licznik;
	for(k=0;k<=n;k++){
		poww=pow(x,2*k+1);
		licznik=pow(-1,k);
		suma+=(licznik/silnia)*poww;
		
	}

	return suma;
}
0

Błąd liczenia silni:

  1. Silnia jest dla liczb naturalnych (całkowitych)
  2. W pętli dekrementujesz o 1 a powinno być (2k+1)!
0

Wyprowadź sobie funkcję od liczenia silni. Ułatwi to zadanie.

int silnia(int n)
{
  return (n == 1 || n == 0) ? 1 : silnia(n - 1) * n;
}

double mySin(double x, int n)
{
    double ret = 0.0;
    
    for(int k=0;k<=n;k++)
    {
        double poww = pow(x,(2*k)+1);
        double licznik = pow(-1,k);
        licznik = licznik * poww;
        double mianownik = silnia((2*k)+1);
        ret += (licznik / mianownik);
    }
    return ret;
    
}
0

Działa, testowane z wolframalpha:

int sign(int n) {
	if (n % 2 == 0) return 1;
	return -1;
}

unsigned long fact(unsigned long n) {
	if (n == 0) return 1L;
	unsigned long p = 1L;
	while (n > 0){
		p *= n;
		n--;
	}
	return p;
}

double macLaurin(unsigned long i, double x) {
	double tmp = 1;
	return ( (tmp * sign2(i)) / fact (2 * i + 1) ) * powl(x, 2 * i + 1);
}

double macLaurinSin(double x, unsigned long maxIter) {
	unsigned long i{0};
	double s{0};
	while (i < maxIter) {
		s = s + macLaurin(i, x);
		i++;
	}
	return s;
}

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