Помогите пожалуйста найти значения функции 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;
}
}