Условие задачи
Вычислите с точностью значение функции . При вычислениях допустимо использовать только арифметические операции.
Код программы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#include <iostream> #include <cmath> #define PI 3.1415926 using namespace std; double f(double e, double x){ int i = 0; double p = x; double s = x; while (p > e){ p*=(x*x*(2*i + 1)*(2*i + 1))/(2*(i+1)*(2*i + 3)); s+=p; i++; } return s; } int main() { double e; //точность double x; cin >> e >> x; cout << PI/2 - f(e, x) << endl; return 0; } |
Тесты
Входные данные | Выходные данные | Арккосинус | |
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 |
Решение
Для того, чтобы представить функцию необходимо воспользоваться формулой Тейлора, а именно рядом Маклорена для арккосинуса. Она имеет следующий вид:
[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] и нашей суммы. Это и будет значение арккосинуса.
Нужно использовать \pi в latex
Зачтено.