|
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- function [x_vals, f_vals, k] = method_SteepDesc_Proj(f, grad_f, xk, sk, limmits, tol, max_iter, mode)
- % f: Objective function
- % grad_f: Gradient of the function
- % xk: Initial point [x0; y0]
- % sk: Step size (fixed positive scalar)
- % limits: Bounds of the feasible set for each dimension
- % tol: Tolerance for stopping criterion
- % max_iter: Maximum number of iterations
-
- % x_vals: Vector with the (x,y) values until minimum
- % f_vals: Vector with f(x,y) values until minimum
- % k: Number of iterations
-
- if strcmp(mode, 'armijo') == 1
- gamma_f = @(f, grad_f, dk, xk) gamma_armijo(f, grad_f, dk, xk);
- elseif strcmp(mode, 'minimized') == 1
- gamma_f = @(f, grad_f, dk, xk) gamma_minimized(f, grad_f, dk, xk);
- else % mode == 'fixed'
- gamma_f = @(f, grad_f, dk, xk) gamma_fixed(f, grad_f, dk, xk);
- end
-
- % Project the first point if needed
- xk = ProjectionPoint(xk, limmits);
-
- % Storage for iterations, begin with the first point
- x_vals = xk;
- f_vals = f(xk);
- for k = 1:max_iter
- % Check for convergence
- if norm(grad_f(xk)) < tol
- break;
- end
- dk = - grad_f(xk); % Steepset descent direction
-
- % First calculate xk-bar and project it if nessesary
- xkbar = xk + sk * dk;
- xkbar = ProjectionPoint(xkbar, limmits);
-
- dk = (xkbar - xk); % Steepest descent projection direction
-
- gk = gamma_f(f, grad_f, dk, xk); % Calculate gamma
-
- x_next = xk + gk * dk; % Update step
- f_next = f(x_next);
-
- xk = x_next; % Update point
- x_vals = [x_vals, x_next]; % Store values
- f_vals = [f_vals, f_next]; % Store function values
- end
- end
|