MLoop 9

Условие

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

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

В одной строке задано два числа [latex]x[/latex] и [latex]E[/latex].

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

В одной строке вывести значение функции [latex]f\left( x \right) = \text{sh}x[/latex] и [latex]\text{sinh}x[/latex] (для проверки).
[latex]\text{sh} \left( x \right) = x — \frac {x^{3}}{3!}+\frac{x^{5}}{5!} — \cdots = \displaystyle\sum_{n=0}^{\infty}\frac{1}{(2n+1)!}x^{ 2n+1 },x\in{C}[/latex]

Тесты

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

(мои и стандартной функции)

1.57 1e-10000 2.2993 2.2993
3.14 1e-100000 11.5303 11.5303
0 0.1 0 0
1.05 1e-1000 1.25386 1.25386
0.785 0 0.868144 0.868144
0.52 0.01 0.543435 0.543754

Код

Решение

Для того чтобы найти с точностью значение функции, в данном варианте это [latex]f\left( x \right) = \text{sh}x[/latex] — гиперболический синус, надо воспользоваться рядом Тейлора. Находим следующий член ряда Тейлора и прибавляем к функции и так пока не дойдем до члена, который будет меньше, либо равен точности. Чтобы проверить на правильность наших вычислений можно воспользоваться уже готовой функцией нахождения гиперболического синуса [latex]\text{sinh}x[/latex].
Код программы

MLoop7

Задача

Вычислите с точностью \epsilon значение функции f\left( x \right) = \tan x. При вычислениях допустимо использовать только арифметические операции.

Решение

Функцию [latex]f(x)=\tan x [/latex] можно представить в виде: [latex]f(x)=\frac{\sin x}{\cos x}[/latex]
(по свойствам тангенса). Поэтому будем раскладывать в ряд две функции: [latex]\sin x[/latex] и [latex]\cos x[/latex].

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

[latex]f(x)=x-\frac{x^{3}}{3!}+\frac{x^{5}}{5!}-\cdots=\sum_{n=0}^{\infty}(-1)^{n}\frac{x^{2n+1}}{(2n+1)!}[/latex]

А для [latex]f(x)=\cos x[/latex]:

[latex]f(x)=1-\frac{x^{2}}{2!}+\frac{x^{4}}{4!}-\cdots=\sum_{n=0}^{\infty}(-1)^{n}\frac{x^{2n}}{(2n)!}[/latex]

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

[latex]\frac{a_n}{a_n-_1}=\frac{-x^{2}}{(2n+2)(2n+3)}[/latex];

[latex]\frac{b_n}{b_n-_1}=\frac{-x^{2}}{(2n+1)(2n+2)}[/latex]

При помощи функции fmod удалим период, так как тангенс [latex]\pi[/latex] периодичная функция.

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

Код

 

Тесты

Входные данные Выходные данные
0.42 0.001 0.446569
1.52 0.001 19.9377
3.1415 0.0001 -0.000113798

Задача взята отсюда.

Код программы на Ideone.com.

MLoop14

Задача

 

Вычислите с точностью \varepsilon значение функции f\left( x \right) = \text{cotan}x. При вычислениях допустимо использовать только арифметические операции.

Тесты

Аргумент функции Точность Результат программы Результат сайта wolframalpha
1,6 0,000001 -0,029212 -0.0292120
0,5 0,001 1,83 1,83049
2 0,00001 -0,45766 -0,45765155….
-0,4 0,0001 -2,3652 -2,36522
-1 0,0001 -0,6421 -0,64209261…

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

 

Решение

Наиболее простым решением данной задачи оказалось рассмотреть котангенс, как отношение косинуса к синусу и работать не с рядом Тейлора для котангенса, а с рядами Маклорена для синуса и косинуса. Причем, удобно работать с ними в одном цикле. Оказывается, слагаемые этих рядов можно получить друг из друга.

Ряд Маклорена для синуса: [latex]\sin{x}= [/latex] [latex] x — \frac{x^{3}}{3!} + \frac{x^{5}}{5!} — [/latex] …

Ряд Маклорена для косинуса: [latex]\cos{x}= [/latex] [latex]1 — \frac{x^{2}}{2!} + \frac{x^{4}}{4!} — [/latex] …

Отсюда видно, что [latex]n[/latex]-е слагаемое ряда для синуса равно [latex] n[/latex]-ому слагаемому ряда для косинуса, умноженному на [latex] \frac{x}{2 \cdot n+1} [/latex]. Запускаем цикл, работающий, пока модуль разности между предыдущим и следующим значением котангенса больше заданной точности, в котором каждый раз прибавляем к рядам их следующие слагаемые.

В функции int main() считаем количество знаков числа, которое нам нужно вывести, через цикл, а затем пользуемся функцией precision и выводим результат.

Примечание: Поскольку в условии разрешается пользоваться только арифметическими операциями, а модуль не совсем является таковой, я не стал пользоваться стандартной функцией Abs(), а вписал в программу ее замену. 

ссылка на код на ideone

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]

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

MLoop 10

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

Решение задачи:

Для нахождения значения функции  f\left( x \right) = \text{ch}x (гиперболический косинус) с точностью [latex]\varepsilon[/latex]  воспользуемся формулой Тейлора (разложение функции в бесконечную сумму степенных функций):[latex]chx=1+\frac{x^2}{2}+\frac{x^4}{4}+[/latex]…[latex]=\sum_{n=0}^{\infty}\frac{1}{(2n+1)!}\times x^{2n}[/latex]. [latex]x_n=\frac{1}{(2n+1)!}\times x^{2n}[/latex], тогда [latex]x_{n-1}=\frac{1}{(2(n-1)+1)!}\times x^{2(n-1)}[/latex]. Рекуррентное соотношение [latex]x_n[/latex] и [latex]x_{n-1}=[/latex][latex]\frac{x_n}{x_{n-1}}=\frac{x^2}{2n\times(2n-1)}[/latex].

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

Тесты:

Входные данные Выходные данные
x e ch(x)
9 0.01 4051.54
16 0.0001 4.44306e+06
0.85 0.00001 1.38353
0.11 0.001 1.00606

Здесь можно посмотреть решение задачи на ideone.com

MLoop 11

Условие задачи

Вычислите с точностью \epsilon значение функции f\left( x \right) = \arccos x. При вычислениях допустимо использовать только арифметические операции.

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

 

Тесты

Входные данные Выходные данные Арккосинус
e x arccos = ([latex]\pi[/latex]/2 — f) Арккосинус
0.000001 0.866 0.523651 0.5236495809
0.01 0.5 1.04727 1.0471975512
0.00000000000001 0.35 1.21323 1.2132252231
0.00001 0.99 0.141873 0.1415394733

 

Решение

Для того, чтобы представить функцию f\left( x \right) = \arccos x необходимо воспользоваться формулой Тейлора, а именно рядом Маклорена для арккосинуса. Она имеет следующий вид:

[latex]\arccos x=\frac{\pi}{2}-\sum_{n=1}^\infty\frac{(2n)!}{4^{n}(n!)^{2}(2n+1)}x^{2n+1}[/latex]

Чтобы при вычислениях использовать только арифметические операции необходимо преобразовать это выражение. Первый член данной суммы — [latex]x[/latex]. Нужно узнать на что нужно домножить первый элемент, чтобы получить следующий. Для этого следует найти, чему будет равно отношение [latex]\frac{a_{n+1}}{a_{n}}[/latex]. В результате мы получим следующее: [latex]\frac{x^{2}(2n+1)^{2}}{2(n+1)(2n+3)}[/latex].

В функции [latex]f[/latex] переменная [latex]p[/latex] — слагаемые нашей суммы, а изначально — первый элемент. Также, в начале мы присвоили переменной суммы значение первого элемента. Затем в цикле мы домножаем наше слагаемое на полученный ранее коэффициент и складываем его с суммой до тех пор, пока значение [latex]p[/latex] превышает значение заданной точности [latex]e[/latex]. В основной части программы мы лишь выводим разность [latex]\pi/2[/latex] и нашей суммы. Это и будет значение арккосинуса.

 

Код на ideone.com

MLoop 12

Задача. MLoop 12

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

Тесты

Входные данные Выходные данные
Точность Аргумент [latex]\arctan x[/latex] Погрешность
1 1 0.5 0.5 0.0363524
2 10 0.82 0.669293 0.0175249
3 100 0.77 0.652823 0.00335552
4 1000 1 0.666667 0.118731

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

Для запроса на выполнение нажать здесь.

Решение

Для того, чтобы найти приблизительное значение [latex]\arctan x[/latex] возпользуемся формулой ряда Тейлора: [latex]\arctan x = x — \frac{x^3}{3} + \frac{x^5}{5} -[/latex] … [latex]= \sum_{n=0}^{\infty}\frac{(-1)^n}{2n+1}\cdot x^{2n+1}[/latex] для всех [latex]|x| \le 1[/latex]. Представим каждый член суммы как [latex]a_n = \frac{(-1)^n\cdot a^{2n+1}}{2n+1}[/latex], и будем рекурсивно вычислять числитель данной дроби [latex]m_n = m_{n-1} \cdot (- a^2)[/latex]. Тогда, будем находить значение очередного члена ряда по формуле [latex]a_n = \frac{m_n}{2n + 1}[/latex], пока [latex]a_n > \frac{1}{\varepsilon}[/latex].

MLoop6

Условие задачи:

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

Алгоритм решения:

Для решения данной задачи я использовал Ряд Маклорена:.
[latex]\cos x = 1-\frac {x^{2}}{2!}+\frac{x^{4}}{4!}-\cdots = \displaystyle\sum_{n=0}^{\infty}\frac{(-1)^{n} }{(2n)!}x^{ 2n },x\in{C}[/latex].

Тесты:

X   E Answer
1 0.0001 0.540278
1 0.000001 0.540303
-1 0.0001 0.540278
5 0.0001 0.283625

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

 

Объяснение Кода:

В коде используются 7 переменных а именно: [latex]x[/latex], [latex]x2[/latex], [latex]c[/latex], [latex]e[/latex],  [latex]n[/latex], [latex]f[/latex], [latex]z[/latex].
Переменная [latex]x[/latex] отвечает за [latex]x[/latex],   [latex]x2[/latex] за [latex]{ x }^{ n }[/latex],     [latex]c[/latex] за [latex]\cos x[/latex],  [latex]e[/latex] за [latex]\varepsilon[/latex] (epsilon-точность вычисления),  [latex]n[/latex] за порядковый номер,   [latex]f[/latex] за [latex]n![/latex]   и   [latex]z[/latex] за [latex]{ (-1) }^{ n }[/latex].

Ссылка на код в ideone

 

 

 

 

Ю 3.31

 Задача: Численно убедится в справедливости равенства для заданного значения аргумента [latex]x[/latex] на заданное значение погрешности [latex]\varepsilon [/latex]. вывести число итераций.

[latex]cosx=1-\frac { { x }^{ 2 } }{ 2! } +\frac { { x }^{ 4 } }{ 4! } -\dots +{ (-1) }^{ n }\frac { { x }^{ 2n } }{ (2n)! }+\dots[/latex]

x  Delta  Value  Step’s
0    [latex]0[/latex] 0.0000001 1 1
3.14     [latex]\pi[/latex]  0.00001 -1 7
1.57    [latex]\frac { \pi }{ 2 }[/latex]  0.00001 0.000795865 5
1.05    [latex]\frac { \pi }{ 3 }[/latex]   0.00001 0.497571 4
2.09    [latex]\frac { 2\pi }{ 3 }[/latex]   0.00001 -0.496189 6

Код программы на С++

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

Ссылка на Java

Можно заметить, что каждый последующий член ряда рекурсивно выражается через предыдущий. Это позволяет нам значительно уменьшить количество операций. Суть решения в том, что получая аргумент мы фиксируем левую часть выражения, вычисляя значение косинуса от данного аргумента, а затем проверяем сколько слагаемых нам потребуется, чтобы вторая часть отличалась от первой на заданное значение дельта. Цикл программы выводит значение правой части на каждом шагу, а как ответ показывает значения левой и итоговой правой частей.