清华大学高等数值分析实验设计及答案

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

高等数值分析实验一

工物研13 成彬彬2004310559

一.用CG,Lanczos和MINRES方法求解大型稀疏对称正定矩阵Ax=b

作实验中,A是利用A= sprandsym(S,[],rc,3)随机生成的一个对称正定阵,S是1043阶的一个稀疏阵

A= sprandsym(S,[],0.01,3);

检验所生成的矩阵A的特征如下:

rank(A-A')=0 %即A=A’,A是对称的;

rank(A)=1043 %A满秩

cond(A)= 28.5908 %A是一个“好”阵

1.CG方法

利用CG方法解上面的线性方程组

[x,flag,relres,iter,resvec] = pcg(A,b,1e-6,1043);

结果如下:

Iter=35,表示在35步时已经收敛到接近真实x

relres= norm(b-A*x)/norm(b)= 5.8907e-007为最终相对残差

绘出A的特征值分布图和收敛曲线:

S=svd(A); %绘制特征值分布

subplot(211)

plot(S);

title('Distribution of A''s singular values');;

xlabel('n')

ylabel('singular values')

subplot(212); %绘制收敛曲线

semilogy(0:iter,resvec/norm(b),'-o');

title('Convergence curve');

xlabel('iteration number');

ylabel('relative residual');

得到如下图象:

为了观察CG方法的收敛速度和A的特征值分布的关系,需要改变A的特征值:

(1).研究A的最大最小特征值的变化对收敛速度的影响

在A的构造过程中,通过改变A= sprandsym(S,[],rc,3)中的参数rc(1/rc为A的条件数),可以达到改变A的特征值分布的目的:

通过改变rc=0.1,0.0001得到如下两幅图

以上三种情况下,由收敛定理2.2.2计算得到的至多叠代次数分别为:48,14和486,由于上实验结果可以看出实际叠代次数都比上限值要小较多。

由以上三图比较可以看出,A的条件数越大,即A的最大最小特征值的差别越大,叠代所需要的步骤就越多,收敛越慢。

(2)研究A的中间特征值的分布对于收敛特性的影响:

为了研究A的中间特征值的分布对收敛速度的影响,进行了如下实验:

固定A的条件数,即给定A的最大最小特征值,改变中间特征值得分布,再来生成A,具体的实现方法是,先将原来的生成A进行特征值分解:

[U,S]=svd(A);

靠近最小特征值,得到对角阵C1。再通过如下命令得到经处理后的矩阵A3:

A3=U*C1*U’;

对A3重新利用CG方法求解线性方程组得到如下结果图:

当他们都更靠近最小特征值时,结果如下:

靠近最大特征值,得到对角阵C2。再通过如下命令得到经处理后的矩阵A4:

A4=U*C2*U’;

对A4重新利用CG方法求解线性方程组得到如下结果图:

当他们都更靠近最大特征值时,结果如下:

从以上实验基本可以得出以下结论,A的中间特征的分布对收敛速度的影响是很大的,其影响规律可以总结为:当中间特征值越靠近两头时,也就是说集中到一端时,收敛速度越快,当中间特征值的分布越对称时,收敛速度越慢,这里只能给出实验结果,还没能从数学理论上证明结论的正确性,尚待商讨。

2.Lanczos方法

自己编制Lanczos方法的程序如下:

clear

load A%A is the same as in the CG Method

b=ones(length(A),1);

bn=norm(b);

q(:,1)=zeros(length(b),1);q(:,2)=b/bn;

r(:,1)=b;bata=1;

for k=(1:length(b)) %Realize k-step Lanczos process

r(:,k+1)=A*q(:,k+1)-bata*q(:,k);

alfa=q(:,k+1)'*r(:,k+1);

r(:,k+1)=r(:,k+1)-alfa*q(:,k+1);

rm=norm(r(:,k+1));

if(rm>1e-6)

bata=rm;

q(:,k+2)=r(:,k+1)/bata;

end

e(k)=norm(eye(k)-q(:,2:k+1)'*q(:,2:k+1));

T=q(:,2:k+1)'*A*q(:,2:k+1); %Construct Tk

T1=svd(T);

if (T1(k)>1e-12) %T is not singular

t=inv(T);

rn(k)=t(k,1)*bata; %The relative residual is lie on the

if abs(rn(k))<3e-6 %Last element of inv(T)'s first column

yk=t(:,1)*bn; %Once reach the required precision,stop

break %and calculate yk,then x.

end

end

end

x=q(:,2:k+1)*yk;

semilogy(e);

程序运行及调试情况:一开始将残量rn定义在1e-6时认为收敛,结果发现程序收敛不了,单步运行时发现执行到k=33时残量就开始一直增大,跟踪Tk发现这时它已经和三对角阵误差很大,例如有些本来应改为0的元素已经达到1e-6的量级,再要求最终结果精度在1e-6就不现实了。如果强制将Tk转化为三对角(即,把该为0的地方清0),则不会出现这种情况,结果收敛。也就是说该程序达不到任意期望的精度。

不过运行时发现程序执行的时间比直接用inv(A)*b命令的执行时间还是要短的,虽然不知道此命令使用什么方法解的,但是说明Lanczos方法的执行效率还是很高。

解得如下结果(收敛曲线):可看出曲线后面参量已经开始上跳。

相关文档
最新文档