Помогите пожалуйста найти значения функции sinx/x используя ряд Тейлора

Найти значения функции sinx/x используя ряд Тейлора на интервале от Хнач до Хкон з интервалом dx и точность е. Написал функцию но после второй итерации значения не правильно. Пишу в c++ builder, ниже код:

{
    long double xs, xe, dx, e, y;
    xs = StrToFloat(Edit1 -> Text);
    xe = StrToFloat(Edit2 -> Text);
    dx = StrToFloat(Edit3 -> Text);
    e = StrToFloat(Edit4 -> Text);;
    Memo1->Lines->Append("f\tx\tn");
    for (long double x = xs; x < xe + dx/2; x += dx) {
        int n = 0;
        long double an = x;
        y = 0;
        while(fabs(an) > e){
            y+=an;
            n++;
            an*= ((pow(-1, n))*pow(x, 2*n))/fact(2*n+1);
        }
        Memo1->Lines->Append(FloatToStrF(y, ffFixed, 10, 2) + "\t" + FloatToStrF(x, ffFixed, 10, 2)
            + "\t" + IntToStr(n));
    }
}
//---------------------------------------------------------------------------
long double fact(int N)
{
    if(N < 0)
        return 0;
    if (N == 0)
        return 1;
    else
        return N * fact(N - 1);
}

Ответы (1 шт):

Автор решения: Павел Ериков

Вообще у вас ошибка в том, что если вы хотите искать значение sin(x)/x, то формула Тейлора будет выглядеть так:

sin(x)/x = 1 - x^2 / 3! + x^5 / 5! + ... + (-1)^n-1 * x^(2n - 2)/ (2n - 1)!

То есть вам нужно умножать не на x ^ (2n), а на x ^ (2n - 2).

Так же разве не лучше рассчитывать сразу факториал и степень, а не каждый раз по новой?

Вот пример кода если делать в консоли:

void funcTaylor(float xStart, float xFinish, float xStep, float eps) {
    long double fact = 1;
    long double pow_x = 0;
    long long int c = 0;
    int sign = 1;
    long double x = xStart;
    long double temp;
    long double sinx_x;
    long double an = 0;

    while (x + xStep <= xFinish) {
        fact = 1;
        pow_x = 1;
        sign = 1;
        c = 1;
        sinx_x = sin(x) / x;
        temp = 0;
        do {
            an = (sign * pow_x) / fact;
            temp += an;
            sign *= -1;
            fact = fact * (c + 1) * (c + 2);
            c += 2;
            pow_x *= x * x;
        } while (/*fabs(an) > eps*/sinx_x <= temp - eps || sinx_x >= temp + eps);
        cout << temp << " " << x << endl;
        x += xStep;
    }
}
→ Ссылка