Страницы

Поиск по вопросам

пятница, 19 октября 2018 г.

Составить рекуррентную формулу на Си (от n=0, это важно)

Есть вот такая формула, надо сравнить левую часть и правую с использованием такого ряда. В задании сказано посчитать правую часть, то бишь формулу суммы, 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;
в последующей формуле оно просто умножится на нужный коэффициент.

Комментариев нет:

Отправить комментарий