资源描述:
《《数值计算方法》课程设计》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、《数值计算方法》课程设计非线性方程(组)的解法问题的提出分析比较Newton法、Newton法的变形格式。然后分别用Newton法、简化Newton法、选取不同的初值求解下面方程组,对于相同的精度要求,比较这两种方法的运行时间。背景分析牛顿法是一种重要迭代法,他是逐步线性化方法的典型代表,牛顿法的特点是每一步都需要计算以及,其计算量比较大,为了减少计算量,提出简化牛顿法。算法思想1、牛顿法设有非线性方程组其中由偏导数作成的矩阵记为,称为的雅克比矩阵设为的解,且设为的近似解。现利用多元函数在点的泰勒公式有其
2、中,在与的所连的线段内。如果用上式中的线性函数近似替代,并将线性方程组…..(1)的解作为的第次近似解记为将(1)式写成矩阵形式,即为非奇异矩阵,则牛顿迭代公式:……………………………(2)求解非线性方程组牛顿方法为2、简化牛顿法在牛顿法的基础上,为了减少计算量,将均取为,得如下简化牛顿公式:…………………(3)其中(2)(3)式均为线性收敛的。算法设计将一个非线性方程组写成向量的形式有:F(x)=0 牛顿迭代法的公式就是:x(k+1)=x(k)-F’(x(k))-1F(x(k)) 其中F
3、’(x(k))为Jacobi矩阵,我写的这段程序就是根据这个公式来的。运用MATLAB中的jacobian求出F的雅克比矩阵,用inv求逆matrix=@(varargin)[varargin{:}]构造迭代函数在比较牛顿法和简化牛顿法运行时间方面,我们主要是通过比较迭代次数。程序清单牛顿法源程序:functionx=newton_solve(F,v,x0,e)if(~ischar(F)
4、
5、~ischar(v))%定义类型error('ParameterFandvshouldbechartype!');e
6、ndif(~isnumeric(x0)
7、
8、~isnumeric(e))error('Parameterx0andeshouldbenumerictype!');endF=sym(F);v=sym(v);dF=jacobian(F,v);tF=inv(dF)*Fforindex=1:numel(v)tF=subs(tF,v(index),['x('num2str(index)')']);%把x分量化,把x1变成x(1),把x2变成x(2)endmatrix=@(varargin)[varargin{:}].
9、';%构造迭代函数phi=['x-'char(tF)];eval(['phi=@(x)'phi';']);err=inf;%无穷大xold=phi(x0);n=0;whileerr>exnew=phi(xold);%用本次结果与上次结果差的范数来衡量误差err=norm(xnew-xold);xold=xnew;n=n+1;%迭代次数大于10000是退出循环if(n>10000)break;endn%迭代次数endx=xold;简化牛顿法的源程序:functionx=simnewton_solve(F,v
10、,x0,e)if(~ischar(F)
11、
12、~ischar(v))%定义类型error('ParameterFandvshouldbechartype!');endif(~isnumeric(x0)
13、
14、~isnumeric(e))error('Parameterx0andeshouldbenumerictype!');endF=sym(F);v=sym(v);dF=jacobian(F,v);tF=inv(dF)%dF的逆矩阵tF11=-x0(2)/(-x0(2)+4*x0(1));tF12=1/(-x0(
15、2)+4*x0(1));tF21=2*x0(1)/(-x0(2)+4*x0(1));tF22=-1/2/(-x0(2)+4*x0(1));tF=[tF11,tF12;tF21,tF22]%把dF的逆矩阵用初始值x0代入,得到一常数矩阵,(简化牛顿法的思想)tF=tF*F;forindex=1:numel(v)tF=subs(tF,v(index),['x('num2str(index)')']);%把x分量化,把x1变成x(1),把x2变成x(2)endmatrix=@(varargin)[varargi
16、n{:}].';%构造迭代函数phi=['x-'char(tF)];eval(['phi=@(x)'phi';']);err=inf;%无穷大xold=phi(x0);n=0;whileerr>exnew=phi(xold);%用本次结果与上次结果差的范数来衡量误差err=norm(xnew-xold);xold=xnew;n=n+1;%迭代次数大于10000是退出循环if(n>10000)break;endn%迭代次数end