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 = 400;
- %% gradient cell array for speed optimisation purposes
- grad_arr = [sym()];
- for i=1:length(start)
- grad_arr(i) = grad(i);
- end
- grad_hl_arr = num2cell(grad_arr);
- for i=1:length(grad_hl_arr)
- grad_hl_arr{i} = matlabFunction( grad_arr(i) );
- end
- %% getting vararign params
- if nargs == 0
- delta = eps;
- elseif nargs == 1
- delta = varargin{1};
- elseif nargs == 2
- delta = varargin{1};
- max_iter = varargin{2};
- end
- %% function wrappers
- 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_arr(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
- r = grad_hl_arr{i}(args{1:length(args)});
- end
- function draw_wrapper(ptr, ptr_n)
- cell_ptr = num2cell(ptr);
- plot(cell_ptr{1:length(cell_ptr)}, 'x');
- end
- function draw_plot(xV, yV, step);
- [x,y] = meshgrid(-yV:step:yV);
- z = f_hl(x,y);
- contour(x,y,z,32);
- end
- function r = f_min_search_wrapper(h, ptr, g)
- z = num2cell(ptr + h*g);
- r = f_hl(z{1:length(z)});
- end
- %% prepare for computation
- ptr = start
- hold on
- draw_plot(2.1, 2.1, 0.1);
- %% options for fminunc
- options = optimset('Display', 'off') ;
- options.LargeScale = 'off';
- for index=1:max_iter
- %% computing gradient
- g = zeros([1 length(ptr)]);
- for i = 1:length(ptr)
- g(i) = -gradient_wrapper(i, ptr);
- end
- %% searcing optimal step
- step = fminunc(@(h)f_min_search_wrapper(h, ptr, g), step, options);
- %% main computing
- ptr_n = ptr + (step/4) * g;
- %% check result condition to exit loop
- if abs(norm(ptr_n) - norm(ptr)) < delta
- fprintf('DELTA condition worked\n');
- break;
- elseif abs(func_wrapper(ptr_n) - func_wrapper(ptr)) < eps
- fprintf('EPS condition worked\n');
- break;
- end
- %% drawing point
- draw_wrapper(ptr, ptr_n);
- %% prepare for next itaretion
- ptr = ptr_n;
- fprintf('iteration %i\n', index);
- end
- %% drawing last red point
- cell_ptr = num2cell(ptr);
- plot(cell_ptr{1:length(cell_ptr)},'r*');
- hold off
- %% returning variables
- fval = func_wrapper(ptr);
- x = ptr;
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement