Advertisement
Guest User

Untitled

a guest
Jan 19th, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.15 KB | None | 0 0
  1. #include"opt_alg.h"
  2.  
  3. solution golden(double a, double b, double epsilon, int Nmax, matrix P)
  4. {
  5.     // złoty podział
  6.     double alfa = (sqrt(5.0) - 1) / 2;
  7.     solution A, B, C, D;
  8.     A.x = a;
  9.     B.x = b;
  10.     C.x = B.x - alfa*(B.x - A.x);
  11.     C.fit_fun(P);
  12.     D.x = A.x + alfa*(B.x - A.x);
  13.     D.fit_fun(P);
  14.     while (true)
  15.     {
  16.         if (C.y < D.y)
  17.         {
  18.             B = D;
  19.             D = C;
  20.             C.x = B.x - alfa*(B.x - A.x);
  21.             C.fit_fun(P);
  22.         }
  23.         else
  24.         {
  25.             A = C;
  26.             C = D;
  27.             D.x = A.x + alfa*(B.x - A.x);
  28.             D.fit_fun(P);
  29.         }
  30.         if (B.x - A.x < epsilon || solution::f_calls > Nmax)
  31.         {
  32.             A.x = (A.x + B.x) / 2;
  33.             A.fit_fun(P);
  34.             return A;
  35.         }
  36.     }
  37. }
  38.  
  39. solution najszybszy_spadek(matrix x0, double epsilon, int Nmax, double krok)
  40. {
  41.     int *n = get_size(x0);
  42.     solution X, Xt;
  43.     X.x = x0;
  44.     matrix d(n[0], 1);
  45.     matrix P(n[0], 2);
  46.     solution h;
  47.     double b;
  48.     while (true)
  49.     {
  50.         // najpierw liczenie gradientu
  51.         X.grad();
  52.         d = -X.g;
  53.  
  54.  
  55.         if (krok == 0.0) {
  56.             // zmiennokrokowa
  57.             P = set_col(P, X.x, 0);
  58.             P = set_col(P, d, 1);
  59.             b = policz_b(X.x, d);
  60.             h = golden(0, b, epsilon, Nmax, P);
  61.         }
  62.         else {
  63.             // stałokrokowa
  64.             // h = 0.005
  65.             //h = 0.012;
  66.             h = krok;
  67.         }
  68.  
  69.         Xt.x = X.x + h.x *d;
  70.         if (norm(X.x - Xt.x) < epsilon || solution::f_calls > Nmax)
  71.         {
  72.             Xt.fit_fun();
  73.             return Xt;
  74.         }
  75.         X = Xt;
  76.     }
  77. }
  78.  
  79. solution gradienty_sprzezone(matrix x0, double epsilon, int Nmax, double krok)
  80. {
  81.     int *n = get_size(x0);
  82.     solution X, Xt;
  83.     X.x = x0;
  84.     matrix d(n[0], 1);
  85.     matrix P(n[0], 2);
  86.     solution h;
  87.     double b, beta;
  88.     // najpierw liczenie gradientu
  89.     X.grad();
  90.     d = -X.g;
  91.     while (true)
  92.     {
  93.         if (krok == 0.0) {
  94.             // zmiennokrokowa
  95.             P = set_col(P, X.x, 0);
  96.             P = set_col(P, d, 1);
  97.             b = policz_b(X.x, d);
  98.             h = golden(0, b, epsilon, Nmax, P);
  99.         }
  100.         else {
  101.             // stałokrokowa
  102.             // h = 0.005
  103.             // h = 0.012;
  104.             h = krok;
  105.         }
  106.  
  107.         Xt.x = X.x + h.x *d;
  108.         if (norm(X.x - Xt.x) < epsilon || solution::f_calls > Nmax)
  109.         {
  110.             Xt.fit_fun();
  111.             return Xt;
  112.         }
  113.         Xt.grad();
  114.         beta = pow(norm(Xt.g), 2) / pow(norm(X.g), 2);
  115.         d = -Xt.g + beta*d;
  116.         X = Xt;
  117.     }
  118. }
  119.  
  120. solution metoda_Newtona(matrix x0, double epsilon, int Nmax, double krok)
  121. {
  122.     int *n = get_size(x0);
  123.     solution X, Xt;
  124.     X.x = x0;
  125.     matrix d(n[0], 1);
  126.     matrix P(n[0], 2);
  127.     solution h;
  128.     double b;
  129.     while (true)
  130.     {
  131.         // najpierw liczenie gradientu
  132.         X.grad();
  133.         X.hess();
  134.         d = -inv(X.H) * X.g;
  135.        
  136.         if (krok == 0.0) {
  137.             // zmiennokrokowa
  138.             P = set_col(P, X.x, 0);
  139.             P = set_col(P, d, 1);
  140.             b = policz_b(X.x, d);
  141.             h = golden(0, b, epsilon, Nmax, P);
  142.         }
  143.         else {
  144.             // stałokrokowa
  145.             // h = 0.005
  146.             // h = 0.012
  147.             h = krok;
  148.         }
  149.        
  150.         Xt.x = X.x + h.x *d;
  151.         if (norm(X.x - Xt.x) < epsilon || solution::f_calls > Nmax)
  152.         {
  153.             Xt.fit_fun();
  154.             return Xt;
  155.         }
  156.         X = Xt;
  157.     }
  158. }
  159.  
  160. double policz_b(matrix x, matrix d)
  161. {
  162.     int *n = get_size(x);
  163.     double b = 1e9; // duża liczba na początku
  164.     double bi; // zawsze dodatnie
  165.     for (int i = 0; i < n[0]; ++i)
  166.     {
  167.         if (d(i) == 0)
  168.             bi = 1e9;
  169.         else if (d(i) > 0)
  170.             bi = (10 - x(i)) / d(i);
  171.         else
  172.             bi = (-10 - x(i)) / d(i);
  173.         if (b > bi)
  174.             b = bi;
  175.     }
  176.     // b na pewno jest w obszarze dopuszczalnym
  177.     return b;
  178. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement