Advertisement
adamnoeva

Untitled

May 26th, 2022
840
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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(*function_2)(double), double x1, double eps, int& i_counter);
  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, 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 x1, double eps, int& i_counter)
  167. {
  168.     double x0;
  169.     i_counter = 0;
  170.     do
  171.     {
  172.         x0 = x1;
  173.         i_counter++;
  174.         x1 = x0 - function_2(x0)*eps / (function_2(x0) - function_2(x0-eps));
  175.     } while (fabs(x0 - x1) > eps);
  176.     return x1;
  177. }
  178.  
  179. double New(double(*function_2)(double), double (*Dfunction_2)(double), double x0, double eps, int& i_counter)
  180. {
  181.     double x1 = x0 - function_2(x0) / Dfunction_2(x0);
  182.     while (fabs(x0 - x1) > eps)
  183.     {
  184.         i_counter++;
  185.         x0 = x1;
  186.         x1 = x0 - function_2(x0) / Dfunction_2(x0);
  187.     }
  188.     return x1;
  189. }
  190.  
  191.  
Advertisement
RAW Paste Data Copied
Advertisement