Задача
Вычислите с точностью значение функции
. При вычислениях допустимо использовать только арифметические операции.
Тесты
Аргумент функции | Точность | Результат программы | Результат сайта 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… |
Код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
#include <iostream> using namespace std; long double f(long double s) //модуль числа { if (s<0) s=-s; return s; } long double cotan (long double x, long double e) { long double sin=x, cos=1, cotan=0, a=1; int n=2; while (f(cos/sin-cotan)>e) { cotan = cos/sin; a*=-x*x/((n-1)*n); cos+= a; sin+= a*x/(n+1); n+=2; } cotan = cos/sin; return cotan; } int main() { long double x,e,c; cin>>x>>e; c = cotan(x,e); int n = 0; x = c; while (f(x)>e) { x = x/10; n++; } cout.precision(n); cout<<c; return 0; } |
Решение
Наиболее простым решением данной задачи оказалось рассмотреть котангенс, как отношение косинуса к синусу и работать не с рядом Тейлора для котангенса, а с рядами Маклорена для синуса и косинуса. Причем, удобно работать с ними в одном цикле. Оказывается, слагаемые этих рядов можно получить друг из друга.
Ряд Маклорена для синуса: [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(), а вписал в программу ее замену.
— Как результат с точностью 0,001 может равняться 1,83049. Три знака после запятой или пять? Остальные тесты тоже посмотрите.
— «модуль разницы » может разности?
— Вы пишите «s*=(-1)». А почему не просто «s = -s»? Результат будет тот же, но не так витиевато написано.
Засчитано, но …
— Не нужно давать ссылку на сам сайт wolframalpha.com. Вставьте ссылку на страничку, где вычислено нужное Вам значение. Просто скопируйте в ссылку адрес странички с вычислениями.