Задача. [latex]\arctan(x)=x-\frac{x^{3}}{3}+\frac{x^{5}}{5}-\cdots (-1)^{n}\frac{x^{2n+1}}{2n+1}+\cdots[/latex]
Численно убедиться в справедливости равенства, для чего для заданного значения аргумента x вычислить левую его часть и разложение, стоящее в правой части, с заданной погрешностью [latex]\varepsilon[/latex]. Испытать разложение на сходимость при разных значениях аргумента, оценить скорость сходимости, для чего вывести число итераций n (слагаемых или cомножителей), необходимых для достижения заданной точности.
Тесты:
x | [latex]\varepsilon[/latex] | left | right | n | Разность | Комментарий |
1 | 0.3 | 0,785398 | 1 | 0 | 0,214602 | Пройден |
0.6 | 0.02 | 0.54042 | 0.528 | 1 | 0.0124195 | Пройден |
0.7 | 0.0002 | 0.610726 | 0.610631 | 7 | 9.52374е-05 | Пройден |
0.7 | 0.000002 | 0.610726 | 0.610728 | 12 | 1.67214е-06 | Пройден |
0.7 | 0.00000000001 | 0.610726 | 0.610726 | 28 | 8.34648е-12 | Пройден |
Код программы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <iostream> #include <math.h> using namespace std; int main() { double x, eps, left, right, d, s; cin >> x >> eps; int n=0; left=atan(x); right=x; d=fabs(left-right); s=x; while(d>eps) { n++; s*=(-1)*x*x; right+=s/(2*n+1); d=fabs(left-right); } cout << "left=" << left << " right=" << right << " n=" << n << " d=" << d; return 0; } |
В начале мы подставляем аргумент x в левую часть равенства и подсчитываем ее. Затем проверяем разность между правой частью и левой, если ее модуль меньше заданного [latex]\varepsilon[/latex], то выводим результат, а если нет, то в цикле while мы считаем последовательность до тех пор пока их разность не будет меньше [latex]\varepsilon[/latex]. Последовательность задается в цикле рекурентно, поэтому т.к. первый член последовательности будет равен x, то заведем переменную s, равную x, которая будет определять чему равен числитель дроби, домножая предыдущий на [latex](-1)x^{2}[/latex] . После этого программа выводит значение левой и правой части, их разницу и количество итераций для заданной погрешности.
Код можно проверить здесь.
Решение на 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 25 26 27 |
import java.util.*; import java.lang.*; import java.io.*; class Ideone { public static void main (String[] args) throws java.lang.Exception { Scanner in = new Scanner(System.in); double x, eps, left, right, d, s; int n=0; x = in.nextDouble(); eps = in.nextDouble(); left=Math.atan(x); right=x; d=Math.abs(left-right); s=x; while(d>eps) { n++; s*=(-1)*x*x; right+=s/(2*n+1); d=Math.abs(left-right); } System.out.print("left="+left+" right="+right+" n="+n+" d="+d); } } |
У Вас совершенно непояснено в отчете откуда взялось выражение «(-1)*(x*x*abs(2*n-1)/(2*n+1))»
«Испытать разложение на сходимость при разных значениях аргумента, оценить скорость сходимости, для чего вывести число итераций n (слагаемых или cомножителей), необходимых для достижения заданной точности.» — для этого зафиксировав аргумент, нужно постепенно улучшать точность вычислений и смотреть что:
1) получается более точное значение
2) требуется больше итераций
т.е. Ваша таблица тестов неполна
Спасибо, я дополнила тесты и добавила пояснение в отчет
Насчет тестов все теперь хорошо. А вот насчет пояснения — да, понятно, что » домножая предидущий на \frac{(-1)x^{2}\left | 2n-1 \right |}{2n+1}» (кстати не предидущий, а предыдущий). Но откуда такая формула получилась — особенно удивительно (не заметил сразу) откуда появился модуль? По большому счету пояснить это несложно — просто разделив два элемента друг на друга — но эти выкладки желательно выписать в отчет. Впрочем все было бы проще, если бы Вы обозначили через s не очередное слагаемое, а только числитель(со знаком) и прибавляли бы в сумму s/(2*n+1) — это значительно упростило бы формулу для s.
Большое спасибо, исправила
Засчитано, 8 баллов (октябрьская работа).