📄 newton.m
字号:
function lambda = newton(lambda_0,delta,s,beta,omega,delta_0)%NEWTON Newton iteration (utility routine for DISCREP).%% lambda = newton(lambda_0,delta,s,beta,omega,delta_0)%% Uses Newton iteration to find the solution lambda to the equation% || A x_lambda - b || = delta ,% where x_lambda is the solution defined by Tikhonov regularization.%% The initial guess is lambda_0.%% The norm || A x_lambda - b || is computed via s, beta, omega and% delta_0. Here, s holds either the singular values of A, if L = I,% or the c,s-pairs of the GSVD of (A,L), if L ~= I. Moreover,% beta = U'*b and omega is either V'*x_0 or the first p elements of% inv(X)*x_0. Finally, delta_0 is the incompatibility measure.% Reference: V. A. Morozov, "Methods for Solving Incorrectly Posed% Problems", Springer, 1984; Chapter 26.% Per Christian Hansen, IMM, 12/29/97.% Set defaults.thr = sqrt(eps); % Relative stopping criterion.it_max = 50; % Max number of iterations.% Initialization.if (lambda_0 < 0) error('Initial guess lambda_0 must be nonnegative')end[p,ps] = size(s);if (ps==2), sigma = s(:,1); s = s(:,1)./s(:,2); ends2 = s.^2;% Use Newton's method to solve || b - A x ||^2 - delta^2 = 0.% It was found experimentally, that this formulation is superior% to the formulation || b - A x ||^(-2) - delta^(-2) = 0.lambda = lambda_0; step = 1; it = 0;while (abs(step) > thr*lambda & abs(step) > thr & it < it_max), it = it+1; f = s2./(s2 + lambda^2); if (ps==1) r = (1-f).*(beta - s.*omega); z = f.*r; else r = (1-f).*(beta - sigma.*omega); z = f.*r; end step = (lambda/4)*(r'*r + (delta_0+delta)*(delta_0-delta))/(z'*r); lambda = lambda - step; % If lambda < 0 then restart with smaller initial guess. if (lambda < 0), lambda = 0.5*lambda_0; lambda_0 = 0.5*lambda_0; endend% Terminate with an error if too many iterations.if (abs(step) > thr*lambda & abs(step) > thr) error(['Max. number of iterations (',num2str(it_max),') reached'])end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -