Advertisement
Guest User

Untitled

a guest
Nov 25th, 2015
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.75 KB | None | 0 0
  1. function [x, fx, cnt] = NeldMead(fun,x,xtol,ftol,maxit)
  2. prikaz = 1; pauza = 0;
  3. disp('Prikazuje se svaki korak')
  4. disp('za ukidanje prikaza postaviti: prikaz=0')
  5. pause
  6.  
  7. n = prod(size(x));
  8. maxit = maxit*n;
  9.  
  10. % Set up a simplex near the initial guess.
  11. xin = x(:); % Force xin to be a column vector
  12. v = xin; % Place input guess in the simplex! (credit L.Pfeffer at Stanford)
  13. fv = feval(fun,v);
  14.  
  15. % inicijalini simplex
  16. for j = 1:n
  17. y = xin;
  18. if y(j) ~= 0
  19. y(j) = 1.2*y(j);
  20. else
  21. y(j) = 0.00025;
  22. end
  23. v = [v y];
  24. fv = [fv feval(fun,y)];
  25. end
  26. [fv,j] = sort(fv);
  27. v = v(:,j);
  28. cnt = n+1;
  29.  
  30. if prikaz
  31. clc
  32. format compact
  33. % format short e
  34. home
  35. disp(' ')
  36. cnt
  37. disp('initial ')
  38. v
  39. fv
  40. if n==2, plot([v(1,:) v(1,1)],[v(2,:) v(2,1)]), drawnow, end
  41. if pauza, pause, end
  42. end
  43.  
  44. alpha = 1; beta = 1/2; gamma = 2;
  45. onesn = ones(1,n);
  46. ot = 2:n+1;
  47. on = 1:n;
  48.  
  49. % Iterate until the diameter of the simplex is less than tol.
  50. while cnt < maxit
  51. if max(max(abs(v(:,ot)-v(:,onesn)))) <= xtol & ...
  52. max(abs(fv(1)-fv(ot))) <= ftol
  53. break
  54. end
  55.  
  56. % One step of the Nelder-Mead simplex algorithm
  57.  
  58. vbar = (sum(v(:,on)')/n)';
  59. % if prikaz, disp('Teziste'), disp(vbar), end
  60. vr = (1 + alpha)*vbar - alpha*v(:,n+1);
  61. fr = feval(fun,vr); cnt = cnt + 1;
  62. vk = vr; fk = fr; how = 'reflect ';
  63. if fr < fv(n)
  64. if fr < fv(1)
  65. ve = gamma*vr + (1-gamma)*vbar;
  66. fe = feval(fun,ve); cnt = cnt + 1;
  67. if fe < fv(1)
  68. vk = ve; fk = fe;
  69. how = 'expand ';
  70. end
  71. end
  72. else
  73. vt = v(:,n+1); ft = fv(n+1);
  74. if fr < ft
  75. vt = vr; ft = fr;
  76. end
  77. vc = beta*vt + (1-beta)*vbar;
  78. fc = feval(fun,vc); cnt = cnt + 1;
  79. if fc < fv(n)
  80. vk = vc; fk = fc;
  81. how = 'contract';
  82. else
  83. for j = 2:n
  84. v(:,j) = (v(:,1) + v(:,j))/2;
  85. fv(j) = feval(fun,v(:,j));
  86. end
  87. vk = (v(:,1) + v(:,n+1))/2;
  88. fk = feval(fun,vk); cnt = cnt + n;
  89. how = 'shrink ';
  90. end
  91. end
  92. v(:,n+1) = vk;
  93. fv(n+1) = fk;
  94. [fv,j] = sort(fv);
  95. v = v(:,j);
  96.  
  97. if prikaz
  98. disp(' ')
  99. cnt
  100. disp(how)
  101. v
  102. size(v)
  103. fv
  104. if n==2, plot([v(1,:) v(1,1)],[v(2,:) v(2,1)]), drawnow, end
  105.  
  106. %if pauza
  107. %keyboard
  108. %end
  109. end
  110. end
  111. x(:) = v(:,1);
  112. if prikaz, format, end
  113. fx=min(fv);
  114. if cnt==maxit
  115. if prikaz
  116. disp(['Upozorenje: Maksimalan broj iteracija (', ...
  117. int2str(maxit),') je premasen']);
  118. end
  119. end
  120.  
  121. *****************************
  122. function demoNelderMead(fun,x0,xtol,ftol,maxit,x1span,x2span)
  123. clc
  124. optdemop(fun,x1span,x2span);
  125. NeldMead(fun,x0,xtol,ftol,maxit)
  126. ***************************
  127. function optdemop(f,x,y)
  128. clc
  129. disp(['Funkcija: ', f] )
  130. hold off
  131. clf
  132. %
  133. % racunanje vrednosti f-je 2 promenljive
  134. %
  135. [x,y] = meshgrid( x, y );
  136. z=zeros(size(x));
  137. pomoc = [x(:),y(:)]';
  138. p = zeros(1,length(pomoc));
  139. for i=1:length(pomoc), p(i)=feval(f,pomoc(:,i));, end
  140. z(:) = p;
  141. %
  142. % 3-D
  143. %
  144. figure(1)
  145. surf(x,y,z)
  146. shading interp;
  147. colormap jet;
  148. xlabel('x1'), ylabel('x2'), zlabel('f'), title('3D dijagram')
  149. disp('Sa view(...) se moze menjati pogled na f-ju'),pause
  150. %keyboard
  151. %
  152. % crtanje kontura funkcije
  153. %
  154. %clf
  155. %contour(x,y,z,30,'k--')
  156. %surf(x,y,z)
  157.  
  158. figure(2)
  159. contour3(x,y,z,30)
  160. surface(x,y,z,'EdgeColor','none','FaceColor','none')
  161. %shading interp;
  162. grid off
  163. view(0,90)
  164. xlabel('x1'), ylabel('x2'), title('Konturni dijagram')
  165. drawnow
  166. hold on
  167.  
  168. dx=x(1,2)-x(1,1);
  169. dy=y(2,1)-y(1,1);
  170. [px,py] = gradient(z,dx,dy);
  171. quiver(x,y,px,py)
  172. 
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement