设含有n个未知数和n个方程的非线性方程组记为:F(x)=0,然后构造Newton法的迭代公式[大谦MATLAB,dqmatlab点com]
\[{x}^{k+1}={x}^{k}-({F}^{'}(x){)}^{-1}F({x}^{k})\]
将其写成一般不动点迭代的形式,如下所示:
\[\phi(x)=x-({F}^{'}(x){)}^{-1}F({x}^{k})\]
Newton法的实际计算过程是第k步,先解线性方程组
\[{F}^{'}({x}^{k})\Delta{x}^{k}=-F({x}^{k})\]
解出\(\Delta{x}^{k}\)以后,令\({x}^{k+1}={x}^{k}+\Delta{x}^{k}\)。如果\(\Delta{x}^{k}\)的值已经足够小,则求得的\({x}^{k+1}\)即为非线性方程组的解。据此,可以编写Newton迭代法的M文件NewtonIterate.m,如下所示。
code.matlab
function s=NewtonIterate(x,eps)
% 用Newton迭代法求非线性方程组
% x为迭代初值,eps为允许误差值
if nargin==1
eps=1.0e-6;
elseif nargin<1
error
return
end
x1=fx1(x); %非线性方程组
x2=-dfx1(x); %非线性方程组导数
x3=inv(x2);
x0=x3*x1';
while norm(x0)>=eps %循环迭代
x=x0'+x;
x1=fx1(x);
x2=-dfx1(x);
x3=inv(x2);
x0=x3*x1';
end
s=x0'+x;
return
【例7】用上面编写的Newton迭代函数求解下列方程组
\[\begin{matrix} {x}_{1}^{2}-10{x}_{1}+{x}_{2}^{2}+8=0 \\ {x}_{1}{x}_{2}^{2}+{x}_{1}-10{x}_{2}+8=0 \end{matrix}\]
下面用MATLAB实现,编写非线性方程组的M文件fx1.m,如下所示。
code.matlab
function y=fx1(x)
y(1)=x(1)*x(1)-10*x(1)+x(2)*x(2)+8;
y(2)=x(1)*x(2)*x(2)+x(1)-10*x(2)+8;
y=[y(1) y(2)];
然后,编写上述非线性方程组导数的M文件dfx1.m,如下所示:
code.matlab
function y=dfx1(x)
y(1)=2*x(1)-10;
y(2)=2*x(2);
y(3)=x(2)*x(2)+1;
y(4)=2*x(1)*x(2)-10;
y=[y(1) y(2);y(3) y(4)];
最后,用编写的Newton迭代函数NewtonIterate进行求解。
code.matlab
>> NewtonIterate([0 0])
ans =
1.0000 1.0000