Advertisement
MikecIT

NelderMead

Nov 23rd, 2018
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 1.84 KB | None | 0 0
  1. function [ x, fx, cnt ] = NelderMead( fun, x, xtol, ftol, maxit )
  2.     n = prod(size(x));
  3.     maxit = maxit * n;
  4.  
  5.     xin = x(:);
  6.     v = xin; fv = feval(fun, v);
  7.  
  8.     for i = 1:n
  9.         y = xin;
  10.         if y(i) ~= 0
  11.             y(i) = y(i) * 1.05;
  12.         else
  13.             y(i) = 0.00025;
  14.         end
  15.          v = [v y];
  16.          fv = [fv feval(fun, y)];
  17.     end
  18.     [fv, j] = sort(fv);
  19.     v = v(:, j);
  20.     cnt = n + 1;
  21.  
  22.     alpha = 1; beta = 1/2; gamma = 2;
  23.     onesn = ones(1, n);
  24.     ot = 2:n + 1;
  25.     on = 1:n;
  26.  
  27.     while cnt < maxit
  28.         if max(max(abs(v(:, ot) - v(:, onesn)))) <= xtol && max(abs(fv(1) - fv(ot))) <= ftol
  29.             break;
  30.         end
  31.  
  32.         vbar = (sum(v(:, on)') / n)';
  33.         vr = (1 + alpha) * vbar - alpha * v(:, n + 1);
  34.         fr = feval(fun, vr); cnt = cnt + 1;
  35.         vk = vr; fk = fr;
  36.         if fr < fv(n)
  37.             if fr < fv(1)
  38.                 ve = (1 + gamma) * vbar - gamma * v(:, n + 1);
  39.                 fe = feval(fun, ve); cnt = cnt + 1;
  40.                 if fe < fr
  41.                     vk = ve; fk = fe;
  42.                 end
  43.             end
  44.         else
  45.             vt = v(:, n + 1); ft = fv(n + 1);
  46.             if fr < ft
  47.                 vt = vr; ft = fr;
  48.             end
  49.             vc = beta * vt + (1 - beta) * vbar;
  50.             fc = feval(fun, vc); cnt = cnt + 1;
  51.             if fc < fv(n)
  52.                 vk = vc; fk = fc;
  53.             else
  54.                 for i = 2:n
  55.                     v(:, i) = (v(:, i) + v(:, 1)) / 2;
  56.                     fv(i) = feval(fun, v(:, i));
  57.                 end
  58.             vk = (v(:, n + 1) + v(:, 1)) / 2;
  59.             fk = feval(fun, vk); cnt = cnt + n;
  60.             end
  61.         end
  62.         v(:, n + 1) = vk;
  63.         fv(n + 1) = fk;
  64.         [fv, i] = sort(fv);
  65.         v = v(:, i);
  66.     end
  67.  
  68.     x(:) = v(:, 1);
  69.     fx = fv(1);
  70. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement