C/C++

Вычислить сумму ряда c++

#include <iostream>
#include <cmath>
using namespace std;

double fact(const int n) {
return n <= 0 ? 1.0 : n * fact(n - 1);
}

int main() {
double k, sum, x, f, r = -1.0, eps;
cout << "Enter epsilon value: ";
cin >> eps;
for (x = 1; x <= 15; x += 1) {
k = 0.0;
sum = 0.0;
f = pow(-1.0, k) * pow(x, 2 * k) / fact(k);
sum = sum + f;
while (fabs(f) > eps) {
k++;
f = pow(-1.0, k) * pow(x, 2 * k) / fact(k);
sum += f;
}
cout << "sum = " << sum << endl;
cout << "exp(" << -pow(x, 2) << ") = " << exp(-pow(x, 2)) << endl;
}
return 0;
}
Не могу понять почему сумма всегда равна 1.
Вы какую-то ерунду написали, да и то она у Вас не работает. И никогда такая белиберда толком не заработает - это точно!
Во-первых, экспоненты достаточно больших отрицательных аргументов суммированием членов такого ряда никогда не вычислить без гигантских погрешностей при ограниченной разрядности ЭВМ. Если она у Вас безграничная, тогда другое дело! А для чисел типа double знакопеременный ряд для exp(-x²) вообще у Вас может не сойтись ни к чему правильному.
Во-вторых, в связи с вышесказанным Вы уверены, что Вам вообще надо табулировать функцию exp(-x²) на промежутке [1;15] с шагом h=1, а не, например, брать количество слагаемых от одного до пятнадцати для достаточно небольших х, вводимых с клавиатуры, и смотреть что при этом получится - какая вылезет абсолютная ошибка?
Вот для этого код:
 #include  
#include
#include
using namespace std;
int main()
{
double x, y, Y, s, p, q;
while (true)
{
printf("\033[1mx: ");
scanf("%lf", &x);
y = - x * x;
Y = exp(y);
s = p = 1.;
printf(" 1)%22.16f, err=%13.6e\n", s, s - Y);
for (q = 1; q < 15; q++)
{
p *= y / q;
s += p;
printf("%2.0f)%22.16f, err=%13.6e\n",
q + 1, s, s - Y);
}
}
}
Как видите - никаких идиотских pow'ов и fact'ов здесь нет, да и быть не должно! Смотрим результаты:Видите как ошибки вычислений функции при помощи ряда нарастают при |х|→∞ ? Даже уже при х=±2 пятнадцати слагаемых явно недостаточно. А теперь заново для себя решите что Вам действительно нужно...
ЭШ
Эльдар Шарипов
66 572
Лучший ответ

Похожие вопросы