Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
METODIKA.DOC
Скачиваний:
9
Добавлен:
09.02.2015
Размер:
925.18 Кб
Скачать

3.5. Метод простых итераций (Лабораторная работа №6)

  1. Метод простых итераций решения уравнения состоит в замене исходного уравнения эквивалентным ему уравнениемx=(x) и построении последовательности xn+1=(xn), сходящейся при n к точному решению. Достаточные условия сходимости метода простых итераций формулируются теоремой, приведенной [1,2,7].

  2. Рассмотрим один шаг итерационного процесса. Исходя из найденного на предыдущем шаге значения xn-1, вычисляется y= (xn-1). Если , то полагаетсяxn=y и выполняется очередная итерация. Если же , то вычисления заканчиваются и за приближенное значение корня принимается величинаxn=y. Погрешность результата вычислений зависит от знака производной : при>0 погрешность определения корня составляет qq, а при <0 погрешность не превышает . Здесь q- число, такое, что q на отрезке [a,b]. Существование числа q является условием сходимости метода в соответствии с отмеченной выше теоремой.

  3. Для применения метода простых итераций определяющее значение имеет выбор функции в уравнении, эквивалентном исходному. Функциюнеобходимо подбирать так, чтобыq. Это обусловливается тем, что если <0 на отрезке [a,b], то последовательные приближения xn=(xn-1) будут колебаться около корня c, если же >0, то последовательные приближения будут сходиться к корню c монотонно. Следует также помнить, что скорость сходимости последовательности {xn} к корню c функции тем выше, чем выше числоq.

  4. В лабораторной работе № 6 предлагается, используя программы-функции ITER и Round из файла methods.cpp (файл заголовков methods.h, директория LIBR1), найти корень уравнения с заданной точностьюEps методом итераций, исследовать скорость сходимости и обусловленность метода.

  5. Для данной работы вид функции задается индивидуально каждому студенту преподавателем из числа вариантов, приведенных в подразделе 3.6.

  6. Порядок выполнения лабораторной работы №6 должен быть следующим.

  1. Графически или аналитически отделить корень уравнения .

  2. Преобразовать уравнение к видутак, чтобы в некоторой окрестности[Left, Right] корня производная удовлетворяла условиюq. При этом следует иметь в виду, что чем меньше величина q, тем быстрее последовательные приближения сходятся к корню.

  3. Выбрать начальное приближение, лежащее на [Left, Right].

  4. Составить подпрограмму для вычисления значений ,, предусмотрев округление вычисленных значений с точностьюDelta.

  5. Составить головную программу, вычисляющую корень уравнения и содержащую обращение к программам ,иITER и индикацию результатов.

  6. Провести вычисления по программе. Исследовать скорость сходимости и обусловленность метода.

  1. Текст программы - функции ITER, позволяющей вычислять корни уравнения x=для любой функции, которая удовлетворяет достаточным условиям сходимости метода, приводится ниже.

3.6. Курсовая работа по дисциплине и варианты заданий

  1. Лабораторные работы, описанные в настоящем разделе, целесообразно объединять для выполнения курсовой работы, нацеленной на сравнительную оценку различных методов приближенного решения нелинейных уравнений. Типовое задание на курсовую работу формулируется следующим образом.

  2. Задание на курсовую работу по дисциплине "Вычислительная математика".

  3. Используя программы - функции BISECT, NEWTON, HORDA, ITER, Round из файла methods.cpp (файл заголовков methods.h, директория LIBR1), найти корень уравнения с заданной точностью методом бисекции, Ньютона, хорд и итераций соответственно.

  4. Исследуйте обусловленность методов и зависимость числа итераций от точности результата Eps при изменении Eps от 0.0 до 0.000001.

  5. Порядок выполнения курсовой работы

  6. Графически или аналитически отделить корень уравнения (т.е. найти отрезки [Left, Right], на которых функция удовлетворяет условиям применимости методов).

  7. Составить подпрограмму- функцию вычисления функции и ее производной(при необходимости), предусмотрев округление их значений с заданной точностьюDelta с использованием библиотечной функции Round.

  8. Составить головную программу, содержащую ввод исходных данных, обращение к подпрограммам BISECT, NEWTON, HORDA, ITER вывод результатов.

  9. Выполнить вычисления по программе. Построить графики зависимости числа итераций, необходимых для достижения заданной точности Eps, от величины Eps, а также достижимой точности результатов от точности Delta задания функции .

  10. Теоретически и экспериментально сравнить методы бисекции, Ньютона, хорд и итераций по скорости сходимости и степени обусловленности.

  11. Результаты оформить в виде отчета, содержащего постановку задачи, тексты разработанных программ, результаты теоретического и экспериментального анализа в виде таблиц и графиков, выводы.

  12. Вид функции определяется вариантом задания. Эти же варианты могут использоваться при выполнении лабораторных работ №№3-6 по отдельности.

№ п/п

№ п/п

  1. 1

  1. ;

  1. 19

  1. 2

  1. ;

  1. 20

  1. ;

  1. 3

  1. ;

  1. 21

  1. ;

  1. 4

  1. ;

  1. 22

  1. ;

  1. 5

  1. ;

  1. 23

  1. ;

  1. 6

  1. ;

  1. 24

  1. ;

  1. 7

  1. ;

  1. 25

  1. ;

  1. 8

  1. ;

  1. 26

  1. ;

  1. 9

  1. ;

  1. 27

  1. ;

  1. 10

  1. ;

  1. 28

  1. ;

  1. 11

  1. ;

  1. 29

  1. ;

  1. 12

  1. ;

  1. 30

  1. ;

  1. 13

  1. ;

  1. 31

  1. ;

  1. 14

  1. ;

  1. 32

  1. ;

  1. 15

  1. ;

  1. 33

  1. ;

  1. 16

  1. ;

  1. 34

  1. ;

  1. 17

  1. ;

  1. 35

  1. ;

  1. 18

  1. ;

  1. 36

  1. ;

3.7. Программы для решения нелинейных уравнений
  1. Текст заголовочного файла methods.h.

  2. /*******************************************************************/

  3. extern double F(double);

  4. /******************************************************************/

  5. /* Функция F (X) , задаваемая пользователем */

  6. /******************************************************************/

  7. #ifdef __NEWTON

  8. extern double F1(double);

  9. /******************************************************************/

  10. /* Производная функции F (X) , задаваемая пользователем */

  11. /******************************************************************/

  12. #endif

  13. double Round (double X,double Delta);

  14. /******************************************************************/

  15. /* Функция Round (X,Delta) , предназначена для округления */

  16. /* X с точностью Delta */

  17. /******************************************************************/

  18. double BISECT(double Left,double Right,double Eps,int &N);

  19. /******************************************************************/

  20. /* Функция BISECT предназначена для решения уравнения F(X)=0 */

  21. /* методом деления отрезка пополам. Использованы обозначения: */

  22. /* Left - левый конец промежутка */

  23. /* Right - правый конец промежутка */

  24. /* Eps - погрешность вычисления корня уравнения; */

  25. /* N - число итераций */

  26. /******************************************************************/

  27. double ITER(double X0,double Eps,int &N);

  28. /******************************************************************/

  29. /* Функция ITER предназначена для решения уравнения F(X)=X */

  30. /* методом простой итерации. Использованы обозначения: */

  31. /* X0 - начальное приближение корня */

  32. /* Eps - погрешность вычисления корня уравнения; */

  33. /* N - число итераций */

  34. /******************************************************************/

  35. double HORDA(double Left,double Right,double Eps,int &N);

  36. /******************************************************************/

  37. /* Функция HORDA предназначена для решения уравнения F(x)=0 */

  38. /* методом хорд. Использованы обозначения: */

  39. /* Left - левый конец промежутка */

  40. /* Right - правый конец промежутка */

  41. /* Eps - погрешность вычисления корня уравнения; */

  42. /* N - число итераций */

  43. /******************************************************************/

  44. double NEWTON (double X,double Eps,int &N);

  45. /******************************************************************/

  46. /* Функция NEWTON предназначена для решения уравнения F(X)=0 */

  47. /* методом касательных. Использованы обозначения: */

  48. /* X - начальное приближение корня */

  49. /* Eps - погрешность вычисления корня уравнения; */

  50. /* N - число итераций */

  51. /******************************************************************/

  52. #include "methods.cpp"

  53. /************************************************************************/

  54. Текст программного модуля methods.cpp.

  55. /*********************************************/

  56. #include <stdio.h>

  57. #include <math.h>

  58. #include <stdlib.h>

  59. extern double F(double);

  60. double BISECT(double Left,double Right,double Eps,int &N)

  61. {

  62. double E = fabs(Eps)*2.0;

  63. double FLeft = F(Left);

  64. double FRight = F(Right);

  65. double X = (Left+Right)/2.0;

  66. double Y;

  67. if (FLeft*FRight>0.0) {puts("Неверное задание интервала\n");exit(1);}

  68. if (Eps<=0.0) {puts("Неверное задание точности\n");exit(1);}

  69. N=0;

  70. if (FLeft==0.0) return Left;

  71. if (FRight==0.0) return Right;

  72. while ((Right-Left)>=E)

  73. {

  74. X = 0.5*(Right + Left); /* вычисление середины отрезка */

  75. Y = F(X);

  76. if (Y == 0.0) return (X);

  77. if (Y*FLeft < 0.0)

  78. Right=X;

  79. else

  80. { Left=X; FLeft=Y; }

  81. N++;

  82. };

  83. return(X);

  84. }

  85. double Round (double X,double Delta)

  86. {

  87. if (Delta<=1E-9) {puts("Неверное задание точности округления\n");exit(1);}

  88. if (X>0.0) return (Delta*(long((X/Delta)+0.5)));

  89. else return (Delta*(long((X/Delta)-0.5)));

  90. }

  91. double ITER(double X0,double Eps,int &N)

  92. {

  93. if (Eps<=0.0) {puts("Неверное задание точности\n");exit (1);}

  94. double X1=F(X0);

  95. double X2=F(X1);

  96. N = 2;

  97. while( (X1 - X2)*(X1 - X2) > fabs((2*X1-X0-X2)*Eps) )

  98. {

  99. X0 = X1;

  100. X1 = X2;

  101. X2 = F(X1);

  102. N++;

  103. }

  104. return(X2);

  105. }

  106. #ifdef __NEWTON

  107. double NEWTON (double X,double Eps,int &N)

  108. {

  109. extern double F1 (double);

  110. double Y,Y1,DX;

  111. N=0;

  112. do

  113. {

  114. Y = F(X);

  115. if (Y==0.0) return (X);

  116. Y1 = F1(X);

  117. if (Y1==0.0) {puts("Производная обратилась в ноль\n");exit(1);}

  118. DX=Y/Y1; X=X-DX; N++;

  119. }

  120. while (fabs(DX)>Eps);

  121. return (X);

  122. }

  123. #endif

  124. double HORDA(double Left,double Right,double Eps,int &N)

  125. {

  126. double FLeft = F(Left);

  127. double FRight = F(Right);

  128. double X,Y;

  129. if (FLeft*FRight>0.0) {puts("Неверное задание интервала\n");exit(1);}

  130. if (Eps<=0.0) {puts("Неверное задание точности\n");exit(1);}

  131. N=0;

  132. if (FLeft==0.0) return Left;

  133. if (FRight==0.0) return Right;

  134. do

  135. {

  136. X = Left-(Right-Left)*FLeft/(FRight-FLeft);

  137. Y = F(X);

  138. if (Y == 0.0) return (X);

  139. if (Y*FLeft < 0.0)

  140. { Right=X; FRight=Y; }

  141. else

  142. { Left=X; FLeft=Y; }

  143. N++;

  144. }

  145. while ( fabs(Y) >= Eps );

  146. return(X);

  147. }

  148. /*********************************************************/

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]