Задача. Вычислите с точностью [latex]\varepsilon[/latex] значение функции [latex]f(x)=\csc x[/latex] . При вычислениях допустимо использовать только арифметические операции.
Тесты
[latex]x[/latex] | [latex]\varepsilon[/latex] | Результат |
42 | 0.3 | -8.09848e-05 |
8 | 0.15 | -0.0117188 |
55.5 | 0.04 | -3.50972e-055 |
-12 | 0.6 | 0.00347222 |
-82 | 0.0001 | -3.23677e-08 |
Код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include <iostream> #include <cmath> using namespace std; int main() { double x, e; cin>>x>>e; double sum1=x; // в случае, когда i=0 double sum2=-x*x*x/6; // в случае, когда i=1 for (int i=2; abs(1/sum2-1/sum1)>=e; i++) { sum1=sum2; sum2*=-x*x/((2*i)*(2*i+1)); } cout<<1/sum2<<endl; return 0; } |
Код программы на ideone.com
Решение :
Косеканс — это тригонометрическая функция, которою можно определить формулой [latex]\csc x=\frac{1}{\sin x}[/latex]. Таким образом, мы можем разложить функцию [latex]\sin x[/latex] в бесконечную сумму степенных функций, воспользовавшись формулой Тейлора. Получим, что [latex]\sin x=x-\frac{{x}^{3}}{3!}+\frac{{x}^{5}}{5!}-\dots=\sum_{n=0}^{\propto}\frac{{-1}^{n}\times{x}^{2n+1}}{\left(2n+1\right)!}[/latex]. Слагаемые данной суммы являются геометрической прогрессией, знаменатель который можно найти по формуле [latex]\frac{a_n}{a_{n-1}}=\frac{\frac{{-1}^{n}\times{a}^{2n+1}}{\left(2n+1 \right)!}}{\frac{{-1}^{n-1}\times{a}^{2n-1}}{\left(2n-1 \right)!}}=\frac{\left( -1\right){a}^{2}}{2n\times\left( 2n+1\right)}[/latex]. Будем вычислять сумму до тех пор, пока разность [latex]n[/latex]-го и [latex]\left ( n+1 \right )[/latex]-го слагаемых будет больше заданной точности.
— «Члены данной суммы»? Так не говорят. Если члены, то ряда. А если суммы, то слагаемые.
— Вам нужно не просто вычислить n-ю частичную сумму ряда. Нужно гарантировать точность эпсилон. Т.е. нужно вычислять частичные суммы до тех пор, пока очередной член ряда по модулю превышает эпсилон.
Спасибо, исправила код и объяснение решения задачи.
— Вы не используете в программе действительный эпсилон, хотя он есть в тестах. Вместо него Вы вводите целое n. Я не могу догадаться, что имеется в виду.
— Что это за странная формула k = 1 / s2 - 1 / s1; // вычисляем последнее слагаемое суммы. Комментарий делает её ещё более загадочной если вспомнить, что вычисляется сумма бесконечного ряда.
Аня. Перечитайте второй абзац моего предыдущего комментария или посмотрите, например, работу Кати.
Спасибо, написала новый код и исправила неточности в алгоритме решения.