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

Станислав Коциевский
Станислав Коциевский

Latest posts by Станислав Коциевский (see all)

2 thoughts on “MLoop14

  1. — Как результат с точностью 0,001 может равняться 1,83049. Три знака после запятой или пять? Остальные тесты тоже посмотрите.
    — «модуль разницы » может разности?
    — Вы пишите «s*=(-1)». А почему не просто «s = -s»? Результат будет тот же, но не так витиевато написано.