我是MATLAB的新用户。我希望使用Newton-Raphson方法找到使f(x) = 0
成为的值。我曾尝试编写代码,但似乎很难实现Newton-Raphson方法。这就是我到目前为止所做的:
function x = newton(x0, tolerance)
tolerance = 1.e-10;
format short e;
Params = load('saved_data.mat');
theta = pi/2;
zeta = cos(theta);
I = eye(Params.n,Params.n);
Q = zeta*I-Params.p*Params.p';
% T is a matrix(5,5)
Mroot = Params.M.^(1/2); %optimization
T = Mroot*Q*Mroot;
% Find the eigenvalues
E = real(eig(T));
% Find the negative eigenvalues
% Find the smallest negative eigenvalue
gamma = min(E);
% Now solve for lambda
M_inv = inv(Params.M); %optimization
zm = Params.zm;
x = x0;
err = (x - xPrev)/x;
while abs(err) > tolerance
xPrev = x;
x = xPrev - f(xPrev)./dfdx(xPrev);
% stop criterion: (f(x) - 0) < tolerance
err = f(x);
end
% stop criterion: change of x < tolerance % err = x - xPrev;
end
以上功能的用法如下:
% Calculate the functions
Winv = inv(M_inv+x.*Q);
f = @(x)( zm'*M_inv*Winv*M_inv*zm);
dfdx = @(x)(-zm'*M_inv*Winv*Q*M_inv*zm);
x0 = (-1/gamma)/2;
xRoot = newton(x0,1e-10);
答案 0 :(得分:3)
问题不是特别清楚。但是,您是否需要自己实现根发现?如果没有,那么只需使用Matlab的内置函数fzero
(不基于Newton-Raphson)。
如果您确实需要自己实施Newton-Raphson方法,那么我建议您使用Newton Raphsons method in Matlab?的一个答案作为起点。
修改:以下内容未回答您的问题,但只是关于编码风格的说明。
将程序拆分为可重用的块非常有用。在这种情况下,您的根查找应该与您的函数结构分开。我建议您在单独的文件中编写Newton-Raphson方法,并从定义函数及其派生的脚本中调用它。然后你的来源会看起来像:
% Define the function (and its derivative) to perform root finding on:
Params = load('saved_data.mat');
theta = pi/2;
zeta = cos(theta);
I = eye(Params.n,Params.n);
Q = zeta*I-Params.p*Params.p';
Mroot = Params.M.^(1/2);
T = Mroot*Q*Mroot; %T is a matrix(5,5)
E = real(eig(T)); % Find the eigen-values
gamma = min(E); % Find the smallest negative eigen value
% Now solve for lambda (what is lambda?)
M_inv = inv(Params.M);
zm = Params.zm;
Winv = inv(M_inv+x.*Q);
f = @(x)( zm'*M_inv*Winv*M_inv*zm);
dfdx = @(x)(-zm'*M_inv*Winv*Q*M_inv*zm);
x0 = (-1./gamma)/2.;
xRoot = newton(f, dfdx, x0, 1e-10);
在newton.m
中,您将实现Newton-Raphson方法,该方法将您定义的函数句柄作为参数(f
和dfdx
)。使用问题中给出的代码,这看起来像
function root = newton(f, df, x0, tol)
root = x0; % Initial guess for the root
MAXIT = 20; % Maximum number of iterations
for j = 1:MAXIT;
dx = f(root) / df(root);
root = root - dx
% Stop criterion:
if abs(dx) < tolerance
return
end
end
% Raise error if maximum number of iterations reached.
error('newton: maximum number of allowed iterations exceeded.')
end
请注意,我避免使用无限循环。