资源描述
数值计算方法课程设计
12
2020年4月19日
文档仅供参考
《数值计算方法》课程设计
非线性方程(组)的解法
问题的提出
分析比较Newton法、Newton法的变形格式。然后分别用Newton 法、简化Newton 法、选取不同的初值求解下面方程组,对于相同的精度要求,比较这两种方法的运行时间。
背景分析
牛顿法是一种重要迭代法,她是逐步线性化方法的典型代表,牛顿法的特点是每一步都需要计算以及,其计算量比较大,为了减少计算量,提出简化牛顿法。
算法思想
1、牛顿法
设有非线性方程组
其中
由偏导数作成的矩阵记为,称为的雅克比矩阵
设为的解,且设为的近似解。现利用多元函数在点的泰勒公式有
其中,在与的所连的线段内。
如果用上式中的线性函数近似替代,并将线性方程组
…..(1)
的解作为的第次近似解记为
将(1)式写成矩阵形式,即
为非奇异矩阵,则牛顿迭代公式:
……………………………(2 )
求解非线性方程组牛顿方法为
2、简化牛顿法
在牛顿法的基础上,为了减少计算量,将均取为,得如下简化牛顿公式:
…………………(3 )
其中(2)(3)式均为线性收敛的。
算法设计
将一个非线性方程组写成向量的形式有:
F(x) = 0
牛顿迭代法的公式就是:
x(k+1)=x(k)-F’(x(k))-1F(x(k))
其中F’(x(k))为Jacobi矩阵,我写的这段程序就是根据这个公式来的。
运用MATLAB中的jacobian求出F的雅克比矩阵,用inv求逆
matrix=@(varargin)[varargin{:}]构造迭代函数
在比较牛顿法和简化牛顿法运行时间方面,我们主要是经过比较迭代次数。
程序清单
牛顿法源程序:
function x=newton_solve(F,v,x0,e)
if (~ischar(F) || ~ischar(v)) %定义类型
error('Parameter F and v should be char type!');
end
if (~isnumeric(x0) || ~isnumeric(e))
error('Parameter x0 and e should be numeric type!');
end
F=sym(F);v=sym(v);
dF=jacobian(F,v);
tF=inv(dF)*F
for index=1:numel(v)
tF=subs(tF,v(index),['x(' num2str(index) ')']); %把x分量化,把x1变成x(1),把x2变成x(2)
end
matrix=@(varargin)[varargin{:}].';
%构造迭代函数
phi=['x-' char(tF)];
eval(['phi=@(x)' phi ';']);
err=inf; %无穷大
xold=phi(x0);
n=0;
while err>e
xnew=phi(xold);
%用本次结果与上次结果差的范数来衡量误差
err=norm(xnew-xold);
xold=xnew;
n=n+1;
%迭代次数大于10000是退出循环
if (n>10000)
break;
end
n%迭代次数
end
x=xold;
简化牛顿法的源程序:
function x=simnewton_solve (F,v,x0,e)
if (~ischar(F) || ~ischar(v)) %定义类型
error('Parameter F and v should be char type!');
end
if (~isnumeric(x0) || ~isnumeric(e))
error('Parameter x0 and e should be numeric type!');
end
F=sym(F);v=sym(v);
dF=jacobian(F,v);
tF=inv(dF)% dF的逆矩阵
tF11= -x0(2)/(-x0(2)+4*x0(1));
tF12=1/(-x0(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;
for index=1:numel(v)
tF=subs(tF,v(index),['x(' num2str(index) ')']); %把x分量化,把x1变成x(1),把x2变成x(2)
end
matrix=@(varargin)[varargin{:}].';
%构造迭代函数
phi=['x-' char(tF)];
eval(['phi=@(x)' phi ';']);
err=inf; %无穷大
xold=phi(x0);
n=0;
while err>e
xnew=phi(xold);
%用本次结果与上次结果差的范数来衡量误差
err=norm(xnew-xold);
xold=xnew;
n=n+1;
%迭代次数大于10000是退出循环
if (n>10000)
break;
end
n%迭代次数
end
x=xold;
运行结果分析
newton_solve('[x1+2*x2-3;2*x1^2+x2^2-5]','[x1;x2]',[1.5;1],0.0001)
n =
2
ans =
1.4880
0.7560
simnewton_solve('[x1+2*x2-3;2*x1^2+x2^2-5]','[x1;x2]',[1.5;1],0.0001)
n =
3
ans =
1.4880
0.7560
newton_solve('[x1+2*x2-3;2*x1^2+x2^2-5]','[x1;x2]',[100;56],0.0001)
n =
10
ans =
1.4880
0.7560
simnewton_solve('[x1+2*x2-3;2*x1^2+x2^2-5]','[x1;x2]',[100;56],0.0001)
n =
388
ans =
1.4938
0.7531
上面的结果是牛顿法和简化牛顿法同精度同初值的解法以及不同初值同精度得出来的,我们利用迭代次数来比较它们运行的快慢(即运行的时间),我们本题的初值和精度能够任意取值,从而得出迭代次数以及结果。从结果能够看出,简化牛顿法相比起牛顿法迭代次数要多一些,而且简化牛顿法的值误差较大,因此用牛顿法解非线性方程组要比简化牛顿法要好。
问题分析
在我们参考了MATLAB相关书籍之后,经过在网上的查阅,基本编写出牛顿法解非线性方程组的程序,在这个程序的基础上我们来改进用以实现简化牛顿法解非线性方程组,我们主要遇到的是要怎么使它能够在程序中赋初值之后直接生成,最后这个没有解决,因此我们选择了赋初值后,直接把求出来,再把的值作为常量带入程序中求解。
总结
本次的程序设计,我们用MATLAB编写了牛顿法解非线性方程以及简化的牛顿法解非线性方程的程序。牛顿法是经过牛顿迭代法的公式:x(k+1)=x(k)-F’(x(k))-1F(x(k)) ,带入初值及给定精度的范围,得出方程组的解。简化牛顿法,实在牛顿法的基础上,把雅可比矩阵的逆的初始矩阵算出来,再经过迭代的出的解。我们选取了不同的初值解非线性方程组。而且对于同初值同精度问题,分别用牛顿法和简化的牛顿法解得简化的牛顿法迭代的次数更多。说明简化的牛顿法迭代精度更低而且求的的解误差较大。这与理论是相符合的。牛顿法和简化牛顿法都有优点也有缺点,我们在解决问题的时候,要结合自己的实力和自己所需的选择恰当的方法。我们从不懂到懂得这个过程让我们收获很多,经过不断地学习,查阅资料以及修改程序,一个从无到有的积累,我们不但仅是在做题,也是在学习处理任何问题的方法。遇到困难不要轻易放弃,要善于利用和整合资源,这都是生活必不可少的。
心得体会
数值计算方法是一门应用范围很广的课程,是信息与计算科学专业的一门主要专业基础课程,经过这次实验上机才知道原来我们能够运用MATLAB和C语言以及其它的相关汇编语言来编辑程序解决数值计算方法里面很多问题。在学习了理论知识之后,如何去具体的处理数学中的问题,如何把我们的理论运用到实践中去,这样的课程设计为我们提供了这样一个实践平台。经过这次实验,我收获颇多。
首先是对MATLAB软件的认识有了进一步的提升。它简单易学、计算功能强等。MATLAB具有强大的矩阵运算、数据处理的功能,它输出的结果可视化。编程效率高,比C语言简单,让我们比较容易接受,因此我们在解决这道题的时候选择了使用matlab这种高级编程语言。我们也经过这次上机实验对《数值计算方法》有了更进一步的巩固。其次,经过这次上机实验,我对牛顿法有了更深一层的理解。牛顿法是一种重要迭代法,她是逐步线性化方法的典型代表。为了减少计算量,牛顿法还衍生出许多的变格形式,比如下降牛顿法、阻尼牛顿法、简化牛顿法、修正牛顿法、拟牛顿法等等,这里我们主要是用了牛顿法和简化牛顿法来解非线性方程组,并对这两种方法做了一个比较,经过精度的分析,迭代次数的比较得出牛顿法迭代次数比较少,但计算量大;简化的牛顿法迭代次数多但计算量相对较少。因此是各有所长,都能解决我们的问题。
经过这次实验让我了解到合作的重要性,在处理问题的时候,当自己冥思苦想也想不出来解决方案的时候,不妨选择请教老师,和同学讨论。能够达到事半功倍的效果。我们的工作是一个团队的工作,团队需要个人,个人也离不开团队,必须发扬团结协作的精神。某个人的离群都可能导致整项工作的失败。实习中只有一个人知道原理是远远不够的,必须让每个人都知道,否则一个人的错误,就有可能导致整个工作失败。团结协作是我们实习成功的一项非常重要的保证。而这次实习也正好锻炼了我们的这一点,这对于我们的整个人生来说,都是非常宝贵的。
展开阅读全文