数值分析实验报告1——Hilbert矩阵的求解

合集下载

矩阵分析与数值分析实验报告

矩阵分析与数值分析实验报告

《矩阵分析与数值分析》实验报告院系:姓名:学号:所在班号:任课老师:一.设错误!未找到引用源。

,分别编制从小到大和从大到小的顺序程序计算错误!未找到引用源。

并指出有效位数。

程序如下:function sum3j=input('请输入求和个数 "j":');A=0;B=0;double B;double A;for n=2:jm=n^2-1;t=1./m;A=A+t;enddisp('从小到大:')s=Afor n=j:-1:2m=n^2-1;t=1./m;B=B+t;enddisp('从大到小:')s=B运行结果:>> sum3请输入求和个数 "j":100从小到大:s =0.740049504950495从大到小:s =0.740049504950495>> sum3请输入求和个数 "j":10000从小到大:s =0.749900004999506从大到小:s =0.749900004999500>> sum3请输入求和个数 "j":1000000从小到大:s =0.749999000000522从大到小:s =0.749999000000500二、解线性方程组1.分别Jacobi 迭代法和Gauss-Seidel 迭代法求解线性方程组。

⎪⎪⎪⎪⎪⎭⎫⎝⎛-=⎪⎪⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎪⎪⎭⎫ ⎝⎛----000121001210012100124321x x x x 迭代法计算停止的条件为:6)()1(3110max -+≤≤<-k j k j j x x 。

解:(1)Jacobi 迭代法程序代码: function jacobi(A, b, N) clc;clear;A=[-2 1 0 0;1 -2 1 0;0 1 -2 1;0 0 1 -2]; b=[-1 0 0 0]'; N=100;n = size(A,1); D = diag(diag(A)); L = tril(-A,-1); U = triu(-A,1); Tj = inv(D)*(L+U); cj = inv(D)*b; tol = 1e-06; k = 1;format longx = zeros(n,1); while k <= Nx(:,k+1) = Tj*x(:,k) + cj;disp(k); disp('x = ');disp(x(:,k+1)); if norm(x(:,k+1)-x(:,k)) < toldisp('The procedure was successful')disp('Condition ||x^(k+1) - x^(k)|| < tol was met after k iterations') disp(k); disp('x = ');disp(x(:,k+1)); break endk = k+1; end结果输出The procedure was successfulCondition ||x^(k+1) - x^(k)|| < tol was met after k iterations 60 x =0.799998799067310.599998427958700.399998056850090.19999902842505(2)Gauss-Seidel迭代法程序代码:function gauss_seidel(A, b, N)clc;clear;A=[-2 1 0 0;1 -2 1 0;0 1 -2 1;0 0 1 -2];b=[-1 0 0 0]';N=100;n = size(A,1);D = diag(diag(A));L = tril(-A,-1);U = triu(-A,1);Tg = inv(D-L)*U;cg = inv(D-L)*b;tol = 1e-06;k = 1;x = zeros(n,1);while k <= Nx(:,k+1) = Tg*x(:,k) + cg;disp(k); disp('x = ');disp(x(:,k+1));if norm(x(:,k+1)-x(:,k)) < toldisp('The procedure was successful')disp('Condition ||x^(k+1) - x^(k)|| < tol was met after k iterations') disp(k); disp('x = ');disp(x(:,k+1));breakendk = k+1;end结果输出The procedure was successfulCondition ||x^(k+1) - x^(k)|| < tol was met after k iterations31x =0.799999213979350.599998971085610.399999167590770.199999583795392. 用Gauss列主元消去法、QR方法求解如下方程组:⎪⎪⎪⎪⎪⎭⎫⎝⎛-=⎪⎪⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎪⎪⎭⎫ ⎝⎛---017435222331325212214321x x x x (1)Gauss 列主元消去法 程序代码:function x=Gaussmain(A,b) clc;clear; format longA=[1 2 1 2;2 5 3 -2;-2 -2 3 5;1 3 2 3]; b=[4 7 -1 0]'; N=length(A); x=zeros(N,1); y=zeros(N,1); c=0; d=0;A(:,N+1)=b; for k=1:N-1 for i=k:4if c<abs(A(i,k))d=i;c=abs(A(i,k)); end endy=A(k,:);A(k,:)=A(d,:); A(d,:)=y; for i=k+1:N c=A(i,k);for j=1:N+1A(i,j)=A(i,j)-A(k,j)*c/A(k,k); end end endb=A(:,N+1);x(N)=b(N)/A(N,N); for k=N-1:-1:1x(k)=(b(k)-A(k,k+1:N)*x(k+1:N))/A(k,k); end结果输出 ans =18.00000000000000 -9.571428571428576.00000000000000-0.42857142857143(2)QR方法:程序代码function QR(A,b)clc;clear;format longA=[1 2 1 2;2 5 3 -2;-2 -2 3 5;1 3 2 3];b=[4 7 -1 0]';[Q,R]=qr(A)y=Q'*b;x=R\y结果输出Q =-0.31622776601684 -0.04116934847963 -0.75164602800283 0.57735026918962 -0.63245553203368 -0.49403218175557 -0.15032920560056 -0.57735026918963 0.63245553203368 -0.74104827263336 -0.22549380840085 -0.00000000000000 -0.31622776601684 -0.45286283327594 0.60131682240226 0.57735026918963 R =-3.16227766016838 -6.00832755431992 -0.94868329805051 2.84604989415154 0 -2.42899156029822 -4.65213637819829 -4.15810419644272 0 0 -0.67648142520255 -0.52615221960200 0 0 0 4.04145188432738 x =17.99999999999989-9.571428571428515.99999999999997-0.42857142857143三、非线性方程的迭代解法1.用Newton迭代法求方程()06cos22x=-++=-xexf x的根,计算停止的条件为:6110-+<-kkxx;编程如下:function newton(f,df,x,a,a0)syms xf=input('please enter your equation:') a0=input('please enter you x(0):');df=diff(f)e=1e-6;a1=a0+1;N=0;while abs(a1-a0)>ea=a0-subs(f,a0)/subs(df,a0); a1=a0; a0=a; N=N+1; endfprintf('a=%0.6f',a) N运行结果: >> newtonplease enter your equation:exp(x)+2^(-x)+2*cos(x)-6 f =exp(x)+2^(-x)+2*cos(x)-6 please enter you x(0):2df =exp(x)-2^(-x)*log(2)-2*sin(x) a=1.829384 N =42.利用Newton 迭代法求多项式07951.2954.856.104.5x 234=+-+-x x x的所有实零点,注意重根的问题。

Hilbert代数方程组的数值解法

Hilbert代数方程组的数值解法

Hilbert 代数方程组的数值解法1 Hilbert 矩阵的条件数和矩阵的阶数的关系编制Matlab 程序:clear,clc format long %format short for n=1:14; A=hilb(n); %A=rand(n);condA(n)=cond(A,inf); endplot(log10(condA)) 得出图形图1:Hilbert 矩阵和阶次的关系由图可见a.Hilbert 矩阵的2-条件数的对数与阶次近似正比;b.阶次超过12后,计算困难,舍入误差会导致计算不准 结论:Hilbert 矩阵的2-条件数随阶次指数增长,关系大概是: Log 10(Cond(A))= 1.33791720780254(n-1)0246810121424681012141618nl o g 10(c o n d A )条件数的对数-阶次2.各种求解方法的对比2.1 直接法:Gauss 消去方法(程序见附录,下同)在双精度型变量下,即eps=2.220446049250313e-016,对于直接法Gauss 消去方法,求解Hilbert 矩阵方程组,在阶次n=13时,解得: X=[1 0.99997 1.0013 0.97881 1.1906 -0.035441 4.6171 -7.3967 14.089 -12.542 9.9162 -2.3817 1.5624]出现明显错误,可见Gauss 消去方法对病态问题比较敏感。

求解阶次不高。

2.2 Jacobi 迭代法很遗憾,jakobi 迭代法的迭代矩阵的谱半径随阶次线性上升(程序见附录2),普遍大于1,计算结果发送,无法迭代出满意的结果。

需放弃图2:Jacobi 迭代矩阵的谱半径2.3 Gauss-Seidel 迭代与SOR 迭代求解先分析SOR 迭代矩阵的谱半径和松弛因子w 的关系0510152025510152025阶次谱半径Jacobi 迭代收敛性分析图3:SOR 迭代矩阵的谱半径和松弛因子w 的关系可以发现SOR 迭代和G-S 迭代的谱半径都普遍接近于1,因此松弛因子的选择对计算结果的影响不大。

数值分析计算方法实验报告

数值分析计算方法实验报告
break;
end;
end;
X=x;
disp('迭代结果:');
X
format short;
输出结果:
因为不收敛,故出现上述情况。
4.超松弛迭代法:
%SOR法求解实验1
%w=1.45
%方程组系数矩阵
clc;
A=[2,10,0,-3;-3,-4,-12,13;1,2,3,-4;4,14,9,-13]
b=[10,5,-2,7]'
b=[10,5,-2,7]'
[m,n]=size(A);
if m~=n
error('矩阵A的行数和列数必须相同');
return;
end
if m~=size(b)
error('b的大小必须和A的行数或A的列数相同');
return;
end
if rank(A)~=rank([A,b])
error('A矩阵的秩和增广矩阵的秩不相同,方程不存在唯一解');
3.实验环境及实验文件存档名
写出实验环境及实验文件存档名
4.实验结果及分析
输出计算结果,结果分析和小结等。
解:1.高斯列主元消去法:
%用高斯列主元消去法解实验1
%高斯列主元消元法求解线性方程组Ax=b
%A为输入矩阵系数,b为方程组右端系数
%方程组的解保存在x变量中
format long;
A=[2,10,0,-3;-3,-4,-12,13;1,2,3,-4;4,14,9,-13]
return;
end
c=n+1;
A(:,c)=b;
for k=1:n-1

数值分析Hilbert矩阵病态线性方程组的求解Matlab程序

数值分析Hilbert矩阵病态线性方程组的求解Matlab程序

(Hilbert矩阵)病态线性方程组的求解理论分析表明,数值求解病态线性方程组很困难。

考虑求解如下的线性方程组的求解1Hx=b,期中H是Hilbert矩阵,H=(h j)四,h j=,।,j=1,2,…,nij-11,估计矩阵的2条件数和阶数的关系2 .对不同的n,取x=(1,1,…,1)w n,分别用Gauss消去,Jacobi迭代,Gauss-seidel迭代,SOR迭代和共轲梯度法求解,比较结果。

3 .结合计算结果,试讨论病态线性方程组的求解。

第1小题:condition.m。

蟆1小题程序t1=20;%>数n=20x1=1:t1;y1=1:t1;fori=1:t1H=hilb(i);y1(i)=log(cond(H));endplot(x1,y1);xlabel('阶数n');ylabel('2-条件数的对数(log(cond(H))');title('2-条件数的对数(10g(cond(H))与阶数n的关系图’);t2=200;%J>数n=200x2=1:t2;y2=1:t2;fori=1:t2H=hilb(i);y2(i)=log(cond(H));endplot(x2,y2);xlabel('阶数n');ylabel('2-条件数的对数(log(cond(H))');title('2-条件数的对数(10g(cond(H))与阶数n的关系图’);画出Hilbert矩阵2-条件数的对数和阶数的关系n=200时n=20时马KiMn的美方四*--wficEJ-帛=«』从图中可以看出,1)在n小于等于13之前,图像近似直线log(cond(H))-1.519n-1.8332)在n大于13之后,图像趋于平缓,并在一定范围内上下波动,同时随着n的增加稍有上升的趋势第2小题:soke.m%蹴2小题主程序N=4000;xGauss=zeros(N,1);xJacobi=zeros(N,1);xnJ=zeros(N,1);xGS=zeros(N,1);xnGS=zeros(N,1);xSOR=zeros(N,1);xnSOR=zeros(N,1);xCG=zeros(N,1);xnCG=zeros(N,1);forn=1:N;x=ones(n,1);t=1.1;%初始值偏差x0=t*x;%迭代初始值e=1.0e-8;%^定的误差A=hilb(n);b=A*x;max=100000000000;%可能最大的迭代次数w=0.5;%SORt代的松弛因子G=Gauss(A,b);[J,nJ]=Jacobi(A,b,x0,e,max);[GS,nGS]=G_S(A,b,x0,e,max);[S_R,nS_R]=SOR(A,b,x0,e,max,w);[C_G,nC_G]=CG(A,b,x0,e,max);normG=norm(G'-x);xGauss(n)=normG;normJ=norm(J-x);nJ;xJacobi(n)=normJ;xnJ(n)=nJ;normGS=norm(GS-x);nGS;xGS(n)=normGS;xnGS(n)=nGS;normS_R=norm(S_R-x);nS_R;xSOR(n)=normS_R;xnSOR(n)=nS_R;normC_G=norm(C_G-x);nC_G;xCG(n)=normC_G;xnCG(n)=nC_G;endGauss.m%Gauss消去法functionx=Gauss(A,b)n=length(b);l=zeros(n,n);x=zeros(1,n);脸肖去过程fori=1:n-1forj=i+1:nl(j,i)=A(j,i)/A(i,i);fork=i:nA(j,k)=A(j,k)-l(j,i)*A(i,k);endb(j)=b(j)-l(j,i)*b(i);endend%回代过程x(n)=b(n)/A(n,n);fori=n-1:-1:1c=A(i,:).*x;x(i)=(b(i)-sum(c(i+1:n)))/A(i,i);endJacobi.m%Jacobi迭代,x0表示迭代初值,e表示允许误差(迭代停止条件),n表示迭代次数,m可能最大的迭代次数function[x,n]=Jacobi(A,b,x0,e,m)n=length(A);D=diag(diag(A));U=-triu(A,1);L=-tril(A,-1);B=D\(L+U);f=D\b;x=B*x0+f;n=1;whilenorm(x-x0)>ex0=x;x=B*x0+f;n=n+1;ifn>mdisp('Jacobi迭代次数过多,迭代可能不收敛‘);break;endendG_S.m%Gauss-Seidel迭代,x0表示迭代初值,e表示允许误差(迭代停止条件),n表示迭代次数,m可能最大的迭代次数function[x,n]=G_S(A,b,x0,e,m)n=length(A);D=diag(diag(A));U=-triu(A,1);L=-tril(A,-1);B=(D-L)\U;f=(D-L)\b;x=B*x0+f;n=1;whilenorm(x-x0)>ex0=x;x=B*x0+f;n=n+1;ifn>mdisp('Gauss-Seidel迭代次数过多,迭代可能不收敛’);break;endendSOR.m%SOR超松弛迭代,x0表示迭代初值,e表示允许误差(迭代停止条件),n表示迭代次数,m可能最大的迭代次数,w松弛因子function[x,n]=SOR(A,b,x0,e,m,w)n=length(A);D=diag(diag(A));U=-triu(A,1);L=-tril(A,-1);B=(D-w*L)\((1-w)*D+w*U);f=(D-w*L)\b*w;x=B*x0+f;n=1;whilenorm(x-x0)>ex0=x;x=B*x0+f;n=n+1;ifn>mdisp('SOR超松弛迭代次数过多,迭代可能不收敛’);break;endendCG.m%C献朝梯度法,x0表示迭代初值,e表示允许误差(迭代停止条件),n表示迭代次数,m可能最大的迭代次数function[x,n]=CG(A,b,x0,e,m)r=b-A*x0;p=r;alpha=(r'*r)/(p'*(A*p));x=x0+alpha*p;r1=b-A*x;n=1;whilenorm(r1)>ebelta=(r1'*r1)/(r'*r);p=r1+belta*p;r=r1;x0=x;alpha=(r'*r)/(p'*(A*p));x=x0+alpha*p;r1=b-A*x;n=n+1;ifn>mdisp('CG共朝梯度法迭代次数过多,迭代可能不收敛’);break;endend第2小题选择不同的阶数n,取x=(l,l,…RI分别使用Gauss消去,Jacobi迭代,Gauss-seidel迭代,SOR迭代和共挽梯度法(CG)求解,比较结果。

数值分析_线性方程组迭代解法Hilbert矩阵

数值分析_线性方程组迭代解法Hilbert矩阵

0.999427 1.000368 1.000068 0.999538 1.003545 0.999834 1.000724 1.002775 0.99582 x 9 0.99888 0.9983 0.99933 0.995748 0.999679
0.996358 0.999739
1.002141 1.001106 1.001204 1.001784 1.005742 1.00315 1.00155 1.00181 1.002206 1.00062
1.000066 0.999977 1.000001 1.000041 0.998534 1.000054 0.999712 0.999029 1.005874 1.000672 1.00175 1.004447
0.996128 0.998886 0.998141 0.994858 10 x 0.993805 0.998912 0.998328 0.998514 0.999227 1.000283 1.000399 1.001125 1.005241 1.001468 1.001894 1.002573 1.006835 1.001551 1.001869 1.002117
数值分析课程上机报告
数值分析第二次上机实习报告
——线性方程组迭代解法
一、问题描述
设 Hn = [hij ] ∈ Rn×n 是 Hilbert 矩阵, 即 hij = 对 n = 2,3,4,…15, 1 i + j −1
1 x ∈ R n×n ,及 bn = H n x ,用 SOR 迭代法和共轭梯度法来求解,并与直 取= 1
四、计算结果及其分析
1. 超松弛迭代法分析 令初始向量 x0=u(1,1,……)T,给定不同的初始向量与松弛因子,计算不同情 况下解的情况。计算结果如下。

数值求解Hilbert病态线性方程组

数值求解Hilbert病态线性方程组

病态线性代数方程组的求解理论的分析表明,求解病态的线性代数方程组是困难的。

考虑方程组Hx = b 的求解,其中H 为Hilbert 矩阵,n n ij h H ⨯=)(,11-+=j i h ij ,n j i ,...,2,1,=1. 估计Hilbert 矩阵2-条件数与阶数的关系;2. 选择问题的不同维数,分别用Gauss 消去法,Jacobi 迭代,GS 迭代和SOR 迭代求解,比较结果;3. 讨论病态问题求解的算法。

解: 1、取Hilbert 矩阵阶数最高分别为n=20和n=100。

采用Hilbert 矩阵的2-条件数作为实验的比较对象,画出的曲线如下图所示:lg(())n cond H n从图中可以看出,在n ≤13之前,图像接近直线,在n >13之后,图像趋于平缓,在一定的范围内上下波动。

为了比较图像的线性部分,作出一条直线与已知曲线进行比较。

比较直线的关系式为:833.1519.1))(lg(-=n H cond n ,结果下图所示。

nl g (c o n d (H n ))lg(cond(Hn))~n 关系图从图2中可以看出,当n 较小时,n H cond n ~))(lg(之间近似满足线性关系。

当n 继续增大到100时,n H cond n ~))(lg(关系图下图所示:从图中可以看出,图像的走势符合在n=20时的猜想,在n 大于一定的值之后,图像趋于平缓,且在一定范围内震荡,同时又有一定上升趋势,但上升速度很慢。

2、选择不同的阶数n ,设方程组的精确解为xz=(1,1,…,1)T进行计算,用四种方法解x_Guass1、x_Jacobi1、x_GS1、x_SOR1对比表如下nl g (c o n d (H n ))lg(cond(Hn))~n关系图nl g (c o n d (H n ))lg(cond(Hn))~n 关系图Gauss消去法求解:选择问题的阶数为3~8时,用Gauss消去法求得的解与精确解一致,当阶数为9~14时,解开始出现偏差,而且n越大,偏差越大。

数值分析实验报告1

数值分析实验报告1
问题提出:考虑一个高次的代数多项式
显然该多项式的全部根为1,2,…,20共计20个,且每个根都是单重的。现考虑该多项式的一个扰动
其中是一个非常小的数。这相当于是对(1。1)中的系数作一个小的扰动.我们希望比较(1。1)和(1。2)根的差别,从而分析方程(1。1)的解对扰动的敏感性.
实验内容:为了实现方便,我们先介绍两个Matlab函数:“roots”和“poly”。
(3)取矩阵阶数n=20或者更大,重复上述实验过程,观察记录并分析不同的问题及消去过程中选择不同的主元时计算结果的差异,说明主元素的选取在消去过程中的作用。
(4)选取其他你感兴趣的问题或者随机生成矩阵,计算其条件数。重复上述实验,观察记录并分析实验结果。
实验过程:
程序:
建立M文件:
function x=gauss(n,r)
实验总结:
利用MATLAB来进行病态问题的实验,虽然其得出的结果是有误差的,但是可以很容易的得出对一个多次的代数多项式的其中某一项进行很小的扰动,对其多项式的根会有一定的扰动的,所以对于这类病态问题可以借助于MATLAB来进行问题的分析。
学号:06450210
姓名:万轩
实验二插值法
实验2.1(多项式插值的振荡现象)
学号:06450210
姓名:万轩
实验五解线性方程组的直接方法
实验5。1(主元的选取与算法的稳定性)
问题提出:Gauss消去法是我们在线性代数中已经熟悉的.但由于计算机的数值运算是在一个有限的浮点数集合上进行的,如何才能确保Gauss消去法作为数值算法的稳定性呢?Gauss消去法从理论算法到数值算法,其关键是主元的选择。主元的选择从数学理论上看起来平凡,它却是数值分析中十分典型的问题.
其中若变量a存储n+1维的向量,则该函数的输出u为一个n维的向量。设a的元素依次为,则输出u的各分量是多项式方程

数值分析实验报告(包括高斯消去、二分法、牛顿迭代法)

数值分析实验报告(包括高斯消去、二分法、牛顿迭代法)
N=input('please enter the largest number of iterations:N=');
for k=1:N
x=(a+b)/2;
fx=feval(f,x);fa=feval(f,a);
if abs((b-a)/2)<e || abs(fx)<e
disp('the number of iterations is');k
f=input('please enter a function:f(x)=');
x0=input('please enter the initial value:x0=');
e=input('please enter error:e=');
N=input('please enter the largest number of iterations:N=');
disp('the approximate solution is');x
disp('f(x) is');fx
disp('the number of iterations is');k
return
else
x0=x;
end
end
end
disp('The maximum number of iterations is reached, stop calculation');
开课学院、实验室:实验时间:2014年1月1日
课程
名称
数值分析基础性实验
实验项目
名称
数值计算算法及实现
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数值分析课程实验报告
题目:病态线性方程组的求解
理论分析表明,数值求解病态线性方程组很困难。

考虑求解如下的线性方程组的求解
Hx = b ,期中H 是Hilbert 矩阵,()ij n n H h ⨯=,1
1
ij h i j =+-,i ,j = 1,2,…,n
1. 估计矩阵的2条件数和阶数的关系
2. 对不同的n ,取(1,1,
,1)n
x =∈
,分别用Gauss 消去,Jacobi 迭代,Gauss-seidel 迭
代,SOR 迭代和共轭梯度法求解,比较结果。

3. 结合计算结果,试讨论病态线性方程组的求解。

解答过程
1.估计矩阵的2-条件数和阶数的关系
矩阵的2-条件数定义为:1
222
()Cond A A A
-=⨯,将Hilbert 矩阵带入有:
1222
()Cond H H H -=⨯
调用自编的Hilbert_Cond 函数对其进行计算,取阶数n = 50,可得从1阶到50阶的2-条件数,以五位有效数字输出,其中前10项见表1。

表1.前十阶Hilbert 矩阵的2-条件数
从表1可以看出,随着阶数每递增1,Hilbert 矩阵的2-条件数都至少增加一个数量级,但难以观察出明显的相依规律。

故考虑将这些数据点绘制在以n 为横轴、Cond (H )2为纵轴的对数坐标系中(编程用Hilbert_Cond 函数同时完成了这个功能),生成结果如图1。

图1.不同阶数下Hilbert矩阵的2-条件数分布
由图可见,当维数较小时,在y-对数坐标系中Cond(H)2与n有良好的线性关系;但n超过10后,线性趋势开始波动,n超过14后更是几乎一直趋于平稳。

事实上,从n = 12开始,系统便已经开始提出警告:“Warning: Matrix is close to singular or badly scaled.Results may be inaccurate.”。

也就是说,当n较大时,H矩阵已经接近奇异,计算结果可能是不准确的。

通过查阅相关资料,我找到了造成这种现象的原因:在matlab中,用inv函数求条件数过大的矩阵的逆矩阵将是不可靠的。

而调用系统自带的专门对Hilbert矩阵求逆的invhilb(n)函数则不存在这个问题,生成结果如图2。

图2. 修正后的不同阶数下Hilbert矩阵的2-条件数分布
简便起见,取n 不大于10的前十项进行线性拟合,结果如图3。

C o n d (H )
n
图3.1~10阶Hilbert 矩阵2-条件数的线性拟合
由拟合结果知,Cond (H )2与n 的关系为:
2lg () 1.65183 1.47863Cond H n
=-+
其线性相关系数r=0.99985,可见二者具有较好的线性关系。

对上式稍作变形得:
1.651831.478632()10n Cond H -+=
这就是对Hilbert 矩阵的-2条件数与其阶数n 的关系估计。

可见Hilbert 矩阵的2-条件数会随其阶数n 的增加呈指数增大趋势,因此当n 较大时Hilbert 矩阵将是严重病态的,甚至导致matlab 中inv 求逆运算失真。

2.对不同的n ,采用各种方法求解方程
调用自编的Calc 主函数(其中包括的Hilbert 函数以及b_函数可创建出对应阶数的H 矩阵以及向量b ,Gauss_Cal 函数、Jacobi_Cal 函数、Gauss_Seidel_Cal 函数、SOR_Cal 函数(该函数自动寻找最优松弛因子,然后以最优因子进行求解)以及CG_Cal 函数则可完成各
自方法的求解),分别取n = 2,5,10,20,50,对于迭代法设定终止计算精度为10
10ε-=,所得
计算结果以16位有效数字输出,分别见表2~表6。

表2.n=2的计算结果
从表2可看出,n=2时,四种迭代法都能够收敛,迭代次数最大为e+2量级(J法),最小仅要2次(CG法),并且五种解法都能给出非常精确的结果,最大误差为e-10量级(GS 法)。

表3.n=5的计算结果
从表3可以看出,n=5时,J法已经不收敛,其余解法依然收敛(但值得注意的是GS 法以及SOR法的谱半径以及非常接近1,达到了收敛的边缘),最大迭代次数达到e+6量级(GS法),最小需要7次(CG法),计算精度依然较高,最大误差为e-6量级。

SOR法比
GS法节省了较多的迭代次数。

表4.n=10的计算结果
从表4可以看出,n=10时,各种解法的收敛性与n=5时相同(GS法与SOR法的谱半径进一步趋近1),最大迭代次数达e+8量级(SOR法),最小需要8次(CG法),计算精度已经较低,最大误差达到e-3量级。

此时有一个异常现象:SOR法的迭代次数不但不比GS法少,反而超出好几倍。

但根据计算出的两种算法下的迭代矩阵谱半径,可以看出SOR 法为0.999999999871931,而GS法为0.999999999997045,在最优松弛因子之下的SOR法确实具有更小的迭代矩阵谱半径,因此应当更快收敛。

经检查,计算程序的编制应该没有错误,但计算结果确实与理论不符,希望老师指点迷津!
表5.n=20的计算结果
从表5可以看出,n=20时,各种解法的收敛性依然没变(但GS法以及SOR法的谱半径在matlab的十六位显示精度下已经等于1),最大迭代次数e+8量级(SOR法),最小需要10次(CG法),Gauss消元法的计算结果已失去意义(误差e+2量级),迭代法的计算误差均为e-3量级。

且此时SOR的迭代次数依然高于GS。

表6.n=50的计算结果
从表6可以看出,n=50时,计算结果的特点与n=20相似,不同之处在于Gauss消元法的误差进一步增大(e+3量级)。

3.综合讨论
根据上一部分的计算结果,可以总结出求解病态矩阵的两个特点:
1.收敛性差,收敛速度慢。

对于本例,当阶数n大于2以后J法就不收敛了,这是收敛性差的一个体现。

GS法和SOR法虽然一直保持收敛(事实上这是由于Hilbert矩阵是正定对称的,所以决定了GS法以及SOR法一定收敛),但随着n的增大它们的谱半径迅速趋近于1(n=20时matlab的16位显示精度已经无法显示出它们的谱半径与1的差别),根据理论我们知道,趋近于1的谱半径决定了计算的收敛速度将会非常慢,之前计算结果中的迭代次数N也很好地验证了这一点。

2.计算精度低,阶数较高时误差惊人。

根据理论,线性方程组系数矩阵的条件数的直观意义就是初始数据扰动的相对误差的放大倍数。

由于数值计算时的舍入误差等因素,初始数据的微小扰动难以避免,因此解病态方程组时,这种微小的初始相对误差将被病态矩阵巨大的条件数所放大,最后造成计算结果的巨大偏差。

对于本例,n=20时Gauss消元法的计算误差竟然达到e+2量级,使得计算结果完全失去意义,而其他几种迭代法的计算误差看似能够接受(e-3量级),但仔细分析上一节
的计算结果不难发现:从n=2到n=5再到n=10,几种迭代法的迭代次数迅速增大,且计算精度显著降低;而从n=10到n=20再到n=50,迭代次数和计算精度却趋于稳定,由于矩阵的条件数一直呈指数增大,因此这种计算结果的趋势明显是不合理的。

究其原因,我认为和一开始图1所示的2-条件数的计算失真是类似的。

当矩阵的条件数非常大时,inv指令的求逆结果不可靠,从而造成图1中2-条件数趋于平稳的那个阶段,而在GS迭代以及SOR迭代中也需要对矩阵进行求逆运算,因此很有可能又是因为inv对高条件数矩阵求逆的偏差造成最终计算结果的失真。

因此,我预计实际上当n=20时,GS法和SOR法的迭代次数以及计算误差要远远高于n=10的值,同理n=50时的结果又要远远大于n=20的值。

不难看出,造成上述两个特点的本质因素还是因为病态矩阵的高条件数,无论收敛性、收敛速度还是计算精度等,都与矩阵的条件数直接相关,因此改善病态矩阵的求解的根本方法还是在于降低矩阵的条件数。

因此我尝试着对Hilbert矩阵进行了一些预处理,并发现在某些预处理方法下条件数的阶数被有效减小,因此预处理是求解病态方程组的一个十分有效且必要的环节。

此外,若给定条件数并横向比较上一节中的不同求解方法,可以看出CG法的表现是最令人满意的,当矩阵阶数n不太大时(不超过10),CG法都能以非常少的迭代次数(只需要几次)以及较高的计算精度完成计算任务,相比之下,GS法以及SOR法的上千万次迭代次数显得非常吃力。

此外,事实上n较小时Gauss消元法的计算结果也比较理想,具有很快的计算速度和较高的计算精度。

我们知道,在传统意义上Gauss消元法的最大弊端在于n非常大时计算量大得令人难以接受(n三次方量级),而迭代法的单步计算量则为n 平方量级,但在求解病态问题时,n只能比较小,且迭代法的迭代次数却非常大,所以造成迭代法的计算速度反而远慢于Gauss消元法。

综上,求解病态方程组时首先应该对系数矩阵进行预处理,尽可能降低它的条件数;其次可以选择共轭梯度(CG)法对其进行求解。

如果阶数n不大,Gauss消元法也是比较有效的。

相关文档
最新文档