Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function [ptr,fval] = finmin( func, start, step, eps, varargin )
- %% Обработка получаемых параметров
- nargs = length(varargin);
- f_hl = matlabFunction(func);
- grad = gradient(func);
- max_iter = 200;
- if nargs == 0
- delta = eps;
- elseif nargs == 1
- delta = varargin{1};
- elseif nargs == 2
- max_iter = varargin{2};
- end
- function r = func_wrapper(ptr)
- cell_ptr = num2cell(ptr);
- r = f_hl(cell_ptr{1:length(cell_ptr)});
- end
- function r = gradient_wrapper(i, x)
- vars = symvar(grad(i));
- args = {};
- for j = 1:length(vars)
- for k = 1:length(x)
- if vars(j) == strcat('x', num2str(k))
- args{length(args) + 1} = x(k);
- % TODO: remove matlab warning
- break;
- end
- end
- end
- grad_hl = matlabFunction(grad(i));
- r = grad_hl(args{1:length(args)});
- end
- function draw_wrapper(ptr)
- cell_ptr = num2cell(ptr);
- plot(cell_ptr{1:length(cell_ptr)},'x');
- end
- function draw_plot(xV, yV, step);
- [x,y] = meshgrid(-xV:step:xV, -yV:step:yV);
- z = f_hl(x,y);
- contour(x,y,z,32);
- end
- ptr = start
- hold on
- draw_plot(1.5, 1.5, 0.1);
- for i=1:max_iter
- g = zeros([1 length(ptr)]);
- for i = 1:length(ptr)
- g(i) = -gradient_wrapper(i, ptr);
- end
- %% сам алгоритм =)
- ptr_n = ptr + step * g;
- %% проверка на условие выхода
- if abs(norm(ptr_n) - norm(ptr)) < delta
- fprintf('DELTA Exit condition worked\n');
- break;
- elseif abs(func_wrapper(ptr_n) - func_wrapper(ptr)) < eps
- fprintf('EPS Exit condition worked\n');
- break;
- end
- draw_wrapper(ptr);
- ptr = ptr_n;
- end
- hold off
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement