Ошибка в Вычислении ряда(функция)
#include <iostream> //
#include <math.h> //
using namespace std;
const int N = 3;
double sinus(double x) {
double res;
res = sin(x) / x;
return res;
}
double chislo(double z) {
int n;
double s = z, q = z;
double e;
for (n = 1; n <= N; n++) {
q *= (-1)*z * z / (2 * n) / (2 * n + 1);
s += q;
}
e = (pow(-1, n) * pow(z, 2*n)) / s;
return e;
}
int main()
{
int n;
double x;
double z;
cout << "Enter x= ";
cin >> x;
z = x;
x = sinus(x);
cout << x << endl;
cout << "--------"<<"\n";
z = chislo(z);
cout << z << endl;
}
Функция "chislo" неправильно вычисляет, а я не могу найти ошибку :(

Ответы (1 шт):
Автор решения: Swift - Friday Pie
→ Ссылка
При нахождении рядов Тейлора следует избегать повторных вычислений и вычислять степени рекурсивно. Из-за того, что факториал растет очень быстро, при вычислениях с плавающей запятой теряются разряды и точность схождения.
Реализация вычисления N-й суммя ряда Тейлора для функции sinc может выглядеть вот так:
double taylor_sinc(double x, int N) {
double x_2 = x*x , sinc = 1, elem = 1;
for(int n = 1; n < N; ++n ){
elem *= x_2;
// (2n + 1)! = (2(n-1) + 1)! * (2n) * (2n + 1)
elem /= - (4*n*n + 2*n);
sinc += elem;
}
return sinc;
}
Однако, в задании предлагается устанавливать границу ряда, что звучит как незнакомый термин, но явно это не граница сходимости - она зависит только от самого ряда.