1 function [xnew, resnorm, residual, exitflag, output] =
newton_raphson(funptr, x0, params)
2 %
function [vnew, resnorm, residual, exitflags, output] =
newton_raphson(funptr, vold, params)
3 % Global projected Levenberg-Marquard method
5 if ~isfield(params,
'beta')
8 if ~isfield(params, 'gamma')
9 params.gamma = 0.999995;
11 if ~isfield(params, 'sigma')
14 if ~isfield(params, 'TolLineSearch')
15 params.TolLineSearch = 1e-10;
17 if ~isfield(params, 'TolFuncCount')
18 params.TolFuncCount = inf;
20 if ~isfield(params, 'TolRes')
23 if ~isfield(params, 'TolChange')
24 params.TolChange = 1e-10;
26 if ~isfield(params, 'maxIter')
30 if ~isfield(params, 'debug')
43 [F, J] = funptr(xold);
44 %J = computed_jacobian(J, xold, funptr);
52 % function converged to zero
53 [max_F, max_i] = max(abs(F));
54 imaxes = [imaxes, max_i];
55 resmaxes = [resmaxes, max_F];
56 disp(['i = ', num2str(imaxes(end)), ' max = ', num2str(resmaxes(end))]);
57 if resmaxes(end) < params.TolRes
63 disp('Found solution.');
69 % change in residual too small
70 if max(abs(F-Fold)) < params.TolChange
72 disp('Change in residual too small');
76 %one_rows = find(xold(1:400) > 1-100*eps);
77 % if ~isempty(one_rows)
80 % TI = repmat(one_rows', m, 1);
82 % TJ = repmat((1:m)', 1, length(one_rows));
84 % T = sparse(TI, TJ, ones(1, length(one_rows)*m), n, m);
86 %J(sub2ind([n, m], one_rows, one_rows)) = 0;
87 % J(:, one_rows) = 0; %= %J - (J & T);
91 xnew = params.Px(xold + defect);
93 % first order optimalities
94 foms = [foms, max(gf)];
96 [Fnew, Jnew] = funptr(xnew);
97 fnew = sum(Fnew.*Fnew);
102 [OK, ok_mat] = check_jacobian(pxnext, funptr, Jcand);
105 if nFnew <= params.gamma * nF
106 % found local iteration
116 % line search too small
117 if tkc < params.TolLineSearch
120 disp('Line search failed.');
124 xnew = params.Px(xold + tkc*defect);
126 [Fnew, Jnew] = funptr(xnew);
127 fnew = sum(Fnew.*Fnew);
131 if sum(Fnew.*Fnew) <= f + params.sigma * gf' * defect
140 tkc = tkc * params.beta;
148 stepsizes = [stepsizes, norm(xnew - xold)];
150 if max(abs(xnew - xold)) < params.TolChange
152 disp('Step change too small.');
157 % tempsols = [tempsols, xold];
159 % too many iterations
161 if k > params.maxIter
163 disp('Maximum number of iterations exceeded.');
167 if funcI > params.TolFuncCount
169 disp('Maximum number of function evaluations exceeded.');
177 output.iterations = k;
178 output.funcCount = funcI;
179 output.stepsize = stepsizes;
180 output.firstorderopt = foms;
181 output.resmax = resmaxes;
184 % tempsols = PCA_fixspace(tempsols, [], [], 2);
189 function jac_comp = computed_jacobian(jac_test, X, fun)
190 jac_comp = zeros(size(jac_test));
192 for j = 1:size(jac_test, 2);
193 addend = zeros(size(X));
195 jac_comp(:,j) = 1/(2e-10) .* (fun(X + addend) - fun(X - addend));
198 function [OK, ok_mat] = check_jacobian(Utest, fun, jac_test, epsilon)
204 jac_comp = computed_jacobian(jac_test, Utest, fun);
206 nz_elements = abs(jac_comp) > 1e6*eps;
207 ok_mat = zeros(size(jac_test));
208 ok_mat(nz_elements) = abs(jac_comp(nz_elements) - jac_test(nz_elements))./(abs(jac_comp(nz_elements))) > epsilon;
209 ok_mat = ok_mat + (nz_elements) - (abs(full(jac_test)) > 100*eps);
210 OK = all(~ok_mat(:));
213 disp('Jacobian incorrect: ');
function [ xnew , resnorm , residual , exitflag , output ] = newton_raphson(funptr, x0, params)
Global projected Levenberg-Marquard method.