Newton迭代法

设含有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