Как вывести сумму ряда?
Вот мой код:
//найти сумму ряда
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
int n;
cout << "n="; cin >> n;
double x;
cout << "x="; cin >> x;
double a = -x * x * x / 2, S = a; //начальные значения
cout << "i\ta\tS\n"; //заголовок таблицы
cout << 1 << "\t| " << a << "\t| " << S << endl; //вывод 1-ого шага
for (int i = 2; i <= n; i++)
{
a *= -x * x / (2 * i * (2 * i +1)); //i - ый член ряда
S += a; // сумма
cout << i << "\t| " << a << "\t| " << S << endl;
}
return 0;
}
Проблема в том что выводится -4,а остальные выведенные значения сильно разнятся от табличных.Помогите исправить пожалуйста. Upd:я ещё не нашёл решение...
Ответы (2 шт):
Автор решения: Zhihar
→ Ссылка
вопрос - зачем вы вынесли отдельно расчёт для n = 1, а не использовали его в основном цикле:
double S = 0;
for (int i = 2; i <= n; i++) {
...
}
а по остальному у вас просто реализована неправильная формула
решите задачу в лоб, не пытайтесь как-то завязаться на предыдущие расчеты:
(-1)^n - это просто (n % 2) ? -1 : 1
x^(2n + 1) - это pow(x, 2*n + 1)
ну а факториал лучше вычислять в отдельной функции - удобнее
не пытайтесь впихнуть все в одно место, меньше ошибок будет и больше понимания кода ;-)
код:
double factorial(const int value) {
if ((value == 0) || (value == 1))
return 1;
double res = 1;
for (int index = 2; index <= value; index ++) {
res *= index;
}
return res;
}
double S = 0;
for (int i = 2; i <= n; i++) {
S += ((n % 2) ? -1 : 1) * pow(x, 2 * n + 1) / factorial(2 * n);
}
Автор решения: vp_arth
→ Ссылка
Вы неправильно записали рекуррентное соотношение.
#include <iostream>
using namespace std;
// a[n] = -1^n * x^(2n+1) / (2n)!
// (2n)! = (2n-2)!*(2n-1)*2n
// Итак:
// a[0] = x
// a[i] = a[i-1] * -1 * x*x / ((2n-1)*2n)
int main()
{
int n;
cout << "n=";
n = 5;// cin >> n;
double x;
cout << "x=";
x = 2;// cin >> x;
double a = x, S = 0; //начальные значения
cout << "i\ta\tS\n"; //заголовок таблицы
for (int i = 1; i <= n; i++)
{
a *= -1 * (x*x) / (2*i*(2*i-1));
S += a;
cout << i << "\t| " << a << "\t| " << S << endl;
}
return 0;
}
