Задача: Численно убедится в справедливости равенства для заданного значения аргумента [latex]x[/latex] на заданное значение погрешности [latex]\varepsilon [/latex]. вывести число итераций.
[latex]cosx=1-\frac { { x }^{ 2 } }{ 2! } +\frac { { x }^{ 4 } }{ 4! } -\dots +{ (-1) }^{ n }\frac { { x }^{ 2n } }{ (2n)! }+\dots[/latex]x | Delta | Value | Step’s | |
0 | [latex]0[/latex] | 0.0000001 | 1 | 1 |
3.14 | [latex]\pi[/latex] | 0.00001 | -1 | 7 |
1.57 | [latex]\frac { \pi }{ 2 }[/latex] | 0.00001 | 0.000795865 | 5 |
1.05 | [latex]\frac { \pi }{ 3 }[/latex] | 0.00001 | 0.497571 | 4 |
2.09 | [latex]\frac { 2\pi }{ 3 }[/latex] | 0.00001 | -0.496189 | 6 |
Код программы на С++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <iostream> #include <cmath> using namespace std; int main() { double x, sum = 1, delta, elem = 1; cin >> x >> delta; double co = cos(x), rs = 1 + delta; for (int i = 1; rs > delta; i++) { elem *= - x * x / (2 * i * (2 * i - 1)); //рекурсивно выражаем каждый элемент суммы sum += elem; // сумируем rs = fabs(co - sum); // вычисляем модуль разницы для оценки точности cout << "Step:" << i << " " << sum << endl; // выводим номер шага и значение суммы на этом шаге } cout << "Value: " << sum << " ~ " << co; //выводим конечное значение return 0; } |
Код программы на Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import java.util.*; import java.lang.*; import java.io.*; import java.lang.Math; class Main { public static void main (String[] args) throws java.lang.Exception { Scanner in=new Scanner(System.in); double x, sum = 1, delta, elem = 1; x=in.nextDouble(); delta=in.nextDouble(); double co = Math.cos(x), rs = 1 + delta; for (int i = 1; rs > delta; i++) { elem *= - x * x / (2 * i * (2 * i - 1)); //рекурсивно выражаем каждый элемент суммы sum += elem; // сумируем rs = Math.abs(co - sum); // вычисляем модуль разницы для оценки точности System.out.printf("Step: %d %8.6f \n", i, sum); // выводим номер шага и значение суммы на этом шаге } System.out.printf("Value: %8.6f ~ %8.6f", sum, co); //выводим конечное значение } } |
Можно заметить, что каждый последующий член ряда рекурсивно выражается через предыдущий. Это позволяет нам значительно уменьшить количество операций. Суть решения в том, что получая аргумент мы фиксируем левую часть выражения, вычисляя значение косинуса от данного аргумента, а затем проверяем сколько слагаемых нам потребуется, чтобы вторая часть отличалась от первой на заданное значение дельта. Цикл программы выводит значение правой части на каждом шагу, а как ответ показывает значения левой и итоговой правой частей.
Засчитано