Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методические указания к лабораторным работам по дисциплине Вычислительная математика.DOC
Скачиваний:
196
Добавлен:
01.05.2014
Размер:
930.3 Кб
Скачать

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");

  88. exit(1);}

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

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

  91. }

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

  93. {

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

  95. double X1=F(X0);

  96. double X2=F(X1);

  97. N = 2;

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

  99. {

  100. X0 = X1;

  101. X1 = X2;

  102. X2 = F(X1);

  103. N++;

  104. }

  105. return(X2);

  106. }

  107. #ifdef __NEWTON

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

  109. {

  110. extern double F1 (double);

  111. double Y,Y1,DX;

  112. N=0;

  113. do

  114. {

  115. Y = F(X);

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

  117. Y1 = F1(X);

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

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

  120. }

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

  122. return (X);

  123. }

  124. #endif

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

  126. {

  127. double FLeft = F(Left);

  128. double FRight = F(Right);

  129. double X,Y;

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

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

  132. N=0;

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

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

  135. do

  136. {

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

  138. Y = F(X);

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

  140. if (Y*FLeft < 0.0)

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

  142. else

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

  144. N++;

  145. }

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

  147. return(X);

  148. }

  149. /*********************************************************/