Advertisement
Lauda

hookjeev / neld

Nov 24th, 2013
399
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 4.79 KB | None | 0 0
  1. % HOOK-JEEV METODA:
  2. function [x, f, cnt] = HookJeev(fun, x0, d, dmin)
  3. % HookJeev metod
  4. % x0 - Pocetno pogadjanje
  5. % d - Pocetni korak
  6. % dmin - Krajnja duzina koraka (uslov zaustavljanja)
  7. % x - Minimum funkcije
  8. % f - Vrijednost minimuma
  9. % cnt - Broj poziva funkcije
  10. n = length(x0);     % Broj promenljivih
  11. e = eye(n) * d;     % Pravci kretanja
  12. x = x0;             % Prva tacka
  13. f = feval(fun, x);  
  14. cnt = 1;
  15.  
  16. while e(1, 1) > dmin
  17.     t = x;
  18.     for i = 1:n
  19.         % Pozitivan smijer
  20.         z = t + e(:, i);
  21.         y = feval(fun, z);
  22.         cnt = cnt + 1;
  23.        
  24.         if y < f
  25.             t = z;
  26.             f = y;
  27.         else
  28.             % Negativan smijer
  29.             z = t - e(:, i);
  30.             y = feval(fun, z);
  31.             cnt = cnt + 1;
  32.            
  33.             if y < f
  34.                 t = z;
  35.                 f = y;
  36.             end
  37.         end
  38.     end
  39.    
  40.     if all(t == x)
  41.         e = e * 0.5;
  42.     else
  43.         x1 = t + (t - x);
  44.         y1 = feval(fun, x1);
  45.         cnt = cnt + 1;
  46.         x = t;
  47.        
  48.         if y1 < f
  49.             for i = 1:n
  50.                 z = x1 + e(:, i);
  51.                 y = feval(fun, z);
  52.                 cnt = cnt + 1;
  53.                
  54.                 if y < y1
  55.                     x = z;
  56.                     f = y;
  57.                     break; % Imamo novu tacku!
  58.                 end
  59.                 z = x1 - e(:, i);
  60.                 y = feval(fun, z);
  61.                 cnt = cnt + 1;
  62.                
  63.                 if y < y1
  64.                     x = z;
  65.                     f = y;
  66.                     break;
  67.                 end
  68.             end
  69.         end
  70.     end
  71. end
  72. end
  73.  
  74. % PLOT:
  75. [x1, x2] = meshgrid(-5:.5:15,-30:.5:10); % -5 : 15 (desna strana), -30 : 10 (lijeva strana) dijagrama
  76. y = fun2(x1, x2);
  77. surf(x1,x2,y)
  78.  
  79. % FUN2.M:
  80. function [fx] = fun2(x1, x2)
  81. % fx =x1.^2+x1.*x2+0.5*x2.^2+x1+10*x2;
  82. fx = 2.*x1.^2 + x2.^2-3;
  83. end
  84.  
  85. % FUN.M:
  86. function [fx] = fun(x)
  87. % fx =x(1).^2+x(1).*x(2)+0.5*x(2).^2+x(1)+10*x(2);
  88. fx = 2.*x(1).^2 + x(2).^2-3;
  89. end
  90.  
  91. % POZIV HOOK-JEEV:
  92. d = 1; % valjda
  93. x0 = [0; 0];
  94. dmin = 0.5; % valjda
  95. [x, f, cnt] = HookJeev('fun', x0, d, dmin)
  96.  
  97. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  98.  
  99. %
  100. % NELDER-MEAD METODA:
  101. %
  102. function [x, fx, cnt] = NeldMead(fun, x, xtol, ftol, maxit)
  103. % NelderMead metod
  104. % x - Pocetna tacka
  105. % xtol, ftol, maxit - Kriterijum zaustavljanja
  106.  
  107. n = prod(size(x));
  108. maxit = maxit * n;
  109.  
  110. % Pocetni simplex:
  111. xin = x(:);
  112. v = xin;
  113. fv = feval(fun, v);
  114.  
  115. for j = 1:n
  116.     y = xin;
  117.    
  118.     if y(j) ~= 0
  119.         y(j) = 1.05 * y(j);
  120.     else
  121.         y(j) = 0.00025;
  122.     end
  123.    
  124.     v = [v y];
  125.     fv = [fv feval(fun, y)];
  126. end
  127.  
  128. [fv, j] = sort(fv);
  129. v = v(:, j);
  130. cnt = n + 1;
  131. alpha = 1;
  132. beta = 1/2;
  133. gamma = 2;
  134. onesn = ones(1, n);
  135. ot = 2:n+1;
  136. on = 1:n;
  137.  
  138. while cnt < maxit
  139.     if max(max(abs(v(:, ot) - v(:, onesn)))) <= xtol && max(abs(fv(1) - fv(ot))) <= ftol
  140.         break;
  141.     end
  142.    
  143.     vbar = (sum(v(:, on)') / n)';
  144.     vr = (1 + alpha) * vbar - alpha * v(:, n+1);
  145.     fr = feval(fun, vr);
  146.     cnt = cnt + 1;
  147.     vk = vr;
  148.     fk = fr;
  149.    
  150.     if fr < fv(n)
  151.         if fr < fv(1)
  152.             ve = gamma * vr + (1 - gamma) * vbar;
  153.             fe = feval(fun, ve);
  154.             cnt = cnt + 1;
  155.            
  156.             if fe < fv(1)
  157.                 vk = ve;
  158.                 fk = fr;
  159.             end
  160.         end
  161.     else
  162.         vt = v(:, n + 1);
  163.         ft = fv(n + 1);
  164.        
  165.         if fr < ft
  166.             vt = vr;
  167.             ft = fr;
  168.         end
  169.        
  170.         vc = beta * vt + (1 - beta) * vbar;
  171.         fc = feval(fun, vc);
  172.         cnt = cnt + 1;
  173.        
  174.         if fc < fv(n)
  175.             vk = vc;
  176.             fk = fc;
  177.         else
  178.             for j = 2:n
  179.                 v(:, j) = (v(:, 1) + v(:, j)) / 2;
  180.                 fv(j) = feval(fun, v(:, j));
  181.             end
  182.            
  183.             vk = (v(:, 1) + v(:, n + 1)) / 2;
  184.             fk = feval(fun, vk);
  185.             cnt = cnt + n;
  186.         end
  187.     end
  188.    
  189.     v(:, n + 1) = vk;
  190.     fv(n + 1) = fk;
  191.     [fv, j] = sort(fv);
  192.     v = v(:, j);
  193. end
  194.  
  195. x(:) = v(:, 1);
  196. fx = fv(1);
  197.  
  198. if cnt == maxit
  199.     disp(['Upozorenje: Maksimalan broj iteracija (',int2str(maxit),') je premasen!']);
  200. end      
  201. end
  202.  
  203. % PLOT:
  204. % prilagoditi koordinate!
  205. [x1, x2] = meshgrid(-5:.5:15,-30:.5:10); % -5 : 15 (desna strana), -30 : 10 (lijeva strana) dijagrama
  206. y = fun2(x1, x2);
  207. surf(x1,x2,y)
  208.  
  209. % FUN2.M:
  210. function [fx] = fun2(x1, x2)
  211. % fx =x1.^2+x1.*x2+0.5*x2.^2+x1+10*x2;
  212. fx = 2.*x1.^2 + x2.^2-3;
  213. end
  214.  
  215. % FUN.M:
  216. function [fx] = fun(x)
  217. % fx =x(1).^2+x(1).*x(2)+0.5*x(2).^2+x(1)+10*x(2);
  218. fx = 2.*x(1).^2 + x(2).^2-3;
  219. end
  220.  
  221. % POZIV NELDMEAD:
  222. xtol = 1; % valjda
  223. ftol = 1; % valjda
  224. x0 = [-2; -2];
  225. maxit = 200;
  226. [x, fx, cnt] = NeldMead('fun', x0, xtol, ftol, maxit)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement