Задача
Вычислите с точностью [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 |
Код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <iostream> #include <cmath> using namespace std; int main() { double E, logarithm = 0, ai = 1, p = 1, x; int i = 1; cin >> x >> E; while(ai > E){ p *= x*x; // вычисление числителя члена ряда ai = p / i; // вычисление члена ряда logarithm -= ai; i++; } cout << logarithm; return 0; } |
Решение
Функцию [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]Затем необходимо суммировать до тех пор пока очередное слагаемое не будет меньше заданной точности.
Очень хорошо, что Вы помните о необходимости рекуррентной формулы при вычислении очередного члена ряда. плохо, что не поняли зачем она нужна. Но это возможно моя вина — плохо объяснил.
Мы используем рекуррентную формулу для в тех случаях, когда она уменьшает объём вычислений. Например если нам нужны последовательные степени числа, факториалы, числа Фибоначчи и т.п.
У Вас в числителе общего члена ряда степень. Конечно её нужно вычислять рекуррентной формулой. А в знаменатель Вы уже вычисляете рекуррентно когда пишите i++. Если делать так, как у Вас ai*=x*x*i/(i+1);, то просто происходит домножение на некоторое число, на которое потом разделят. Т.е. просто накапливается вычислительная погрешность.
Мне кажется, что так лучше.
Зачтено.