Задача
Численно убедиться в справедливости равенства, для чего для заданного значения аргумента [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=бесконечность) |
Не пройден |
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 28 29 30 31
|
#include <iostream> #include <math.h> int main() { double E, x, dife, left, right = 0.0, u = 1.0 ; int n = 0;//Описание переменных для хранения входных данных.// scanf("%lf %lf", &x, &E); //Чтение из стандартного потока ввода.// left = ( pow (M_E , x) + pow (M_E , -x) ) / 2; //Расчет левой части равенства. if (E != 0) //Критерий, при котором программа может быть выполнена// { do //Цикл программы (для подсчета правой части равенства). { n ++; right += u ; u *= x * x / ( (2 * n - 1) * 2 * n ); dife = left - right; //Вычисление разности значения левой части и правой части// } while(dife > fabs(E)); //Конечный критерий, при котором цикл останавливается// //Вывод окончательных результатов на экран// printf("Левая часть равна = %.10lf \nПравая часть равна = %.10lf \n",left,right); printf("После n=%d исследуемое выражение отличается от левой части менее, чем на %.10lf, ",n,fabs(E)); printf("а именно на %.10lf \n",fabs(dife)); } else { //Вывод оповещения о неправильном вводе данных (при несоответствии начальному критерию).// if (fabs(E) == 0) { printf("Погрешность равна 0, тогда правая часть стремится к левой %.10lf (n=бесконечность)",left); } } return 0; } |
В данной задаче необходимо было доказать равенство при заданном [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
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 28 29 30 31 32 33
|
import java.util.*; import java.lang.*; import java.io.*; class Equation { public static void main (String[] args) throws java.lang.Exception { //Описание переменных для хранения входных данных.// Scanner in = new Scanner(System.in); double eps = in.nextDouble(); double x = in.nextDouble(); double difference, right = 0.0, tmp = 1.0; double left = (Math.pow(Math.E, x) + Math.pow(Math.E , -x)) / 2; //Расчет левой части равенства. int n = 0; if (eps != 0){ //Критерий, при котором программа может быть выполнена// do{ //Цикл программы (для подсчета правой части равенства). n ++; right += tmp ; tmp *= x * x / ((2 * n - 1) * 2 * n); difference = left - right; //Вычисление разности значения левой части и правой части// } while(Math.abs(difference) > eps); //Конечный критерий, при котором цикл останавливается// //Вывод окончательных результатов на экран// System.out.printf("Левая часть равна = " + left + "\nПравая часть равна = " + right + " \n"); System.out.printf("После n=" + n + " исследуемое выражение отличается от левой части менее, чем на " + Math.abs(eps) + ", а именно на " + Math.abs(difference)); } else{ //Вывод оповещения о неправильном вводе данных (при несоответствии начальному критерию).// if (Math.abs(eps) == 0) System.out.printf("Погрешность равна 0, тогда правая часть стремится к левой" + left + "(n=infinity)"); } } } |
Related Images: