数学实验“线性方程组的最速下降法与共轭梯度法解法”实验报告(内含matlab程序代码)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

西京学院数学软件实验任务书

课程名称数学软件实验班级数0901

学号0912020107姓名李亚强

实验课题线性方程组的最速下降法与共轭梯度法

实验目的熟悉线性方程组的最速下降法与共轭梯度法

实验要求

运用Matlab/C/C++/Java/Maple/Mathematica等其中

一种语言完成

实验内容线性方程组的最速下降法线性方程组的共轭梯度法

成绩教师

实验五实验报告

一、实验名称:最速下降法与共轭梯度法解线性方程组。

二、实验目的:进一步熟悉理解掌握最速下降法与共轭梯度法解法思路,提高matlab 编程能力。

三、实验要求:已知线性方程矩阵,应用最速下降与共轭梯度法在相关软件编程求解线性方程组的解。

四、实验原理:

1.最速下降法:

从某个初始点)0(X 出发,沿)(X f 在点)0(X 处的负梯度方向

)

0()0()0()(AX b X f r -=-∇=求得)(X f 的极小值点)1(X ,即

)(min )0()0(0

r X f λλ+>然后从)1(X 出发,重复上面的过程得到)2(X 。如此下去,

得到序列{)(k X }

)

(...)()()()1()0(k X f X f X f >>>可以证明,从任一初始点)0(X 出发,用最速下降法所得

到的序列{)(k X }均收敛于问题使X 最小化)(X f 的解,也就是方程组b AX =的解。其收敛速度取决于1

1λλλλ+-n n ,其中1λ,n λ分别

为A 的最小,最大特征值。最速下降法迭代格式:给定初值)0(X ,)(k X 按如下方法决定:

())

()(1)(k )()()()(k )

()(X ,,)(k k k k T k k T k k k k r X Ar r r r AX b X f r λλ+=>

<><=-=-∇=+2.共轭梯度法

其基本步骤是在点)(k X 处选取搜索方向)(k d ,使其与前一次的搜索方向)1(-k d 关于A 共轭,即

(1)()(1),0

k k k d d Ad --<>=然后从点)(k X 出发,沿方向)(k d 求得)(X f 的极小值点)1(+k X ,即

)

(min )()()(0)1(k d X f X f k k λλ+=>+如此下去,得到序列{)(k X }。不难求得0,)1()(>=<-k k Ad d 的解为

)()1()1()()()

()1(,,k k k k k k k d Ad d d AX b X X ><>-<+=--+注意到)(k d 的选取不唯一,我们可取

)

1(1)()()(--+-∇=k k k k d X f d β由共轭的定义0,)1()(>=<-k k Ad d 可得:

>

<><-=----)1()1()1()(1,,k k k k k Ad d Ad r β共轭梯度法的计算过程如下:第一步:取初始向量)0(X ,计算

⎪⎪⎩

⎪⎪⎨⎧+=><><-=-=-∇==(0)0(0)(1))0()0()0()0(0(0)

(0)(0)(0)d X X ,,X )X (r d λλAd d Ad r A b f 第1+k 步:计算

⎪⎪⎪⎪⎪⎩

⎪⎪⎪⎪⎪⎨⎧+=><><-=+=><><-=-=-∇=+------(k)0(k)1)(k )()()()()

1(1(k))()1()1()1()(1(k)

(k)(k)d X X ,,r ,,X )X (r λλββk k k k k k k k k k k k k Ad d Ad r d d Ad d Ad

r A b f 五、实验内容:

%最速下降法

function [x,k]=fastest(A,b,eps);

x0=zeros(size(b),1);

x=x0;

k=0;

m=1000;

tol=1;

while tol>=eps

r=b-A*x0;

q=dot(r,r)/dot(A*r,r);

x=x0+q*r;

k=k+1;

tol=norm(x-x0);

x0=x;

if k>=m

disp('迭代次数太多,可能不收敛!');

return;

end

end

x

k

%共轭梯度法

function[k,x]=gong_e(A,b)

esp=input('请输入允许误差esp=');

x0=input('请输入初始值x0=');

k=0;

r0=b-A*x0;%求出dangqian梯度while norm(r0)>esp

r0=b-A*x0;

k=k+1;

if k==1

p0=r0;

else

lamda=(r0'*r0)/(p0'*A*p0);

r1=r0-lamda*A*p0;

p0=r0+(r0'*r0)/(r1'*r1)*p0;

x1=x0+lamda*p0;

x0=x1;

r0=r1;

end

end

x=r0;

k;

end

六、实验结果:

A=[520;641;125];

b=[1018-14]';

eps=1.0e-6;

x=

-0.8750

7.1875

-5.5000

k=

60

相关文档
最新文档