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