Условие задачи:
Вычислите с точностью [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 |
Код программы:
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 |
#include <iostream> #include <cmath> using namespace std; double cos (double x, double e) { double x2,c,n,f,z; x2= x*x; f= 2; c= 1; n= 2; z= -1; while ((x2/f)>=e) { c=c+z*x2/f; n=n+2; x2=x2*x*x; f=f*(n-1)*n; z=z*(-1); } return c; } int main() { double x,e; cin>>x; cin>>e; cout<<cos(x,e)<<endl; return 0; } |
Объяснение Кода:
В коде используются 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
— Чтобы правильно записать [latex]\cos x[/latex] нужно написать \cos x
— Вы злоупотребляете пробелами в формулах и в тоже время пропускаете их там, где они нужны. В результате самая большая формула у Вас не отображалась.
— Эпсилон у Вас выглядит несколько необычно. Лучше так [latex]\varepsilon[/latex] \varepsilon.
— Исправьте отступ в 19-й строке.
— И самое главное — алгоритм нужно переделать. Проблема в том, что Вы вычисляете огромные числа в числителе и знаменателе только для того, чтобы потом разделить одно на другое. И показывал на занятиях, как решать подобные задачи. Нужно вычислить отношение очередного слагаемого к предыдущему (получится дробь с не очень большим числителем и знаменателем). Посмотрите, как это сделано для синуса здесь.
Исправил эпсилон и косинус. Алгоритм я могу переделать но в классе мы писали код для косинуса и я не хотел его повторять поэтому я придумал свой.
— Косинус Вы не везде исправили, посмотрите внимательно.
— Я не против другого подхода, если он приемлем. В данном случае это не так. В программировании умение повторять «шаблонные» решения типовых задач, это важный навык. Когда задача будет сложнее вы сможете «блеснуть» новым эффективным алгоритмом.