非线性方程组的牛顿迭代法(含matlab程序)

非线性方程组的牛顿迭代法

定义:

非线性方程组如下所示

\left\{\begin{matrix} f_1(x_1,x_2,...,x_n)=0\\ f_2(x_1,x_2,...,x_n)=0\\ ...\\ f_n(x_1,x_2,...,x_n)=0 \end{matrix}\right.

若采用向量可以表示为,x=(x_1,x_2,...,x_n)^{^{T}}\sqsubset R^{n},F=(f_1,f_2,...,f_n)^{T},方程组可以写为F(x)=0。

将单个方程的牛顿迭代法直接应用于上述方程组,则可以得到非线性方程组的牛顿迭代法。

x^{^{k+1}}=x^{k}-F'(x^{(k)})^{-1}F(x^{(k)}), k=0,1,2,...

其中,F(x^{k}))^{-1}为给出的雅克比矩阵的逆矩阵。

定理(收敛性):

设F(x)的定义域为D\sqsubset R^{^{n}}x* \in D满足F(x*)=0,在x*的开领域S_{0}\subset D上F'(x)存在且连续,F'(x*)非奇异,则牛顿法生成的序列{x(k)}在闭域S\subset S_0上超线性收敛于x*,若还存在常数L>0,使\left \| F'(x)-F'(x^{^{*}})) \right \|\leq L\left \| x-x^{*} \right \|, \forall x\in S,则{x(k)}至少平方收敛。

步骤:

计算时计x^{k+1}-x^{k}=\Delta x^{k}

先计算线性方程组F'(x^k)\Delta x^k=-F(x^k),求出向量\Delta x^k

再令x^{^{k+1}}=x^k+\Delta x^k,每步包括了计算向量函数F(x^k)F'(x^k)


例题1(二元非线性方程组)

\left\{\begin{matrix} x_1^{2}-10x_1+x_2^{2}+8=0\\ x_1x_2^{2}+x_1-10x_2+8=0 \end{matrix}\right.

x^{^{(0)}}=(0,0)^{^{T}}

程序:

1、建立非线性方程组F.m函数文件

function f=F(x)
f(1)=x(1)^2-10*x(1)+x(2)^2+8;
f(2)=x(1)*x(2)^2+x(1)-10*x(2)+8;
f=[f(1),f(2)]';
2、建立雅克比矩阵DF.m函数文件

function df=DF(x)
df=[2*x(1)-10,2*x(2);x(2)^2+1,2*x(1)*x(2)-10];

3、编写迭代程序Nonlinearequations.m命令文件

clear;
clc;
x=[0,0]';
f=F(x);
df=DF(x);
fprintf('%d %.7f %.7f\n',i,x(1),x(2));
N=4;
for i=1:N
    y=-inv(df)*f;      
    x=x+y;
    f=F(x);
    df=DF(x);
    fprintf('%d %.7f %.7f\n',i,x(1),x(2));
    if norm(y)<0.0000001
        break;
    end
end

程序执行结果为:

0 0.0000000 0.0000000
1 0.8000000 0.8800000
2 0.9917872 0.9917117
3 0.9999752 0.9999685
4 1.0000000 1.0000000

例题2(三元非线性方程组)

\left\{\begin{matrix} 3x_1-cos(x_2x_3)-\frac{1}{2}=0\\ x\tfrac{2}{1}-81(x_2+0.1)^2+sinx_3+1.06=0\\ e^{-x_1x_2}+20x_3+\frac{10}{3}\pi -1=0 \end{matrix}\right.

给定初值x^{(0)}=(0,0,0)^T,计算精度要求到\left \| x^k-x^{k-1} \right \|< 10^{-8}停止。

程序及运行结果参照我的博客下载专区,文件名:三元非线性方程组的牛顿迭代法程序。

总结:牛顿迭代法是解非线性方程组中最重要的方法。在MATLAB库中,提供函数为fsolve来求解方程组的解。

其函数调用格式为X=fsolve(@fun,X0,option)    %MATLAB7的格式

求解过程会用到优化工具箱(Optimization Toolbox)。该工具箱提供了20多个选项,用户可使用optimset命令来讲它们显示出来。可以调用optimset()函数来改变某个选项,Display选项决定函数调用时的中间结构显示方式:off_不显示;iter表示每步显示,final只显示最终结果。

其函数调用格式为X=fsolve(fun,X0)                   %MATLAB2016的格式

fun为待求根的函数文件名,X0为搜索的起点。

你可能感兴趣的:(科研)