Есть вот такая формула, надо сравнить левую часть и правую с использованием такого ряда.
В задании сказано посчитать правую часть, то бишь формулу суммы, c использованием рекуррентной формулы. Помогите написать часть кода на Си, где будет считать эту сумму с циклом DO WHILE и рекуррентной формулой! Нельзя использовать pow, надо использовать отдельную переменную для суммирования. Я такое сделал с функцией, но сказали, что надо рекуррентную формулу, а вывести ее у меня не выходит.
s = 0; xn = x; n = 0;
do {
an = (factorial(2 * n) * xn) / (factorial(n)*factorial(n) * (n + 1));
s += an;
n++; xn *= x;
} while (fabs(an) > eps && n <= lim);
int factorial(int n) {
return (n < 2) ? 1 : n * factorial(n - 1);
}
Ответ
Ты уже используешь рекуррентный вариант для xn+1, но продолжаешь вычислять факториал рекурсивно - надо от него тоже избавиться.
В формуле есть следующие фрагменты:
(2n)!
x^(n+1)
(n!)^2
(n+1)
Что с ними произойдёт при увеличении n на 1?
(2(n+1))! = (2n+2)! = (2n)! * (2n+1) * (2n+2)
x^((n+1)+1) = x^(n+1) * x
((n+1)!)^2 = (n!*(n+1))^2 = (n!)^2 * (n+1)^2
((n+1)+1) = (n+1) + 1 = (n+1) * (1 + 1/(n+1))
Пересчитываем коэффициент для следующего n:
*= (2(n-1)+1) * (2(n-1)+2) = (2n-1) * 2n
*= x
/= n^2
/= (1 + 1/n)
Получается формула
y *= (2*n-1) * 2*n * x / (n*n * (1 + 1/n));
Если разделить на n числитель и знаменатель(сократить), получится:
y *= 2 * x * (2*n-1) / (n + 1);
Ну это если я нигде не ошибся в вычислениях. Если ошибся, то надо подправить :)
n=0, это важно
Надо просто задать соответствующее начальное значение при n=0:
y = x;
в последующей формуле оно просто умножится на нужный коэффициент.
Комментариев нет:
Отправить комментарий