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]

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

Ю3.16

Бровко Ілля
Бровко Ілля

Latest posts by Бровко Ілля (see all)

Задача

Сравнить скорость сходимости при вычислении числа [latex]e[/latex] с помощью ряда и бесконечной дроби:

[latex]e=2+\frac{1}{2!}+\frac{1}{3!}+\frac{1}{4!}+…[/latex]; [latex]e=1+\frac{1}{1-\frac{1}{2+\frac{1}{3-\frac{1}{2+\frac{1}{5-…}}}}}[/latex]

У нас дан ряд(row) и бесконечная дробь(inf). Для разложения числа  [latex]e[/latex] в ряд использована функция вычисления факториала. Задаем начальные переменные и вычисляем основание натурального логарифма. При достижении заданной точности [latex]E[/latex] цикл вычислений ряда прекращается, и начинается вычисление по методу цепной дроби с заданным в первой части программы количеством итераций (для корректного сравнения скорости сходимости, количество итераций должно быть одинаково).

Алгоритм вычисления представляет собой цикл, в который вложен еще один рекурсивный цикл. Первый цикл do подставляет во второй цикл количество итераций. Во втором цикле for происходит основное вычисление цепной дроби, посредством проверки четных и нечетных шагов. Проверка на четность происходит делением текущей по счету итерации  на 2 с остатком. Если делится без остатка, то итерация четная, иначе- нечетная.

E

Количество итераций ряда(row)

i

Количество итераций цепной дроби(inf)l Комментарий
0.00001 9 7

Бесконечная дробь быстрее сходится к числу е, чем ряд.

Тест пройден.

0.0000002 11 9

Бесконечная дробь быстрее сходится к числу е, чем ряд.

Тест пройден.

0.00078 7 6

Бесконечная дробь быстрее сходится к числу е, чем ряд.

Тест пройден.

0.0004 7 6

Бесконечная дробь быстрее сходится к числу е, чем ряд.

Тест пройден.

При схождении к числу [latex]e[/latex] с точностью [latex]E[/latex] цепная дробь будет  делать это быстрее, чем ряд.

Ниже представлена сама программа(C++).

Код на Java:

 

Также вы можете воспользоватся ссылкой (C++)/ссылкой (Java), для ознакомления с программой.

Ю3.24

Задача. Композиция [latex]n[/latex]- ого порядка [latex]f^{[n]}(x)[/latex] функции [latex]f(x)[/latex] назовем результат [latex]n[/latex]- кратного вычисления функции [latex]f [/latex], то есть [latex]f^{[1]}(x)=f(x)[/latex], [latex]f^{[ 2]}(x)=f(f(x))[/latex], и так далее. Для заданных [latex]n[/latex] и [latex]x[/latex] вычислить [latex] (expln)^{[n]} (x)[/latex] и [latex] exp^{[n]} ln^{[n]} (x)[/latex], результаты сравнить с [latex] x[/latex], то есть вывести значения аргумента, композиции функции и разности между ними.

[latex]x[/latex] [latex]n[/latex] [latex](expln)^{[n]}(x)[/latex] [latex]exp^{[n]} ln^{[n]}(x)[/latex] [latex]x-(expln)^{[n]}(x)[/latex] [latex]x-exp^{[n]}ln^{[n]} (x)[/latex]
3 3 3 3 -4.44089e-16 -4.44089e-16
3 4 3 nan -4.44089e-16 nan

 

Задаем функцию, которая будет возвращать нам [latex]double[/latex] и иметь два параметра типа [latex]double[/latex] и [latex]int[/latex](число [latex]n[/latex]- количество композиций). В ней проверяем равна ли  переменная нулю latex[/latex], если равна, то нет необходимости производить композицию, если же не равна нулю, то присваиваем [latex]x[/latex] значение функции  и возвращаем [latex]x[/latex], если [latex]n<=1[/latex], иначе вызываем эту же функцию, но на порядок ниже latex[/latex] и так пока [latex]n==1[/latex] (то есть задаем рекурсию). Точно также описываем формулы [latex]exp[/latex] и [latex]ln[/latex] (В C++ [latex]log(x)[/latex]- это логарифм числа [latex]x[/latex] по основанию [latex]e[/latex]). В основной программе вызываем эти две функции и выводим их значения  и разность между аргументом и значением функции для определения погрешности. (Возможны такие варианты, когда у вас будет логарифм отрицательным, что приведет к ответу [latex]nan[/latex])

Java

 

Ю3.27

Сорокина Полина
Сорокина Полина

Latest posts by Сорокина Полина (see all)

Задача:  Численно убедиться в справедливости равенства, для чего для заданного значения аргумента [latex]x[/latex] вычислить левую его часть и разложение, стоящее в правой части с заданной погрешностью [latex]\varepsilon [/latex]. Испытать разложение на сходимость при разных значениях аргумента, найти скорость сходимости, для чего вывести число итераций [latex]n[/latex] (слагаемых или сомножителей), необходимых для достижения заданной точности. В некоторых задачах указан интервал допустимых значений аргумента [latex]x[/latex], при которых сходимость гарантируется.

[latex]\ln \left(1-x \right)=-\left(x+\frac{x^{2}}{2}+\frac{x^{3}}{3}+\cdot \cdot \cdot +\frac{x^{n}}{n}+\cdot \cdot \cdot \right)[/latex],   [latex]x<1[/latex]
[latex]x[/latex] [latex]eps[/latex] Левая часть Правая часть Количество шагов
0.1 0.001 -0.105361 -0.105 3
0.1 0.000001 -0.105361 -0.105360 6
0.5 0.001 -0.693147 -0.692262 8
0.5 0.000001 -0.693147 -0.693146 17
0.95 0.001 -2.995732 -2.994775 101
0.95 0.000001 -2.995732 -2.995731 222

C++:

Java:

Для переменных [latex]x, eps, a, b, c[/latex] я использовала double, так как [latex]x<1[/latex] и [latex]eps[/latex] ([latex]\varepsilon [/latex]) — вещественные числа, которые вводит пользователь, [latex]a, b, c[/latex] используются для вычислений, поэтому тоже вещественные. Для переменной [latex]n[/latex] (в неё записывается количество шагов цикла) я использовала тип int, т.к. это целые числа.

Сперва вычисляем значение переменной [latex]a[/latex] — левую часть равенства.

Для вычисления правой части используем цикл for, который работает пока [latex]\left|a-b \right|\geq eps[/latex] (т.е. различие между правой и левой частью больше, чем погрешность, заданная пользователем).
При каждом шаге переменная [latex]n[/latex] увеличивается на единицу для подсчёта скорости сходимости.
Переменная [latex]c[/latex] обозначает элемент суммы, а [latex]b[/latex] — сумму элементов в правой части равенства.

Эта задача на Ideone:
C++
Java

Ю1.7

Швандт Максим Альбертович
Швандт Максим Альбертович

Latest posts by Швандт Максим Альбертович (see all)

Задача: Селекция. Селекционер вывел новый сорт зерновой культуры и снял с опытной делянки [latex]k[/latex]  кг семян. Посеяв 1 кг семян, можно за сезон собрать [latex]p[/latex] кг семян. Через сколько лет селекционер сможет засеять новой культурой поле площадью [latex]s[/latex] га, если норма высева [latex]n[/latex] кг/га?

Тесты:

k p s n result
1 1 1 1 error
1 2 3 4 2
 3.5 11 56 3.77 1
 34 55.4 109 31.456 error

Исходный  код программы:

Версия кода на языке Java:

Ссылка:http://ideone.com/2TY3PH

Программы вычисляет результат по найденной формуле:

                [latex]\frac{log(\frac{(n \times s)}{k})}{log(p)}[/latex]

Поскольку используется функция логарифма, необходимо включить заголовок math библиотеки математических функций.

 

Программа состоит из следующих частей:

  1. Объявление переменных k,p,s,n типа float для хранения входных данных
  2. Вывод приветствия
  3. Ввод пользователем значений переменных k,p,s,n с помощью scanf
  4.  Вывод исходных данных
  5. Вычисление и вывод результата по формуле с предварительной проверкой значения p, которое не должно равняться 1, так как находиться в формуле под логарифмом.
  6. Завершение программы

 

Программа проверялась по таблице наборов входных данных. Некоторые наборы содержали неправильное значение p = 1. Для этих значений программа выдала предусмотренное сообщение об ошибке. Для правильны данных результат совпал с вычисленным вручную.