Ю3.36

Задача

Численно убедиться в справедливости равенства, для чего для заданного значения аргумента [latex]x[/latex] вычислить левую его часть и разложение, стоящее в правой части, с заданной погрешностью [latex]\varepsilon[/latex]. Испытать разложение на сходимость при разных значениях аргумента, оценить скорость сходимости, для чего вывести число итераций [latex]n[/latex] (слагаемых или сомножителей), необходимых для достижения заданной точности.

[latex]\frac { { e }^{ x }+{ e }^{ -x } }{ 2 } =1+\frac { { x }^{ 2 } }{ 2! } +\frac { { x }^{ 4 } }{ 4! } +\cdots+\frac { { x }^{ 2n } }{ (2n)! } +\cdots[/latex]

Тесты

   x [latex]\varepsilon[/latex] Левая часть Правая часть    n Разность Комментарий
3 0.00005 10.0676619958  10.0676598764 8 0.0000021194 Пройден
 11.33  0.0000314 41641.5114284855 41641.5114045419 19 0.0000239436 Пройден
 6 0 Погрешность равна 0, тогда правая часть стремится к левой 201.7156361225 (n=бесконечность)​  Не пройден

Код программы на C++:

В данной задаче необходимо было доказать равенство при заданном [latex]x[/latex] и [latex]\varepsilon [/latex].

Для этого вначале высчитывалось значение левой части [latex]\frac { { e }^{ x }+{ e }^{ -x } }{ 2 } [/latex] при заданном [latex]x[/latex], а далее, в цикле, высчитывалось значение правой части [latex]\frac { { x }^{ 2 } }{ 2! } +\frac { { x }^{ 4 } }{ 4! } +…+\frac { { x }^{ 2n } }{ (2n)! } +…[/latex]. В цикле программа находила последующий элемент последовательности, стоящей в правой части равенства, каждый раз умножая предыдущий элемент на [latex]\frac { { x }^{ 2 } }{ (2n-1)*(2n) } [/latex] до тех пор пока разность между левой и правой частью равенства [latex]dife=left-right[/latex]  не стала меньше заданной погрешности, заданной по модулю [latex]dife < \left|\varepsilon \right|[/latex]. После завершения цикла программа запоминает последнее значение [latex]n[/latex] и после этого выводит его на экран.

Код программы на Java

 

6 thoughts on “Ю3.36

  1. Хорошее решение, корректно переведено на Java, но есть замечания (во многом касается и исходной версии):

    Очень неудачный выбор для названия переменной E! Особенно в Java. Оно начинает путаться с Math.E, так же не забывайте, что обычно названия переменных начинаются с маленьких букв. Да и не логичное название. Назовите ее eps, или epsilon, или accuracy .

    Также, в условие dife > Math.abs(E) закралась ошибка — и ее пока никто не заметил( ни Игорь Евгеньевич, ни Вы)! Разность (кстати, имя difference будет куда лучше) должна быть по модулю меньше точности вычисления. Опять же сложно найти ошибку, она не бросается в глаза, а почему? Всего лишь, из-за неудачных названий переменных.

    Раз уже о стиле зашла речь, то пожалуй, рановато описаны double dife, left, right = 0.0, u = 1.0 ; int n = 0; — они относятся к процессу вычисления, поэтому по логике должны быть описаны уже после ввода исходных данных (кстати, u тоже неудачное имя, по большому счету).

    В общем, программа работает, ошибка в коде только одна ( dife > Math.abs(E)), но я пытаюсь научить Вас и нормальному стилю записи программы, поэтому прошу учесть замечания.

  2. Ой, только посмотрел Ваши тесты и описание: вы берете отрицательную погрешность: -0.000545. Это очень необычно. Тогда я понимаю Вашу запись dife > Math.abs(E) . Особенно, если учесть, что левая часть по идее всегда больше, т.к. правая часть монотонно возрастает. Очень странный и нетривиальный момент получился. По классике, разница по модулю меньше погрешности — вот условие останова.

Добавить комментарий