Advertisement
MargaritaOwl

optimizationMethods

Feb 9th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.95 KB | None | 0 0
  1. #include <iostream>
  2. #include <locale>
  3. #include <iomanip>
  4. using namespace std;
  5.  
  6. const double a = -1.;
  7. const double b = 1.;
  8. const double delta = 0.005;
  9. const double e = 0.01;
  10.  
  11. double f(double x)
  12. {
  13.     return (fabs(x) + (x - 1.)*(x - 1.));
  14. }
  15. void coutRes(int type)
  16. {
  17.     switch (type)
  18.     {
  19.     case 1:
  20.         cout << setw(2) << "n";
  21.         cout << setw(11) << "a_n";
  22.         cout << setw(11) << "x_(2n-1)";
  23.         cout << setw(11) << "x_2n";
  24.         cout << setw(11) << "b_n";
  25.         cout << setw(11) << "f(x_(2n-1))";
  26.         cout << setw(11) << "f(x_2n)";
  27.         cout << setw(11) << "b_n - a_n";
  28.         break;
  29.     case 2:
  30.         cout << setw(2) << "n";
  31.         cout << setw(11) << "a_n";
  32.         cout << setw(11) << "x_(n+1)";
  33.         cout << setw(11) << "x_n";
  34.         cout << setw(11) << "b_n";
  35.         cout << setw(11) << "f(x_(n+1))";
  36.         cout << setw(11) << "f(x_n)";
  37.         cout << setw(11) << "b_n - a_n";
  38.         break;
  39.     case 3:
  40.         cout << setw(2) << "n";
  41.         cout << setw(11) << "a_n";
  42.         cout << setw(11) << "b_n";
  43.         cout << setw(11) << "u_n";
  44.         cout << setw(11) << "v_n";
  45.         cout << setw(11) << "f(u_n)";
  46.         cout << setw(11) << "f(v_n)";
  47.         break;
  48.     }
  49.     cout << endl;
  50. }
  51. void coutRes(int a1, double a2, double a3, double a4, double a5, double a6, double a7, double a8, int type)
  52. {
  53.     switch (type)
  54.     {
  55.     case 1: case 2:
  56.         cout << setw(2) << a1;
  57.         cout << setw(11) << a2;
  58.         cout << setw(11) << a3;
  59.         cout << setw(11) << a4;
  60.         cout << setw(11) << a5;
  61.         cout << setw(11) << a6;
  62.         cout << setw(11) << a7;
  63.         cout << setw(11) << a8;
  64.         break;
  65.     case 3:
  66.         cout << setw(2) << a1;
  67.         cout << setw(11) << a2;
  68.         cout << setw(11) << a3;
  69.         cout << setw(11) << a4;
  70.         cout << setw(11) << a5;
  71.         cout << setw(11) << a6;
  72.         cout << setw(11) << a7;
  73.         break;
  74.     }
  75.     cout << endl;
  76. }
  77.  
  78. void halfDivision()
  79. {
  80.     int k;
  81.     double a_k = a;
  82.     double b_k = b;
  83.     double x_1, x_2;
  84.     coutRes(1);
  85.     for (k = 1; (b_k - a_k) >= e; k++)
  86.     {
  87.         x_1 = (a_k + b_k - delta) / 2.;
  88.         x_2 = (a_k + b_k + delta) / 2.;
  89.         coutRes(k, a_k, x_1, x_2, b_k, f(x_1), f(x_2), b_k - a_k, 1);
  90.         if (f(x_1) <= f(x_2))
  91.             b_k = x_2;
  92.         else
  93.             a_k = x_1;
  94.     }
  95.     coutRes(k, a_k, x_1, x_2, b_k, f(x_1), f(x_2), b_k - a_k, 1);
  96.     cout << "количество шагов = " << k << endl;
  97.     cout << "x = " << (a_k + b_k) / 2. << endl;
  98.     cout << "y(x) = " << f((a_k + b_k) / 2.) << endl;
  99. }
  100.  
  101. void goldenSection()
  102. {
  103.     int n;
  104.     double a_n, b_n;
  105.     a_n = a;
  106.     b_n = b;
  107.     double x_1, x_2;
  108.     double func_x1, func_x2;
  109.     x_1 = a_n + ((3 - sqrt(5)) / 2.)*(b_n - a_n);
  110.     x_2 = a_n + ((sqrt(5) - 1) / 2.)*(b_n - a_n);
  111.     func_x1 = f(x_1);
  112.     func_x2 = f(x_2);
  113.     coutRes(2);
  114.     for (n = 1; (b_n - a_n) * 10 >= e * 10; n++)
  115.     {
  116.         coutRes(n, a_n, x_2, x_1, b_n, func_x2, func_x1, b_n - a_n, 2);
  117.         if (func_x1 < func_x2)
  118.         {
  119.             b_n = x_2;
  120.             x_2 = x_1;
  121.             func_x2 = func_x1;
  122.             x_1 = a_n + ((3 - sqrt(5)) / 2.)*(b_n - a_n);
  123.             func_x1 = f(x_1);
  124.         }
  125.         else
  126.         {
  127.             a_n = x_1;
  128.             x_1 = x_2;
  129.             func_x1 = func_x2;
  130.             x_2 = a_n + ((sqrt(5) - 1) / 2.)*(b_n - a_n);
  131.             func_x2 = f(x_2);
  132.         }
  133.     }
  134.     coutRes(n, a_n, x_2, x_1, b_n, func_x2, func_x1, b_n - a_n, 2);
  135.     cout << "количество шагов = " << n << endl;
  136.     cout << "x = " << (a_n + b_n) / 2. << endl;
  137.     cout << "y(x) = " << f((a_n + b_n) / 2.) << endl;
  138. }
  139.  
  140. void Fibonacci(int &F_k, int &F_k_1, int &k)
  141. {
  142.     int F_k_2 = F_k_1 + F_k;
  143.     while (!((F_k_1 <= ((b - a) / e)) && (((b - a) / e) <= F_k_2)))
  144.     {
  145.         F_k = F_k_1;
  146.         F_k_1 = F_k_2;
  147.         F_k_2 = F_k_1 + F_k;
  148.         k++;
  149.     }
  150. }
  151. int Fib(int end)
  152. {
  153.     int F_i = 1;
  154.     int F_i_1 = 1;
  155.     int F_i_2 = F_i_1 + F_i;
  156.     int i = 1;
  157.     while (i != end)
  158.     {
  159.         F_i = F_i_1;
  160.         F_i_1 = F_i_2;
  161.         F_i_2 = F_i_1 + F_i;
  162.         i++;
  163.     }
  164.     return F_i;
  165. }
  166. void FibonacciMethod()
  167. {
  168.     int F_n, F_n_1, F_n_2, n, k;
  169.     double a_n, b_n, func_u, func_v;
  170.     double u, v;
  171.     F_n = F_n_1 = n = 1;
  172.     a_n = a;
  173.     b_n = b;
  174.  
  175.  
  176.     Fibonacci(F_n, F_n_1, n);
  177.     F_n_2 = F_n_1 + F_n;
  178.  
  179.     u = a_n + ((double)F_n / F_n_2) * (b_n - a_n);
  180.     v = a_n + ((double)F_n_1 / F_n_2) * (b_n - a_n);
  181.     func_u = f(u);
  182.     func_v = f(v);
  183.  
  184.     coutRes(3);
  185.     coutRes(1, a_n, b_n, u, v, func_u, func_v, 0, 3);
  186.  
  187.     for (k = 2; k < n; k++)
  188.     {
  189.         if (func_u <= func_v)
  190.             b_n = v;
  191.         else
  192.             a_n = u;
  193.         if (func_u <= func_v)
  194.         {
  195.             v = u;
  196.             u = a_n + ((double)Fib(n - k + 1) / F_n_2)*(b - a);
  197.             func_v = func_u;
  198.             func_u = f(u);
  199.         }
  200.         else
  201.         {
  202.             u = v;
  203.             func_u = func_v;
  204.             v = a_n + ((double)Fib(n - k + 2) / F_n_2)*(b - a);
  205.             func_v = f(v);
  206.         }
  207.         coutRes(k, a_n, b_n, u, v, func_u, func_v, 0, 3);
  208.     }
  209.     coutRes(k, a_n, b_n, u, v, func_u, func_v, 0, 3);
  210.     cout << "количество шагов = " << n << endl;
  211.     cout << "x = " << (a_n + b_n) / 2. << endl;
  212.     cout << "y(x) = " << f((a_n + b_n) / 2.) << endl;
  213. }
  214.  
  215. int main()
  216. {
  217.     setlocale(LC_ALL, "russian");
  218.     cout << "Метод половинного деления" << endl << endl;
  219.     halfDivision();
  220.     cout << endl << endl << "Метод золотого сечения" << endl << endl;
  221.     goldenSection();
  222.     cout << endl << endl << "Метод Фибоначчи" << endl << endl;
  223.     FibonacciMethod();
  224.  
  225.     system("pause");
  226.     return 0;
  227. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement