MLoop 17

Задача

Вычислите с точностью [latex]\varepsilon[/latex] значение функции [latex]f\left( x \right) = \ln \left( 1-x^2 \right)[/latex] . При вычислениях допустимо использовать только арифметические операции.

Входные данные

В одной строке заданы значение переменной [latex]x[/latex] и точность вычислений [latex]\varepsilon[/latex].
[latex]\left | x \right |< 1[/latex]

Выходные данные

Значение функции в точке [latex]x[/latex] .

Тесты

[latex]\varepsilon[/latex] [latex]x[/latex]  [latex]ln(1-x^2)[/latex] Результат
0.001 0.5 [latex]ln(0.75)[/latex] -0.287435
0.0001 0.5 [latex]ln(0.75)[/latex] -0.287671
0.01 0.1 [latex]ln(0.99)[/latex] -0.01005
0.001 -0.1 [latex]ln(0.99)[/latex] -0.01005
0.1 0 [latex]ln(1.00)[/latex] 0
0.01 0 [latex]ln(1.00)[/latex] 0

 

Код программы

ideone.com

 

Решение

Функцию [latex]f\left( x \right) = \ln \left( 1-x^2 \right)[/latex] можно представить в виде:
[latex]ln\left ( 1-x^2 \right )= ln\left ( 1-x \right )\left ( 1+x \right ) = ln\left ( 1-x \right )+ln\left ( 1+x \right )[/latex] (по свойствам логарифма).

Для решения задачи необходимо воспользоваться формулой Тейлора  для натурального логарифма с опорной точкой [latex]x_{0}=0[/latex] (ряд Маклорена). Для функции [latex]ln\left (1+x\right )[/latex] она имеет следующий вид:

[latex]ln\left (1+x\right )=x-\frac{x^{2}}{2}+\frac{x^{3}}{3}-\cdots+\frac{\left ( -1 \right )^{n-1}}{n}x^{n}=\sum_{n=1}^{\infty}\frac{\left (-1\right )^{n-1}}{n}x^{n}[/latex]

Подставив в формулу [latex]-x[/latex] вместо [latex]x[/latex] , получим:

[latex]ln\left (1-x\right )=-x-\frac{x^{2}}{2}-\frac{x^{3}}{3}-\cdots -\frac{x^{n}}{n}=-\sum_{n=1}^{\infty}\frac{x^{n}}{n}[/latex]

Тогда,

[latex]ln\left (1+x\right )+ln\left (1-x\right )=\sum_{n=1}^{\infty}\frac{\left (-1\right )^{n-1}}{n}x^{n}-\sum_{n=1}^{\infty}\frac{x^{n}}{n}=[/latex] [latex]=\sum_{n=1}^{\infty }\left[\frac{\left (-1\right )^{n-1}}{n}x^{n}-\frac{x^{n}}{n}\right]=\sum_{n=1}^{\infty }\frac{x^{n}\left (\left (-1\right )^{n-1}-1\right )}{n}=[/latex][latex]=-x^{2}+0-\frac{x^{4}}{2}+0-\frac{x^{6}}{3}+0-\cdots[/latex]

Так как при нечетном [latex]n[/latex] члены данного ряда обращаются в ноль, его можно записать в виде:

[latex]-\sum_{0}^{\infty}\frac{x^{2n+2}}{n+1}=-x^{2}-\frac{x^{4}}{2}-\frac{x^{6}}{3}-\cdots-\frac{x^{2n+2}}{n+1}[/latex]

Далее необходимо найти рекуррентную формулу для членов данного ряда.

[latex]\frac{a_{n}}{a_{n-1}}=\frac{x^{2n+2}}{n+1}\cdot\frac{n-1+1}{x^{2\left ( n-1 \right )+2}}=\frac{x^{2}\cdot n }{n+1}[/latex]

Затем необходимо суммировать до тех пор пока очередное слагаемое не будет меньше заданной точности.

2 thoughts on “MLoop 17

  1. Очень хорошо, что Вы помните о необходимости рекуррентной формулы при вычислении очередного члена ряда. плохо, что не поняли зачем она нужна. Но это возможно моя вина — плохо объяснил.
    Мы используем рекуррентную формулу для в тех случаях, когда она уменьшает объём вычислений. Например если нам нужны последовательные степени числа, факториалы, числа Фибоначчи и т.п.
    У Вас в числителе общего члена ряда степень. Конечно её нужно вычислять рекуррентной формулой. А в знаменатель Вы уже вычисляете рекуррентно когда пишите i++. Если делать так, как у Вас ai*=x*x*i/(i+1);, то просто происходит домножение на некоторое число, на которое потом разделят. Т.е. просто накапливается вычислительная погрешность.