adamnoeva

Untitled

May 18th, 2022
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.88 KB | None | 0 0
  1. #include <cmath>
  2. #include <iostream>
  3. #include <iomanip>
  4.  
  5. using namespace std;
  6.  
  7. void inputdata(double* a, double* b, double* h, double* esp);
  8.  
  9. double function(double x);
  10.  
  11. double function_2(double x);
  12.  
  13. double Dfunction_2(double x);
  14.  
  15. double function_3(double x);
  16.  
  17. double Dfunction_3(double x);
  18.  
  19. double Wegstein(double(*f)(double), double x0, double x1, double eps, int& i_counter);
  20.  
  21. double New(double(*function_2)(double), double (*Dfunction_2)(double), double x0, double eps, int& i_counter);
  22.  
  23. double Sec(double(*f)(double), double x0, double x1, double eps, int& num);
  24.  
  25.  
  26. int main()
  27. {
  28. double a = 0, b = 0, h = 0, esp = 0, x = 0;
  29. int counter = 0, i_counter = 0;
  30. setlocale(LC_ALL, "ru");
  31. cout << "1 - x^3 + 10*x^2 - 50 методом Вегстейна" << " По умолчанию: a = -12, b = 5, h = 0.1, esp = 0.01" << endl;
  32. cout << "2 - log(x) - 5 * cos(x) методом секущих" << " По умолчанию: a = 1, b = 8, h = 0.1, esp = 0.01" << endl;
  33. cout << "3 - x^3 + 5x^2 + 12 методом Ньютона" << " По умолчанию: a = -2, b = 5, h = 0.1, esp = 0.01" << endl;
  34. cout << "Выберите функцию: " << endl;
  35. char action;
  36. cin >> action;
  37. if (action == '1')
  38. {
  39. cout << "Использовать значения по умолчанию(1), ввести вручную" << endl;
  40. char symbol; cin >> symbol;
  41. if (symbol == '1')
  42. a = -12, b = 5, h = 0.1, esp = 0.01;
  43. else
  44. inputdata(&a, &b, &h, &esp);
  45. cout << "Корни\tЗначение х \tКорень \t Кол-во итераций" << endl;
  46. double i = a;
  47. while (i <= b)
  48. {
  49. if (function(i) * function(i + h) < 0)
  50. {
  51. counter++;
  52. x = Wegstein(function, i, i + h, esp, i_counter);
  53. cout << setw(4) << counter << setw(10) << i << setw(17) << x << setw(10) << i_counter << endl;
  54. }
  55. i += h;
  56. }
  57. if (counter == 0)
  58. cout << "На данном отрезке корней нет!";
  59. }
  60. else if (action == '2')
  61. {
  62. cout << "Использовать значения по умолчанию(1), ввести вручную" << endl;
  63. char symbol; cin >> symbol;
  64. if (symbol == '1')
  65. a = 1, b = 8, h = 0.1, esp = 0.001;
  66. else
  67. inputdata(&a, &b, &h, &esp);
  68. double i2 = a;
  69. cout << "Корни\tЗначение х \tКорень \t Кол-во итераций" << endl;
  70. while (i2 <= b)
  71. {
  72. if (function_2(i2) * function_2(i2 + h) < 0)
  73. {
  74. counter++;
  75. x = Sec(function_2, i2, b, esp, i_counter);
  76. cout << setw(4) << counter << setw(10) << i2 << setw(17) << x << setw(10) << i_counter << endl;
  77. }
  78. i2 += h;
  79. }
  80. if (counter == 0)
  81. cout << "На данном отрезке корней нет!";
  82.  
  83. } else if (action == '3') {
  84. cout << "Использовать значения по умолчанию(1), ввести вручную" << endl;
  85. char symbol; cin >> symbol;
  86. if (symbol == '1')
  87. a = -2, b = 5, h = 0.1, esp = 0.001;
  88. else
  89. inputdata(&a, &b, &h, &esp);
  90. double i2 = a;
  91. cout << "Корни\tЗначение х \tКорень \t Кол-во итераций" << endl;
  92. while (i2 <= b)
  93. {
  94. if (function_3(i2) * function_3(i2 + h) < 0)
  95. {
  96. counter++;
  97. x = New(function_3, Dfunction_3, i2, esp, i_counter);
  98. cout << setw(4) << counter << setw(10) << i2 << setw(17) << x << setw(22) << setw(10) << i_counter << endl;
  99. }
  100. i2 += h;
  101. }
  102. if (counter == 0)
  103. cout << "На данном отрезке корней нет!";
  104. }
  105.  
  106.  
  107. }
  108.  
  109. void inputdata(double* a, double* b, double* h, double* esp)
  110. {
  111.  
  112. cout << "Введите начало отрезка: ";
  113. cin >> *a;
  114. do
  115. {
  116. cout << "Введите конец отрезка: ";
  117. cin >> *b;
  118. } while (*b <= *a);
  119. do
  120. {
  121. cout << "введите шаг: ";
  122. cin >> *h;
  123. } while (fabs(*b - *a) < *h || *h <= 0);
  124. do
  125. {
  126. cout << "Введите точность: ";
  127. cin >> *esp;
  128. } while (*esp > *h);
  129. }
  130.  
  131. double function(double x)
  132. {
  133. return x * x * x + 10 * x * x - 50;
  134. }
  135.  
  136. double function_2(double x)
  137. {
  138. return log(x) - 5 * cos(x);
  139. }
  140.  
  141. double function_3(double param) {
  142. return pow(param, 3.) - 5.*pow(param, 2.) + 12.;
  143. }
  144.  
  145. double Dfunction_3(double param) {
  146. return 3.*pow(param, 2.) - 10.*param;
  147. }
  148.  
  149. double Wegstein(double(*function)(double), double x0, double x1, double eps, int& i_counter)
  150. {
  151. double fx0 = 0, fx1 = 0, x2 = 0, de = 1;
  152. fx0 = function(x0); fx1 = function(x1);
  153. while (de > eps)
  154. {
  155. x2 = x1 - fx1 * (x1 - x0) / (fx1 - fx0);
  156. de = fabs(x1 - x2);
  157. fx0 = fx1;
  158. fx1 = function(x2);
  159. x0 = x1;
  160. x1 = x2;
  161. i_counter++;
  162. }
  163. return x2;
  164. }
  165.  
  166. double Sec(double(*function_2)(double), double x0, double x1, double eps, int& i_counter)
  167. {
  168. double fx0 = 0, fx1 = 0;
  169. fx0 = function_2(x0); fx1 = function_2(x1);
  170. while (fabs(x0-x1) > eps)
  171. {
  172. i_counter++;
  173. x1 = x0 - (x0 - x1) * fx0 / (fx0 - fx1);
  174. }
  175. return x1;
  176. }
  177.  
  178. double New(double(*function_2)(double), double (*Dfunction_2)(double), double x0, double eps, int& i_counter)
  179. {
  180. double x1 = x0 - function_2(x0) / Dfunction_2(x0);
  181. while (fabs(x0 - x1) > eps)
  182. {
  183. i_counter++;
  184. x0 = x1;
  185. x1 = x0 - function_2(x0) / Dfunction_2(x0);
  186. }
  187. return x1;
  188. }
  189.  
  190.  
Advertisement
Add Comment
Please, Sign In to add comment