#c #формулы
Есть вот такая формула, надо сравнить левую часть и правую с использованием такого ряда. В задании сказано посчитать правую часть, то бишь формулу суммы, 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); }
Ответы
Ответ 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; в последующей формуле оно просто умножится на нужный коэффициент.Ответ 2
Выражение равно Σ f(n), где f(x, n) = (2n)!xn+1 / (n!)2(n+1) Предыдущий член суммы: f(x, n-1) = (2(n-1))! xn / ((n-1)!)2n Заметим, что (2n)! / (2(n-1))! = 2n(2n-1) xn+1 / xn = x n!2/(n-1)!2 = n2 (n + 1) / n = 1 + 1/n Тогда, f(x, n) / f(x, n-1) = 2n(2n-1) x / (n2 (1+1/n)) Или, так как n(1+1/n) = n+1 2x(2n-1) / (n+1) Реализация: double kn(int n, double x) { return 2*(2*n-1)*x / (n+1); } double fn(double fn_1, int n, double x) { return fn_1 * kn(n, x); } double EPS = 1e-15; double sum(double x) { double current = x; double sum = current; int n = 0; do { current = fn(current, ++n, x); sum += current; } while (fabs(current) > EPS); return sum; } int main() { printf("sum(%f) = %f\n", -0.25, sum(-0.25)); printf("sum(%f) = %f\n", 0.25, sum(0.25)); }
Комментариев нет:
Отправить комментарий