MikecIT

sviZajedno

Nov 23rd, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 4.50 KB | None | 0 0
  1. function [x, fx] = goldenRatio(fun, a, b, tol)
  2.     c = (3 - sqrt(5)) / 2;
  3.  
  4.     x1 = a + c * (b - a); f1 = feval(fun, x1);
  5.     x2 = a + b - x1; f2 = feval(fun, x2);
  6.  
  7.     while abs(b - a) > tol
  8.         if f1 <= f2
  9.             b = x2;
  10.             x2 = x1;
  11.             f2 = f1;
  12.             x1 = a + c * (b - a);
  13.             f1 = feval(fun, x1);
  14.         else
  15.             a = x1;
  16.             x1 = x2;
  17.             f1 = f2;
  18.             x2 = b - c * (b - a);
  19.             f2 = feval(fun, x2);
  20.         end
  21.  
  22.         if f1 < f2
  23.             x = x1; fx = f1;
  24.         else
  25.             x = x2; fx = f2;
  26.         end
  27.     end
  28. end
  29.  
  30.  
  31. function [x, fx, it] = powell(fun, x0, epsilon)
  32.     n = length(x0);
  33.     u = eye(n);
  34.     x = x0; x1 = x0 + 2 * epsilon;
  35.     it = 0;
  36.  
  37.     while max(abs(x - x1)) > epsilon
  38.         it = it + 1;
  39.         ti = x;
  40.         for i = 1:n
  41.             g = @(s) fun(ti + s * u(:, i));
  42.             teta = goldenRatio(g, -100, 100, epsilon);
  43.             ti = ti + teta * u(:, i);
  44.         end
  45.  
  46.         u = [u(:, i) ti - x];
  47.         x1 = x;
  48.         g = @(s) fun(ti + s * u(:, n));
  49.         teta = goldenRatio(g, -100, 100, epsilon);
  50.         x = ti + teta * u(:, n);
  51.     end
  52.     fx = feval(fun, x);
  53. end
  54.  
  55.  
  56. function [x, fx, cnt] = hookJeeves(fun, x0, d, dmin)
  57.     n = length(x0);
  58.     e = eye(n) * d;
  59.     x = x0;
  60.     fx = feval(fun, x);
  61.     cnt = 1;
  62.  
  63.     while e(1, 1) > dmin
  64.         t = x;
  65.         for i = 1:n
  66.             z = t + e(:, i);
  67.             y = feval(fun, z);
  68.             cnt = cnt + 1;
  69.             if y < fx
  70.             t = z;
  71.             fx = y;
  72.             else
  73.                 z = t - e(:, i);
  74.                 y = feval(fun, z);
  75.                 cnt = cnt + 1;
  76.                 if y < fx
  77.                     t = z;
  78.                     fx = y;
  79.                 end
  80.             end
  81.         end
  82.         if all(t == x)
  83.             e = e * 0.5;
  84.         else
  85.             x1 = t + (t - x);
  86.             f1 = feval(fun, x1);
  87.             cnt = cnt + 1;
  88.             x = t;
  89.             if f1 < fx
  90.                 for i = 1:n
  91.                     z = x1 + e(:, i);
  92.                     y = feval(fun, z);
  93.                     cnt = cnt + 1;
  94.                     if y < f1
  95.                         x = z;
  96.                         fx = y;
  97.                         break;
  98.                     end
  99.                     z = x1 - e(:, i);
  100.                     y = feval(fun, z);
  101.                     cnt = cnt + 1;
  102.                     if y < f1
  103.                         x = z;
  104.                         fx = y;
  105.                         break;
  106.                     end
  107.                 end
  108.             end
  109.         end
  110.     end
  111. end
  112.  
  113.  
  114. function [ x, fx, cnt ] = NelderMead( fun, x, xtol, ftol, maxit )
  115.     n = prod(size(x));
  116.     maxit = maxit * n;
  117.  
  118.     xin = x(:);
  119.     v = xin; fv = feval(fun, v);
  120.  
  121.     for i = 1:n
  122.         y = xin;
  123.         if y(i) ~= 0
  124.             y(i) = y(i) * 1.05;
  125.         else
  126.             y(i) = 0.00025;
  127.         end
  128.          v = [v y];
  129.          fv = [fv feval(fun, y)];
  130.     end
  131.     [fv, j] = sort(fv);
  132.     v = v(:, j);
  133.     cnt = n + 1;
  134.  
  135.     alpha = 1; beta = 1/2; gamma = 2;
  136.     onesn = ones(1, n);
  137.     ot = 2:n + 1;
  138.     on = 1:n;
  139.  
  140.     while cnt < maxit
  141.         if max(max(abs(v(:, ot) - v(:, onesn)))) <= xtol && max(abs(fv(1) - fv(ot))) <= ftol
  142.             break;
  143.         end
  144.  
  145.         vbar = (sum(v(:, on)') / n)';
  146.         vr = (1 + alpha) * vbar - alpha * v(:, n + 1);
  147.         fr = feval(fun, vr); cnt = cnt + 1;
  148.         vk = vr; fk = fr;
  149.         if fr < fv(n)
  150.             if fr < fv(1)
  151.                 ve = (1 + gamma) * vbar - gamma * v(:, n + 1);
  152.                 fe = feval(fun, ve); cnt = cnt + 1;
  153.                 if fe < fr
  154.                     vk = ve; fk = fe;
  155.                 end
  156.             end
  157.         else
  158.             vt = v(:, n + 1); ft = fv(n + 1);
  159.             if fr < ft
  160.                 vt = vr; ft = fr;
  161.             end
  162.             vc = beta * vt + (1 - beta) * vbar;
  163.             fc = feval(fun, vc); cnt = cnt + 1;
  164.             if fc < fv(n)
  165.                 vk = vc; fk = fc;
  166.             else
  167.                 for i = 2:n
  168.                     v(:, i) = (v(:, i) + v(:, 1)) / 2;
  169.                     fv(i) = feval(fun, v(:, i));
  170.                 end
  171.             vk = (v(:, n + 1) + v(:, 1)) / 2;
  172.             fk = feval(fun, vk); cnt = cnt + n;
  173.             end
  174.         end
  175.         v(:, n + 1) = vk;
  176.         fv(n + 1) = fk;
  177.         [fv, i] = sort(fv);
  178.         v = v(:, i);
  179.     end
  180.  
  181.     x(:) = v(:, 1);
  182.     fx = fv(1);
  183. end
Add Comment
Please, Sign In to add comment