不动点迭代法

设含有n个未知数和n个方程的非线性方程组记为:F(x)=0,然后把上述方程组改为便于迭代的等价形式:\(x=\phi(x)\),由此得出不动点迭代法的迭代公式

\[{x}^{k+1}=\phi({x}^{k})\]

如果得到的序列{xk}满足\({lim}_{k\to\infty}{x}^{k}={x}^{*}\),则xk就是\(\phi\)的不动点。这样就可以求出非线性方程组的解。据此,编写不动点迭代法的M文件staticIterate.m,如下所示。

code.matlab
function s=staticIterate(x,eps)
  % 用不动点迭代法求非线性方程组
  % x为迭代初值,eps为允许误差值
  if nargin==1
      eps=1.0e-6;
  elseif nargin<1
      error
      return
  end
  xx=fx(x); %第一次迭代
  while norm(xx-x)>=eps %循环迭代
      x=xx;
      xx=fx(x);
  end
  s=xx;
  return

【例6】用不动点迭代函数求解下列方程组。

\[\left\{ \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} \right.\]

取迭代公式

\(\left\{ \begin{matrix} x{1}_{k+1}=0.1((x{1}_{k}{)}^{2}+(x{2}_{k}{)}^{2}+8) \\ x{2}_{k+1}=0.1(x{1}_{k}*(x{2}_{k}{)}^{2}+x{1}_{k}+8) \end{matrix} \right.\), k=0,1,…

下面用MATLAB实现,首先需要编写上述非线性方程组的M文件fx.m。

code.matlab
function y=fx(x)
  y(1)=0.1*(x(1)*x(1)+x(2)*x(2)+8);
  y(2)=0.1*(x(1)*x(2)*x(2)+x(1)+8);
  y=[y(1) y(2)];

然后用上面编写的不动点迭代函数staticIterate进行求解。

code.matlab
>> staticIterate([0 0])
ans =
    1.0000    1.0000