Advertisement
Bkmz

Untitled

May 2nd, 2012
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 1.89 KB | None | 0 0
  1. function [ptr,fval] = finmin( func, start, step, eps, varargin )
  2.  
  3. %% Обработка получаемых параметров
  4.  
  5. nargs = length(varargin);
  6.  
  7. f_hl = matlabFunction(func);
  8. grad = gradient(func);
  9. max_iter = 200;
  10.  
  11.  
  12. if nargs == 0
  13.     delta = eps;
  14. elseif nargs == 1
  15.     delta  = varargin{1};
  16. elseif nargs == 2
  17.     max_iter = varargin{2};
  18. end
  19.  
  20.  
  21.     function r = func_wrapper(ptr)
  22.         cell_ptr = num2cell(ptr);
  23.         r = f_hl(cell_ptr{1:length(cell_ptr)});
  24.     end
  25.  
  26.     function r = gradient_wrapper(i, x)
  27.         vars = symvar(grad(i));
  28.         args = {};
  29.         for j = 1:length(vars)
  30.             for k = 1:length(x)
  31.                 if vars(j) == strcat('x', num2str(k))
  32.                     args{length(args) + 1} = x(k);
  33.                     % TODO: remove matlab warning
  34.                     break;
  35.                 end
  36.             end
  37.         end
  38.         grad_hl = matlabFunction(grad(i));
  39.         r = grad_hl(args{1:length(args)});
  40.     end
  41.  
  42.     function draw_wrapper(ptr)
  43.         cell_ptr = num2cell(ptr);
  44.         plot(cell_ptr{1:length(cell_ptr)},'x');
  45.        
  46.     end
  47.  
  48.     function draw_plot(xV, yV, step);
  49.         [x,y] = meshgrid(-xV:step:xV, -yV:step:yV);
  50.         z = f_hl(x,y);
  51.         contour(x,y,z,32);
  52.     end
  53. ptr = start
  54.  
  55. hold on
  56. draw_plot(1.5, 1.5, 0.1);
  57.  
  58. for i=1:max_iter
  59.     g = zeros([1 length(ptr)]);
  60.     for i = 1:length(ptr)
  61.         g(i) = -gradient_wrapper(i, ptr);
  62.     end
  63.    
  64.     %% сам алгоритм =)
  65.     ptr_n = ptr + step * g;
  66.    
  67.     %% проверка на условие выхода
  68.     if abs(norm(ptr_n) - norm(ptr)) < delta
  69.         fprintf('DELTA Exit condition worked\n');
  70.         break;
  71.     elseif abs(func_wrapper(ptr_n) - func_wrapper(ptr)) < eps
  72.         fprintf('EPS Exit condition worked\n');
  73.         break;
  74.     end
  75.    
  76.     draw_wrapper(ptr);
  77.    
  78.     ptr = ptr_n;
  79. end
  80.  
  81. hold off
  82. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement