Как вывести сумму ряда?

Дано:Сумма ряда

Вот мой код:

//найти сумму ряда
#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;
}
→ Ссылка