Advertisement
Bkmz

lab2

May 2nd, 2012
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 2.73 KB | None | 0 0
  1. function [ptr,fval] = finmin( func, start, step, eps, varargin )
  2.  
  3. nargs = length(varargin);
  4.  
  5. f_hl = matlabFunction(func);
  6. grad = gradient(func);
  7. max_iter = 400;
  8.  
  9.  
  10. %% gradient cell array for speed optimisation purposes
  11. grad_arr = [sym()];
  12. for i=1:length(start)
  13.     grad_arr(i) = grad(i);
  14. end
  15. grad_hl_arr = num2cell(grad_arr);
  16. for i=1:length(grad_hl_arr)
  17.     grad_hl_arr{i} = matlabFunction( grad_arr(i) );
  18. end
  19.  
  20.  
  21. %% getting vararign params
  22. if nargs == 0
  23.     delta = eps;
  24. elseif nargs == 1
  25.     delta  = varargin{1};
  26. elseif nargs == 2
  27.     delta  = varargin{1};
  28.     max_iter = varargin{2};
  29. end
  30.  
  31. %% function wrappers
  32.     function r = func_wrapper(ptr)
  33.         cell_ptr = num2cell(ptr);
  34.         r = f_hl(cell_ptr{1:length(cell_ptr)});
  35.     end
  36.  
  37.     function r = gradient_wrapper(i, x)
  38.         vars = symvar(grad_arr(i));
  39.         args = {};
  40.         for j = 1:length(vars)
  41.             for k = 1:length(x)
  42.                 if vars(j) == strcat('x', num2str(k))
  43.                     args{length(args) + 1} = x(k);
  44.                     % TODO: remove matlab warning
  45.                     break;
  46.                 end
  47.             end
  48.         end
  49.         r = grad_hl_arr{i}(args{1:length(args)});
  50.     end
  51.  
  52.     function draw_wrapper(ptr, ptr_n)
  53.         cell_ptr = num2cell(ptr);
  54.         plot(cell_ptr{1:length(cell_ptr)}, 'x');
  55.     end
  56.  
  57.     function draw_plot(xV, yV, step);
  58.         [x,y] = meshgrid(-yV:step:yV);
  59.         z = f_hl(x,y);
  60.         contour(x,y,z,32);
  61.     end
  62.  
  63.     function r = f_min_search_wrapper(h, ptr, g)
  64.         z = num2cell(ptr + h*g);
  65.         r    = f_hl(z{1:length(z)});
  66.     end
  67.  
  68. %% prepare for computation
  69. ptr = start
  70.  
  71. hold on
  72. draw_plot(2.1, 2.1, 0.1);
  73.  
  74. %% options for fminunc
  75. options = optimset('Display', 'off') ;
  76. options.LargeScale = 'off';
  77.  
  78. for index=1:max_iter
  79.     %% computing gradient
  80.     g = zeros([1 length(ptr)]);
  81.     for i = 1:length(ptr)
  82.         g(i) = -gradient_wrapper(i, ptr);
  83.     end
  84.    
  85.     %% searcing optimal step
  86.     step = fminunc(@(h)f_min_search_wrapper(h, ptr, g), step, options);
  87.    
  88.     %% main computing
  89.     ptr_n = ptr + (step/4) * g;
  90.    
  91.     %% check result condition to exit loop
  92.     if abs(norm(ptr_n) - norm(ptr)) < delta
  93.         fprintf('DELTA condition worked\n');
  94.         break;
  95.     elseif abs(func_wrapper(ptr_n) - func_wrapper(ptr)) < eps
  96.         fprintf('EPS condition worked\n');
  97.         break;
  98.     end
  99.    
  100.     %% drawing point
  101.     draw_wrapper(ptr, ptr_n);
  102.    
  103.     %% prepare for next itaretion
  104.     ptr = ptr_n;
  105.    
  106.     fprintf('iteration %i\n', index);
  107. end
  108.  
  109. %% drawing last red point
  110. cell_ptr = num2cell(ptr);
  111. plot(cell_ptr{1:length(cell_ptr)},'r*');
  112.  
  113. hold off
  114. %% returning variables
  115. fval = func_wrapper(ptr);
  116. x = ptr;
  117.  
  118. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement