Правильно ли я понял задачу?

Рейтинг: 1Ответов: 1Опубликовано: 09.09.2014

Найти сумму ряда с точностью =10, общий член которого а=2*n!/(3n)!

Как-то дошел до такого кода:

#include <iostream>
#include <math.h>

using namespace std;

double Sum(double eps) {
    double s, an;
    int n;
    n = 1;
    an = 1.0 / 3.0;// a1=(2*1!)/(3!)
    s = 0;
    while (fabs(an) > eps) {
        s += an;
        n++;
        an *= (n + 1.0) / ((3. * n + 1.0) * (3. * n + 2.0) * (3. * n + 3.0));
    }
    return s;
}

int main() {
    double accuracy;
    cout << "accuracy = ";
    cin >> accuracy;
    cout << Sum(accuracy);
    return 0;
}

Но теперь не могу понять, откуда я вообще это взял :) Кто может объяснить, сделал ли я правильно.

Ответы

▲ 1Принят

В общем-то идея верная, только реализация хромает.

Просто перескажу, что нужно сделать.

В задаче дан ряд, к сожалению,я забыл достаточные и необходимые условия схождения, но очевидно, что при n->inf выражение 2*n!/(3n)! стремится к 0. А значит, можно вычислить ряд до некоторой точности, т.е. наступит такой момент, когда при достаточно большом n новое слагаемое будет меньше заданной точности и соответственно не будет менять значение суммы в пределах этой точности.

Теперь нужно определить зависимость между a(n) и a(n+1);
для этого нужно разделить a(n+1) / a(n) = ( 2*(n+1)! / (3(n+1))! ) / ( 2n! / (3n)! )

Ты выделил её верно.

a(n+1) = an * ( (n+1) / ( (3n + 1) * (3n + 2) * (3*n + 3) );

т.е. должен быть такой ряд: 2*1!/3! + 2*2!/6! + 2*3!/9!;

Затем в цикле, меняя n от 1 до бесконечности, пока новое слагаемое больше заданной точности, как только станет меньше, то всё, на сумму в пределах этой точности оно уже не повлияет.

Одну ошибку я заметил только здесь:

n++;
an *= (n + 1.0) / ((3. * n + 1.0) * (3. * n + 2.0) * (3. * n + 3.0));

У тебя n -- выше установлено в 1 и для an ты вычислил a1.
А затем ты вычисляешь новое an т.е. a2, но n увеличиваешь перед этим. И выходит, что ты пропускаешь a2 и вычисляешь сразу a3, и тоже неверно, т.к. умножаешь к a1. Сложно объяснился, но, надеюсь, ты понял. n++ нужно увеличить после вычисления. Либо в формуле везде вместо n использовать (n-1).