Hilbert矩阵病态线性代数方程组的求解
数值分析实验报告——Hilbert矩阵的求解
1 / 7 数值分析课程实验报告题目:病态线性方程组的求解理论分析表明,数值求解病态线性方程组很困难。
考虑求解如下的线性方程组的求解Hx = b ,期中,期中H 是Hilbert 矩阵,()ij n n H h ´=,11ij h i j =+-,i ,j = 1,2,…,n 1.估计矩阵的2条件数和阶数的关系2.对不同的n ,取(1,1,,1,1))nx =Î,分别用Gauss 消去,Jacobi 迭代,Gauss-seidel 迭代,SOR 迭代和共轭梯度法求解,比较结果。
3.结合计算结果,试讨论病态线性方程组的求解。
解答过程1.估计矩阵的2-条件数和阶数的关系矩阵的2-条件数定义为:1222()Cond A A A-=´,将Hilbert 矩阵带入有:1222()Cond H H H -=´调用自编的Hilbert_Cond 函数对其进行计算,取阶数n = 50,可得从,可得从1阶到50阶的2-条件数,以五位有效数字输出,其中前10项见表1。
表1.前十阶Hilbert 矩阵的2-条件数阶数1 2 3 4 5 2-条件数1 19.281 524.06 1.5514e+004 4.7661e+005 阶数6 7 8 9 10 2-条件数1.4951e+007 4.7537e+008 1.5258e+010 4.9315e+011 1.6025e+013 从表1可以看出,随着阶数每递增1,Hilbert 矩阵的2-条件数都至少增加一个数量级,但难以观察出明显的相依规律。
故考虑将这些数据点绘制在以n 为横轴、Cond (H )2为纵轴的对数坐标系中(编程用Hilbert_Cond 函数同时完成了这个功能),生成结果如图1。
图1.不同阶数下Hilbert 矩阵的2-条件数分布条件数分布由图可见,当维数较小时,在y-对数坐标系中Cond (H )2与n 有良好的线性关系;但n 超过10后,线性趋势开始波动,n 超过14后更是几乎一直趋于平稳。
数值分析(hilbert矩阵)病态线性方程组的求解matlab程序
(Hilbert 矩阵)病态线性方程组的求解理论分析表明,数值求解病态线性方程组很困难。
考虑求解如下的线性方程组的求解Hx = b ,期中H 是Hilbert 矩阵,()ij n n Hh ,11ij h i j ,i ,j = 1,2,…,n 1.估计矩阵的2条件数和阶数的关系2.对不同的n ,取(1,1,,1)nx K ?,分别用Gauss 消去,Jacobi 迭代,Gauss-seidel 迭代,SOR 迭代和共轭梯度法求解,比较结果。
3.结合计算结果,试讨论病态线性方程组的求解。
第1小题:condition.m %第1小题程序t1=20;%阶数n=20x1=1:t1;y1=1:t1;for i=1:t1H=hilb(i);y1(i)=log(cond(H));endplot(x1,y1);xlabel('阶数n');ylabel('2-条件数的对数(log(cond(H))');title('2-条件数的对数(log(cond(H))与阶数n 的关系图');t2=200;%阶数n=200x2=1:t2;y2=1:t2;for i=1:t2H=hilb(i);y2(i)=log(cond(H));endplot(x2,y2);xlabel('阶数n');ylabel('2-条件数的对数(log(cond(H))');title('2-条件数的对数(log(cond(H))与阶数n 的关系图');画出Hilbert 矩阵2-条件数的对数和阶数的关系n=200时n=20时从图中可以看出,1)在n小于等于13之前,图像近似直线log(cond(H))~1.519n-1.8332)在n大于13之后,图像趋于平缓,并在一定范围内上下波动,同时随着n的增加稍有上升的趋势第2小题:solve.m%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);for n=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;%SOR迭代的松弛因子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消去法function x=Gauss(A,b)n=length(b);l=zeros(n,n);x=zeros(1,n);%消去过程for i=1:n-1for j=i+1:nl(j,i)=A(j,i)/A(i,i);for k=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);for i=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;while norm(x-x0)>ex0=x;x=B*x0+f;n=n+1;if n>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;while norm(x-x0)>ex0=x;x=B*x0+f;n=n+1;if n>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;while norm(x-x0)>ex0=x;x=B*x0+f;n=n+1;if n>mdisp('SOR超松弛迭代次数过多,迭代可能不收敛');break;endendCG.m%CG共轭梯度法,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;while norm(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;if n>mdisp('CG共轭梯度法迭代次数过多,迭代可能不收敛');break;endend。
范德蒙矩阵形式下的病态线性方程组求解
着阶数的增加,绝对误差在增大。当阶数增加到 12
程组法[J]. 华 南 农 业 大 学 学 报 ,2009,30(1):
时,在重新选择 籽=0.0001 的基础上,发现绝对误差
119-121.
继续增大,说明本方法还有待进一步改进。
[3]富明慧,李勇息,张文志.求解病态线性方程的一
4 结论
种精细格式及迭代终止准则[J].应用力学学报, 2018,35(2):346-350+454.
由上述研究结果可知,方法一(单参数迭代法) [4]薛正林,张莉,吴开腾.一种解病态线性方程组的
收敛速度快,是比较实用和有效的算法。方法二(新
单参数迭代法[J].数学的实践与认识,2017,47
主元加权法)降低了矩阵的条件数,提高了收敛速
(10):255-261.
度和精度。通过 Matlab 软件编程并运算以系数矩阵 [5]薛正林.基于主元加权的病态线性方程组算法研
从图 1 中可以看出,当范德蒙德矩阵的阶数增 加时,其对应的条件数在不断增加,病态程度也越 严重。
2 单参数迭代法求解病态线性方程组
设病态线性方程组为:
A x=b,
其中系数矩阵 A 为范德蒙德矩阵,
A =(aij)n伊n,aij=(i j-1),i,j=1,2,…n,
n
移 bi= aij,i=1,2,…n j=1
文章选取以系数矩阵为范德蒙德矩阵的病态 线性方程组,借鉴文献[4]提供的单参数迭代法和文 献[5]中的新主元加权迭代法,对病态线性方程组进 行分析求解。结果表明选取的迭代方法切实可行, 对分析此病态线性方程组有很大帮助。
1 范德蒙德矩阵的病态性分析
选取 n 阶的范德蒙德矩阵如下:
1 杉山
病态希尔伯特方程组解法-高等数值分析大作业
病态方程组的求解理论分析表明,数值求解病态线性方程组很困难,考虑求解如下的线性方程组的求解:Hx=b ,其中H 是Hilbert 矩阵,H=(hij)n×n ,h ij =1i+j−1,ii ,jj =1,2…..nn1.估计矩阵的2-条件数和矩阵阶数的关系;2.对不同的n ,取x =(1,1,1…,1)∈R n ,利用Hx=b 得出b.然后分别用Guass 消去,Jacobi 迭代,Gauss-seidel 迭代,SOR 迭代求解方程: Ax=b ;把近似解x (k )与准确解x 对比,计算结果;3.综合计算结果,讨论病态方程组的求解。
解:1.用MATLAB 计算1-9阶Hilbert 矩阵的2-条件数得到的结果如下表所示(cond2(Hnn )表示n 阶Hilbert 矩阵的2-条件数):对表中数据进行分析可发现,随矩阵的阶数的增加,2-条件数越来越大,后项与前项之比约为30,2-条件数呈近似指数式增长。
对cond2(H nn )取以10为底的对数,可发现在前几项log10(cond2(Hn))随n 的增加约呈线性增加关系。
n 为20时,log10(cond2(Hn))与n 的关系与下图所示:此时可发现当n ≤13时,log10(cond2(Hn))与n 接近于线性关系,n >13后,log10(cond2(Hn))变化十分缓慢。
为了对图像的线性进行比较,对n 为1-13部分1-9阶hilbert 矩阵的2-条件数n 12 3 4 5 6 7 8 9 cond2(H nn ) 119.2815 524.0568 1.55E+04 4.77E+05 1.49E+07 4.75E+08 1.53E+10 4.93E+11进行线性拟合,结果如下图所示:从上图可看出,n较小时,log10(cond2(Hn))与n成近似线性关系。
继续增大n,n=200时,log10(cond2(Hn))与n如下图所示:由图可看出,n为200时,log10(cond2(Hn))与n的关系与n=20时相近,在n较小时log10(cond2(Hn))与n的关系接近线性关系,当n大于一定的值后log10(cond2(Hn))变化十分缓慢,但有上升的趋势。
数值分析希尔伯特病态线性方程组
病态线性代数方程组的求解理论的分析表明,求解病态的线性代数方程组是困难的。
考虑方程组Hx = b的求解,其中H为Hilbert矩阵,H=(hij)n⨯n,hij=1,i,j=1,2,...,n i+j-11. 估计Hilbert矩阵2-条件数与阶数的关系;2. 选择问题的不同维数,分别用Gauss消去法,Jacobi迭代,GS迭代和SOR迭代求解,比较结果;3. 讨论病态问题求解的算法。
解:1、取Hilbert矩阵阶数最高分别为n=20和n=100。
采用Hilbert矩阵的2-条件数作为实验的比较对象,画出的曲线如下图所示:lg(cond(Hn))nlg(cond(Hn))~n关系图lg(cond(Hn))n从图中可以看出,在n≤13之前,图像接近直线,在n>13之后,图像趋于平缓,在一定的范围内上下波动。
为了比较图像的线性部分,作出一条直线与已知曲线进行比较。
比较直线的关系式为:lg(cond(Hn))=1.519n-1.833,结果下图所示。
lg(cond(Hn))~n关系图lg(cond(Hn))n从图2中可以看出,当n较小时,lg(cond(Hn))~n之间近似满足线性关系。
当n 继续增大到100时,lg(cond(Hn))~n关系图下图所示:lg(cond(Hn))~n关系图lg(cond(Hn))n从图中可以看出,图像的走势符合在n=20时的猜想,在n大于一定的值之后,图像趋于平缓,且在一定范围内震荡,同时又有一定上升趋势,但上升速度很慢。
2、选择不同的阶数n,设方程组的精确解为xz=(1,1,…,1)T进行计算,用四种方法解x_Guass1、x_Jacobi1、x_GS1、x_SOR1对比表如下表所示。
Gauss消去法求解:选择问题的阶数为3~8时,用Gauss消去法求得的解与精确解一致,当阶数为9~14时,解开始出现偏差,而且n越大,偏差越大。
用迭代法求解:取初始向量为1.2(1,1,…,1)T.无论n为多少阶,用Jacobi迭代方法迭代出现发散的不稳定现象,无法求解;用GS迭代方法迭代不发散,能求得解,但收敛非常缓慢,当迭代次数取得相当大(20000次)时解仍在精确解附近波动;取w=1.5,用SOR迭代方法迭代不发散,能求得解,收敛速度较GS迭代快一些,但仍非常缓慢。
数值分析——线性方程组直接解法Hilbert矩阵
数值分析第一次上机实习报告——线性方程组直接解法一、问题描述设 H n = [h ij ] ∈ R n ×n 是 Hilbert 矩阵, 即11ij h i j =+- 对n = 2,3,4,…13,(a) 取11n n x R ⨯⎛⎫ ⎪=∈ ⎪ ⎪⎝⎭,及n n b H x =,用Gauss 消去法和Cholesky 分解方法来求解n n H y b =,看看误差有多大.(b) 计算条件数:2()n cond H(c) 使用某种正则化方法改善(a)中的结果.二、方法描述1. Gauss 消去法Gauss 消去法一般用于系数矩阵稠密且没有任何特殊结构的线性方程组。
设H =[h ij ],y = (y 1,y 2,…,y n )T . 首先对系数矩阵H n 进行LU 分解,对于k=1,2,…n,交替进行计算:1111),,1,,1(),1,2,,k kj kj kr rj r k ik ik ir rk r kk u h l u j k k n l a l u i k k n u -=-=⎧=-=+⎪⎪⎨⎪=-=++⎪⎩∑∑…… 由此可以得到下三角矩阵L=[l ij ]和上三角矩阵U=[u ij ]. 依次求解方程组Ly=b 和Ux=y ,111,1,2,,1(),,1,,1i i i ir r r n i i ir r r i ii y b l y i n x y u x i n n u -==+⎧=-=⎪⎪⎨⎪=-=-⎪⎩∑∑…… 即可确定最终解。
2. Cholesky 分解法对于系数矩阵对称正定的方程组n n H y b =,存在唯一的对角元素为正数的下三角矩阵L ,使得H=LL T 。
因此,首先对矩阵H n 进行Cholesky 分解,即1122111()1()j jj jj jk k j ij ij ik jk k jj l h l l h l l l -=-=⎧=-⎪⎪⎨⎪=-⎪⎩∑∑ 1,i j n =+… L 的元素求出之后,依次求解方程组Ly=b 和L T x=y ,即1111111(),2,3,i i i ik k k ii b y l y b l y i n l -=⎧=⎪⎪⎨⎪=-=⎪⎩∑… 11(),1,2,n n nn n i i ki k k i nn y x l x y l x i n n l =+⎧=⎪⎪⎨⎪=-=--⎪⎩∑…1 由此求得方程组n n H y b =的解。
数值分析实验-病态线性方程组的算法设计
数值分析课程实验报告 实验名称 病态线性方程组的算法设计
班级
学号 姓名 序号
任课教师 评分 一、 实验目的
1、 初步病态线性方程组的判定。
2、 初步了解常规方法在求解病态线性方程组时遇到的困难。
3、 针对病态问题设计求解算法并验证算法的有效性。
二、用文字或图表记录实验过程和结果
1、Hilbert 矩阵如下:
11/21/1/21/31/(1)()1/1/(1)1/(21)n ij n
n H h n n n ⎡⎤⎢⎥+⎢⎥==⎢⎥⎢⎥+-⎣⎦L L M M M L 其中1(1)ij h i j =+-,它是一个对称正定矩阵,并且()n cond H 随着n 的增加迅速增加,利用Matlab 分析如下:
可以发现在阶数不断增大
Hilbert 矩阵的条件数不断增大,
这样使得求解Hilbert 病态方程
变得非常困难,即使A 或b 有微小
扰动时,即使求解过程是精确进
行的(即没有舍入误差),所得的
解相对于原方程的解也会有很大
的相对误差。
这就需要提出病态
线性方程组的求解方法,对于一
般的方程求解常用的有高斯(选
主元)消去算法、高斯—赛德尔迭代。
本试验先使用用列主元高斯消去算法和高斯-赛德尔迭代算法求解线性方程组:
n
H x b = 其中11(,,),(1,2,,)n T n i ij j b b b b h i n ====∑L L 。
2、高斯列主元消去算法
(1)设计流程图:。
Hilbert矩阵病态线性代数方程组的求解
实验一病态线性代数方程组的求解1.估计Hilbert矩阵2-条件数与阶数的关系运行tiaojianshu.m 输入m=10 可以得到如下表的结果2.选择不同维数,分别用Guass消去(LU分解),Jacobi迭代,GS 迭代,SOR迭代求解,比较结果。
说明:Hx=b,H矩阵可以由matlab直接给出,为了设定参考解,我们先设x为分量全1的向量,求出b,然后将H和b作为已知量,求x,与设定的参考解对比。
对于Jacobi迭代,GS迭代,SOR迭代,取迭代初值x0为0向量,迭代精度eps=1.0e-6,迭代次数<100000, SOR迭代中w=1.2和0.8分别计算。
a. n=5b. n=8c. n=10d. n=15取不同的n值,得到如下结果:对于Guass法,可以看出来,随着n的增大,求解结果误差变大,这是因为随着n增大,系数矩阵的条件数变大,微小的扰动就容易造成很大的误差。
最后得不到精确解。
对于Jacobi迭代,计算结果为Inf,说明是发散的。
对于GS迭代和SOR迭代,结果是收敛的,但是可以看出迭代次数比较多,并且对于不同维数GS和SOR收敛速度不一样,有时候GS快,有时SOR快。
对SOR取不同的w迭代速度也不一样,存在一个最优的松弛因子w。
并且可以知道,迭代次数多少跟初值x0也有关系。
3.讨论病态问题求解的算法。
通过上面的实验分析,可以看出,求解病态矩阵的时候要小心,否则可能得不到所要求的精确度。
可以采用高精度运算,用双倍多倍字长,使得由于误差放大而损失若干有效数字位之后,还能保留一些有效位。
另外可以通过对原方程作某些预处理,降低系数矩阵的条件数,因为cond(aA)=cond(A),所以不能通过将每一个方程乘上相同的常数来达到这个目标,可考虑将矩阵的每一行和每一列分别乘上不同的常数,亦即找到可逆的对角阵D1和D2将方程组化为D1AD2y=D1b,x=D2y这称为矩阵的平衡问题,但是这样计算量比原问题本身要多。
病态线性方程组的求解
《科学与工程计算》实验报告学号:姓名:一、实验内容:考虑方程组Hx=b 的求解,其中系数矩阵H 为Hilbert 矩阵,nj i j i h h H j i n n j i ,,2,1,,11,)(,, =-+==⨯这是一个著名的病态问题。
通过首先给定解(例如取为各个分量均为1)再计算出右端b 的办法给出确定的问题。
实验要求:(1)选择问题的维数为6,分别用Jacobi 迭代法、GS 迭代法和SOR 迭代法求解方程组,其各自的结果如何?将计算结果与问题的解比较,结论如何?(2)逐步增大问题的维数,仍然用上述的方法来解它们,计算的结果如何?计算的结果说明了什么? (3)讨论病态问题求解的算法。
二、程序设计的基本思想、原理和算法描述:1、 算法 Jacobi 迭代法若A 为稀疏矩阵,只需遍历非零元素GS 迭代法若A 为稀疏矩阵,只需遍历非零元素每步迭代计算量相当于一次矩阵与向量的乘法;不需要保留上一步的迭代解,与Jacobi 迭代法计算量一样。
SOR 迭代法(稠密矩阵)2、 函数组成double max(double array[100]) 求数组中的最大值函数3、 输入/输出设计对于方程组Hx=b 的求解,系数矩阵H 为Hilbert 矩阵,矩阵中的数由下列函数生成。
nj i j i h h H j i n n j i ,,2,1,,11,)(,, =-+==⨯X*取一个特解[1,1,1, (1)b 数组由矩阵的每行元素相加得来。
4、符号名说明double c[100] 用来存储第k+1次和第k 次迭代结果的差值的绝对值 double x[100] 第k+1次迭代结果,储存解数组 double x0[100] 初始向量double r 第k+1次和第k 次迭代结果的差值的绝对值的最大值 double sum 矩阵方程变换后右侧值的和 int k 迭代次数double a[100][100] 存储Hilbert 矩阵 double b[100] 存储b 向量三、源程序及注释:Jacobi 迭代法#include<iostream> #include<math.h> #include <iomanip> #include <stdio.h> using namespace std; int n;double max(double array[100])//求最大值函数 {double a=array[0]; int i;for(i=1; i<n; i++) {if(a<array[i]) a=array[i]; return a; } }double c[100]= {0.0};double x[100]= {0.0}; //第k+1次迭代结果,储存解数组 double x0[100]= {0.0}; //初始向量double r,sum=0; int main(){double s=0;int i,k,j;//k为迭代次数double a[100][100];double b[100]= {0.0};cout<<"请输入维数:"<<endl;cin>>n;cout<<"输出a数组:"<<endl;double max(double array[100]);for(i=0; i<n; i++){for(j=0; j<n; j++){a[i][j]=1.0/(i+j+1);printf("%10.6lf ",a[i][j]);//矩阵中的数精确到六位}cout<<endl;}cout<<"输出b数组:"<<endl;for(i=0; i<n; i++){for(j=0; j<n; j++){b[i]+=a[i][j];//矩阵每行的和}cout<<b[i]<<" ";}cout<<endl;cout<<"输入精度:"<<endl;cin>>s;for(k=1;; k++){for(i=0; i<n; i++){for(j=0; j<n; j++){sum=a[i][j]*x0[j]+sum;}x[i]=x0[i]+((b[i]-sum)/a[i][i]);//雅克比迭代方法计算方式c[i]=fabs(x[i]-x0[i]);//求差值的绝对值x0[i]=x[i];sum=0;r=max(c);if(r<s)//输出迭代次数{for(i=0; i<n; i++)cout<<"x"<<i<<" = "<<x[i]<<setprecision(10)<<endl;cout<<"迭代次数:"<<k<<endl;return 0;}}return 0;}GS迭代法#include<iostream>#include<math.h>#include <iomanip>#include <stdio.h>using namespace std;int n;double max(double array[100])//求最大值函数{double a=array[0];int i;for(i=1;i<n;i++){if(a<array[i])a=array[i];}return a;}main() {double s=0;double max(double array[100]);double c[100]={0.0};double x[100]={0.0};//第k+1次迭代结果,储存解数组double x0[100]={0.0};//初始向量int i,k,j;double r,sum=0;double a[100][100];double b[100]= {0.0};cout<<"请输入维数:"<<endl;cout<<"输出a数组:"<<endl;for(i=0; i<n; i++){for(j=0; j<n; j++){a[i][j]=1.0/(i+j+1);printf("%10.6lf ",a[i][j]);//矩阵中的数精确到六位}cout<<endl;}cout<<"输出b数组:"<<endl;for(i=0; i<n; i++){for(j=0; j<n; j++){b[i]+=a[i][j];//矩阵每行的和}cout<<b[i]<<" ";}cout<<endl;cout<<"输入精度:"<<endl;cin>>s;for(k=1;;k++){for(i=0;i<n;i++){for(j=0;j<n;j++){sum=a[i][j]*x0[j]+sum;}x[i]=x0[i]+((b[i]-sum)/a[i][i]);//gs迭代方法计算方式c[i]=fabs(x[i]-x0[i]);//求差值的绝对值x0[i]=x[i];sum=0;}r=max(c);if(r<s)//输出迭代次数{for(i=0;i<n;i++)cout<<"x"<<i<<" = "<<x[i]<<setprecision(10)<<endl;cout<<"迭代次数:"<<k<<endl;return 0;}}}SOR迭代法#include<iostream>#include<math.h>#include <iomanip>#include <stdio.h>using namespace std;int n;double max(double array[100]){double a=array[0];int i;for(i=1;i<n;i++){if(a<array[i])a=array[i];}return a;}int main() {double s=0,w=0;int i,k,j;//k为迭代次数double max(double array[100]);double c[100]= {0.0}; //double x[100]= {0.0}; //第k+1次迭代结果,储存解数组double x0[100]= {0.0}; //初始向量int i,k,j;double r,sum=0;double a[100][100];double b[100]= {0.0};cout<<"请输入维数:"<<endl;cin>>n;cout<<"输出a数组:"<<endl;for(i=0; i<n; i++){for(j=0; j<n; j++){a[i][j]=1.0/(i+j+1);printf("%10.6lf ",a[i][j]);//cout<<a[i][j]<<" ";}cout<<endl;}cout<<"输出b数组:"<<endl;for(i=0; i<n; i++){for(j=0; j<n; j++){b[i]+=a[i][j];}cout<<b[i]<<" ";}cout<<endl;cout<<"输入精度:"<<endl;cin>>s;cout<<"输入松弛因子:"<<endl;cin>>w;for(k=1;;k++){for(i=0;i<n;i++){for(j=0;j<n;j++){sum=a[i][j]*x0[j]+sum;}x[i]=x0[i]+(w*(b[i]-sum)/a[i][i]);//sor迭代方法的计算公式c[i]=fabs(x[i]-x0[i]);//求差值的绝对值x0[i]=x[i];sum=0;}r=max(c);if(r<s)//输出迭代次数{for(i=0;i<n;i++)cout<<"x"<<i<<" = "<<x[i]<<setprecision(10)<<endl; cout<<"迭代次数:"<<k<<endl;return 0;}}}四、运行输出结果:JacobiGSSOR五、结果比较分析:说明:Hx=b,H矩阵可以由函数hi,j=1/(i+j-1)直接由程序生成,为了设定参考解,我们先设x为分量全1的向量,求出b,然后将H和b作为已知量,求x,与设定的参考解对比。
一病态线性方程组的算法设计
实验一 病态线性方程组的算法设计
1 实验目的
① 初步了解常规方法在求解病态线性方程组时遇到的困难。
② 针对病态问题设计求解算法并验证算法的有效性。
2 实验内容
Hilbert 矩阵是一个典型的病态矩阵,定义如下
11/21/1/21/31/(1)()1/1/(1)
1/(21)n ij n n H h n n n ⎡⎤⎢⎥+⎢⎥==⎢⎥⎢⎥+-⎣⎦ (1) 其中1(1)ij h i j =+-,
它是一个对称正定矩阵,并且()n cond H 随着n 的增加迅速增加,其逆矩阵1()n ij H a -=,其中
2(1)(1)!(1)!(1)[(1)!(1)!]()!()!
i j ij n i n j a i j i j n i n j +-+-+-=+----- 考虑线性方程组
n H x b = (2)
其中11
(,,),(1,2,,)n
T
n i ij j b b b b h i n ====∑。
易见()1,,1T x =为方程组(2)的精确解。
编程完成以下题目:
(1) 用列主元高斯消去算法和高斯-赛德尔迭代算法求解线性方程组(2),与精确解进行比较,
写出你的结论,并分析原因。
(线性方程组的阶数3,5,10,20,40n =)
(2) 设计一种可对方程组(2)进行求解的有效算法。
(3,5,10,20,40n =)
3 练习思考
什么是病态线性方程组,如何判定线性代数方程组是否是病态的?并举例对你的结论进行验证。
计算方法Hilbert矩阵病态问题
Solution (1)猜想:()()ln cond Hn n 成线性比例关系。
验证:猜想部分正确。
根据不同n 建立对应的Hilbert 矩阵,计算该矩阵的2-范数的条件数,并绘制曲线。
编程实现见附录1中solution(1)。
实际编程中,分别取N=5,=10N ,=20N ,N=30,可以发现()()ln cond Hn n 曲线先是按线性规律变化;当n 达到大约12以后,()()ln cond Hn 的取值在40~50之间产生振荡。
各结果如下:N=5时 N=10时ln(cond(Hn))-nnl n (c o n d (H n ))ln(cond(Hn))-nnl n (c o n d (H n ))ln(cond(Hn))-nnl n (c o n d (H n ))ln(cond(Hn))-nnl n (c o n d (H n ))N=20时N=30时Solution (2)猜想:通过对Hilbert 矩阵的预处理,能改善Hilbert 的病态性质。
验证:根据不同n 建立对应的Hilbert 矩阵,计算该矩阵的2-范数的条件数,其次计算经过预处理后的H^矩阵的2-范数的条件数,并绘制()()()ln ^/cond Hn cond Hn n 曲线。
编程实现见附录1中的solution(2)。
实际编程中,分别取N=5,=12N ,=50N ,N=100,可以发现所得到的变化曲线()()()ln ^/cond Hn cond Hn n 在12n ≤时,()()()ln ^/cond Hn cond Hn 的取值较为平缓的减小,且均小于0。
而随着Hilbert 矩阵阶数的增大,()()()ln ^/cond Hn cond Hn 的取值在[]-7,3区间中振荡,主要集中在[]-31,,且多数取值()()()ln ^/0cond Hn cond Hn ≤。
则对多数的Hilbert 矩阵,其条件数在经过预处理后,有()()^cond Hn cond Hn ≤,即预处理在一定程度上改善了原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越大,偏差越大。
Hilbert矩阵病态问题研究
Hilbert 矩阵病态问题研究1)Hilbert 矩阵的阶数n 与ln(())n cond H 的关系猜想:ln(())n cond H 与n 呈线性关系,其中()n cond H 按2范数计算。
绘制ln(())n cond H n 曲线。
分别取11050500n ≤≤、、,得到ln(())n cond H n曲线如图1-1、图1-2及图1-3所示。
程序详见附录1。
图1-1. 110n ≤≤由图1-1可知,110n ≤≤,ln(())n cond H 是n 的线性函数,猜想正确。
图1-2. 150n ≤≤由图1-2知,当15n >时,ln(())n cond H 与n 之间的线性关系已经不存在,而且ln(())n cond H 的值大致在(40,50)内间波动,猜想与实际不完全相符。
图1-3. 1500n ≤≤图1-3进一步说明了ln(())n cond H 与n 之间的变化关系:当n 小于某一值(设该值为k )时,ln(())n cond H 是n 的线性函数,而当n 大于k 时,随着n 的增大,ln(())n cond H 与n 间的线性关系不再成立,且其值在某一区间内波动。
为进一步确定k 的大小,绘制114n ≤≤时的曲线,如图1-4所示,可知k 的取值应为13。
图1-4. 114n ≤≤2)由n H 至ˆnH 的预处理 绘制ˆln(()/())n n cond H cond H n 曲线。
其中11ˆn nH D H D --=,D 为由n H 的对角元素开方构成的对角矩阵。
条件数按2范数计算。
程序详见附录2。
分别取11350500n ≤≤、、,得到如图2-1、图2-2和图2-3所示曲线。
由曲线图像可知:当Hilbert 矩阵的阶数12n ≤时,ˆln(()/())n ncond H cond H 随n 增大而逐渐减小,而n 继续增大时,ˆln(()/())n n cond H cond H 的取值将在区间(-7,4)内波动,且主要集中在(0,-3)区间内。
希尔伯特矩阵的病态性问题
希尔伯特矩阵的病态性问题(学号:200921100102 姓 名:陈丹丹 )一、问题叙述希尔伯特矩阵是著名的病态矩阵。
n 阶Hilbert 矩阵为⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡−++=)12/(1)1/(1/1)1/(13/12/1/12/11n n n n n H n L L L L L L L 其条件数 Cond(H n ) 如下表所示n2 3 4 5 6 Cond(H n )1.9281e+001 5.2406e+002 1.5514e+004 4.7661e+005 1.4951e+007随着n 的增大,矩阵条件数迅速增加。
猜测:希尔伯特矩阵条件数以指数规律增长。
即,设矩阵阶数为n ,有Cond(H n ) ≈ exp( a n + b )对表中的条件数做对数变换,问题转化为线性拟合问题ln[Cond(H n )] = a n + b ,( n = 2,3,4,5,6)线性函数的两个系数分别为a = 3.3935,b = – 3.8811故指数拟合函数为:Cond(H n ) ≈ exp(3.3935 n –3.8811 )拟合函数的残差向量为r 2 r 3 r 4 r 5 r 69.9860e-001 -2.0231e+001 -6.8994e+002 -5.7825e+003 5.9012e+005 我们讨论以下三个问题:(1)由于线性拟合所得残差向量较大,下面用实验确定:选择用几次多项式拟合较好(2)设D 是由H n 的对角线元素开方构成的对角矩阵,令11ˆ−−=D H D H nn ,不难看出该矩阵仍然是对称正定矩阵,而且其对角元素全为1。
将H n 变换为n H ˆ的技术称为预处理(Preconditioning )。
试分析函数)](/)ˆ(ln[nn H Cond H Cond 随n 变化的规律,绘制该函数的曲线。
(3)如果只用左预处理,即D 取希尔伯特矩阵对角元构成对角矩阵,用D 的逆阵左乘H 后条件数如何。
Hilbert矩阵病态性分析
Hilbert矩阵病态性分析一、问题叙述Hilbert矩阵是著名的病态矩阵,用迭代法解矩阵方程时,如果系数矩阵是Hilbert矩阵,则求解结果误差较大。
本文就研究Hilbert矩阵的病态性,和Hilbert 矩阵的阶数与迭代求解误差大小的关系。
二、问题分析MATLAB中有专门的Hilbert矩阵及其准确逆矩阵的生成函数,从而可以通过MATLAB求解出系数矩阵是Hilbert矩阵的矩阵方程比较准确的解,再根据条件数估计求解误差的大小。
三、实验程序及注释m=input('input m:='); %输入矩阵的阶数N=[m];for k=1:length(N)n=N(k); %矩阵的阶H=hilb(n); %产生n阶Hilbert矩阵disp(H) %输出n阶Hilbert矩阵Hi=invhilb(n); %产生完全准确的n阶逆Hilbert矩阵b=ones(n,1); %生成n阶全1向量x_approx=H\b; %利用左除H求近似解x_exact=Hi*b; %利用准确逆Hilbert矩阵求准确解ndb=norm(H*x_approx-b);nb=norm(b);ndx=norm(x_approx - x_exact);nx=norm(x_approx);er_actual(k)=ndx/nx; %实际相对误差K=cond(H); %计算Hilbert矩阵的条件数er_approx(k)=K*eps; %最大可能的近似相对误差er_max(k)=K*ndb/nb; %最大可能的相对误差enddisp('Hilbert矩阵阶数'),disp(N)format short edisp('实际误差 er_actual'),disp(er_actual),disp('')disp('近似的最大可能差 er_approx'),disp(er_approx),disp('') disp('最大可能误差 er_max'),disp(er_max),disp('')四、实验数据结果及分析程序运行后,输入矩阵阶数4时的输出为:input m:=41.0000 0.5000 0.3333 0.25000.5000 0.3333 0.2500 0.20000.3333 0.2500 0.2000 0.16670.2500 0.2000 0.1667 0.1429Hilbert矩阵阶数4实际误差er_actual1.0284e-013近似的最大可能误差er_approx3.4447e-012最大可能误差er_max4.7732e-011当输入不同的矩阵阶数时,误差大小如表1所示。
用高斯赛德尔方法求希尔伯特矩阵
用高斯赛德尔方法求希尔伯特矩阵标题:用高斯赛德尔方法求希尔伯特矩阵导语:希尔伯特矩阵(Hilbert Matrix)是一个被广泛研究的特殊矩阵,具有许多有趣的数学性质和应用。
高斯赛德尔方法(Gauss-Seidel Method)则是一种迭代算法,用于求解线性方程组。
本文将介绍如何用高斯赛德尔方法求解希尔伯特矩阵的线性方程组,并探讨这两个概念之间的关系。
一、希尔伯特矩阵的定义和性质1. 希尔伯特矩阵是一个n×n的矩阵,其元素由公式H(i,j) = 1/(i+j-1)给出。
2. 希尔伯特矩阵具有对称性和正定性,是一个特殊且重要的矩阵类别。
3. 希尔伯特矩阵在数值计算、插值理论和优化问题等领域有广泛应用。
二、高斯赛德尔方法简介1. 高斯赛德尔方法是一种迭代算法,用于解决线性方程组Ax=b。
2. 其迭代公式为x(k+1) = D^(-1)(b-Rx(k)),其中x(k)是当前迭代的解,D是系数矩阵A的对角线矩阵,R是A的严格下三角部分。
3. 高斯赛德尔方法的收敛性取决于矩阵A的性质,特别是A的谱半径。
三、用高斯赛德尔方法求解希尔伯特矩阵的线性方程组1. 对于希尔伯特矩阵H,我们可以将线性方程组Ax=b转化为Hx=b的形式。
2. 使用高斯赛德尔方法,我们可以通过迭代过程逐步逼近方程组的解。
3. 由于希尔伯特矩阵的特殊性质和高斯赛德尔方法的收敛性,我们通常可以在相对较少的迭代次数下获得满意的近似解。
四、个人观点和理解1. 对我来说,高斯赛德尔方法是一种非常强大和实用的数值计算工具,尤其适用于求解特殊矩阵类型的线性方程组。
2. 希尔伯特矩阵作为一个重要的特例,展示了数学中的美妙和深奥,同时也给了我对迭代算法的新认识和思考。
3. 这两个概念的结合,让我更加深入地理解了线性代数和数值计算的交叉点,并为我今后在相关领域的研究和学习提供了新的启发。
总结:本文介绍了希尔伯特矩阵的定义和特性,并引入了高斯赛德尔方法作为求解希尔伯特矩阵线性方程组的迭代算法。
数值分析希尔伯特病态线性方程组
病态线性代数方程组的求解理论的分析表明,求解病态的线性代数方程组是困难的。
考虑方程组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 越大,偏差越大。
题目:主要研究希尔伯特矩阵的病态性
题目:主要研究希尔伯特矩阵的病态性Hilbert 矩阵的定义为: H n =⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡-++)1n 2/(1)1n /(1/1)1n /(13/12/1n /12/11 n 该矩阵是一个对称正定矩阵,其条件数随n 的增加迅速增加。
画出ln (cond (H n )2)~n 之间的曲线,观察他们的关系。
其中cond (H n )2表示矩阵在2范数下的条件数,它可按如下公式计算: (1) cond (H n )2=nλλ1,1λ和n λ分别是H n 的最大特征值和最小特征值。
(2) 设D 是H n 对角元素开方构成的对角矩阵,令nH∧=D 1- H n D 1-,不难看出nH∧依然还是对称矩阵,,并且对角元素都是1,画出ln (cond (H n )2)~之间的曲线,观察他们之间的关系。
(3) 对于4≤n ≤12,给定不同的右端项b ,分别用x 1=H 1-n ;x 2= D 1-(nH ∧1-D 1-b );x 3= H n \b ,求解H n x=b ,比较结果x 1 、x 2、 x 3。
程序如下:首先,建立eiggg-M 文件,求解矩阵的最大特征值和最小特征值。
function [max,min]=eiggg(s) ss=size(s) if ss==1; max=s(1); min=s(1); elsemax=s(1); min=s(1); for i=1:1:ss; if s(i)>=max max=s(i); endif s(i)<=min min=s(i); end endend再建立Hilbert.m文件,给出Hilbert矩阵的定义:function H=Hilbert(n)H=zeros(n,n);for i=1:1:n;for j=1:1:n;H(i,j)=1/(i+j-1);endend然后求出D的逆矩阵function H=Hilbert2(n)H=zeros(n,n);for j=1:1:n;H(j,j)=1/(2*j-1);endD=sqrt(H);D1=inv(D);H=D1*H*H;编译主程序:clear;clc;N=4;mv2=zeros(N,1);for i=1:1:N;H=Hilbert2(i);s=eig(H);[max,min]=eiggg(s);mv1=max/min;mv2(i)=log(mv1);endn=1:1:N;figure(1),subplot(221),plot(n,mv2(n));title('ln(cond(Hn)2)与n之间的关系');H1=Hilbert(N);H2=Hilbert2(N);b=[1;2;3;4;];;x1=inv(H1)*b;x2=H2*b;x3=H1\b;sss=size(x1)i=1:1:sss(1);subplot(222),plot(i,x1);subplot(223),plot(i,x2);subplot(224),plot(i,x3);运行之后的结果:ss =1 1ss =2 1ss =3 1ss =4 1sss =4 1得出图像:由此可见,其条件数随n的增加而增加,则该矩阵不收敛,故则证得希尔伯特矩阵式的病态性。
病态线性方程组的求解
病态线性方程组的求解理论分析表明,数值求解病态线性方程组很困难。
考虑求解如下的线性方程组的求解Hx = b ,期中H 是Hilbert 矩阵,()ij n n H h ⨯=,11ij h i j =+-,i ,j = 1,2,…,n1. 估计矩阵的2条件数和阶数的关系2. 对不同的n ,取(1,1,,1)nx =∈,分别用Gauss 消去,Jacobi 迭代,Gauss-seidel 迭代,SOR 迭代和共轭梯度法求解,比较结果。
3. 结合计算结果,试讨论病态线性方程组的求解。
1)估计矩阵的2-条件数和阶数的关系矩阵的2-条件数定义为:1222()Cond A A A-=⨯,将Hilbert 矩阵带入有:1222()Cond H H H -=⨯。
使用MA TLAB 自带的cond2函数进行计算并画出log10(cond2)和阶数n 的关系曲线如下:可见当n 小于13的时候,条件数的对数与阶数有较好的线性关系,但是随着阶数的提高,条件数趋于“稳定”地振荡。
但是事实上,n较大时,H矩阵已经奇异,直接使用cond函数计算结果可能存在不准确性。
原因是对于条件数过大的矩阵使用inv函数求逆矩阵是不可靠的,应该使用invhilb函数进行求逆,并代入定义式中求解,生成的结果如下所示。
线性度较好,可知,Hilbert矩阵的2-条件数会随其阶数n的增加呈指数增大趋势,因此当n较大时Hilbert矩阵将是严重病态的。
对不同的n,采用各种方法求解方程编写程序,选取n=2,3,5,10,15,20,迭代条件为迭代100000次或者是计算精度达到1e-6,若迭代次数少于设定最大值,表示相邻两次迭代达到精度要求,或者是计算结果超出范围。
X0取零向量,w取1.2,计算结果如下所示:由上可见,当n大于2时,Jacobi法已经不收敛,故其迭代次数已经没有意义。
当n=15时,Gauss消去法已经不收敛。
并且随着阶数的上升,gauss消去法的误差也随之上升。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一病态线性代数方程组的求解
1.估计Hilbert矩阵2-条件数与阶数的关系
运行tiaojianshu.m 输入m=10 可以得到如下表的结果
2.选择不同维数,分别用Guass消去(LU分解),Jacobi迭代,GS 迭代,SOR迭代求解,比较结果。
说明:Hx=b,H矩阵可以由matlab直接给出,为了设定参考解,我们先设x为分量全1的向量,求出b,然后将H和b作为已知量,求x,与设定的参考解对比。
对于Jacobi迭代,GS迭代,SOR迭代,取迭代初值x0为0向量,迭代精度eps=1.0e-6,迭代次数<100000, SOR迭代中w=1.2和0.8分别计算。
a. n=5
b. n=8
c. n=10
d. n=15
取不同的n值,得到如下结果:
对于Guass法,可以看出来,随着n的增大,求解结果误差变大,这是因为随着n增大,系数矩阵的条件数变大,微小的扰动就容易造成很大的误差。
最后得不到精确解。
对于Jacobi迭代,计算结果为Inf,说明是发散的。
对于GS迭代和SOR迭代,结果是收敛的,但是可以看出迭代次数比较多,并且对于不同维数GS和SOR收敛速度不一样,有时候GS快,有时SOR快。
对SOR取不同的w迭代速度也不一样,存在一个最优的松弛因子w。
并且可以知道,迭代次数多少跟初值x0也有关系。
3.讨论病态问题求解的算法。
通过上面的实验分析,可以看出,求解病态矩阵的时候要小心,否则可能得不到所要求的精确度。
可以采用高精度运算,用双倍多倍字长,使得由于误差放大而损失若干有效数字位之后,还能保留一些有效位。
另外可以通过对原方程作某些预处理,降低系数矩阵的条件数,因为cond(aA)=cond(A),所以不能通过将每一个方程乘上相同的常数来达到这个目标,可考虑将矩阵的每一行和每一列分别乘上不同的常数,亦即找到可逆的对角阵D1和D2将方程组化为
D1AD2y=D1b,x=D2y
这称为矩阵的平衡问题,但是这样计算量比原问题本身要多。
或者通过变分原理将求解线性方程组的问题转化为等价的求解无约束函数最优化问题的极小值等等,可以参考
[1]郑洲顺,黄光辉,杨晓辉求解病态线性方程组的混合算法
实验一所编程序如下:
1.求条件数
tiaojianshu.m
m=input ('input m:=') ;
N=[1:m];
for i=1:m
n=N(i);
H=hilb(n);
k=cond(H);
disp('矩阵的阶数')
disp(n)
disp('矩阵')
disp(H)
disp('矩阵的条件数')
disp(k)
end
2.Guass法
①Guass.m
function guass(n)
n=input('请输入系数矩阵的维数n=');
H=hilb(n);
x_exact=ones(n,1);
b=H*x_exact;
x=Doolittle(H,b)
a=input('是否继续,继续请按1,结束请按0:');
if a==1
guass(n);
else end
②Doolittle.m
function x=Doolittle(A,b)
% LU分解求Ax=b 的解
N=size(A);
n=N(1);
L=eye(n,n);%L的对角元素为1
U=zeros(n,n); %U为零矩阵
U(1,1:n)=A(1,1:n)%U第一行
L(1:n,1)=A(1:n,1)/U(1,1)%L第一列
for k=2:n
for i=k:n
U(k,i)=A(k,i)-L(k,1:(k-1))*U(1:(k-1),i)
end
for j=(k+1):n
L(j,k)=(A(j,k)-L(j,1:(k-1))*U(1:(k-1),k))/U(k,k) end
end
y=solveDownTriangle(L,b);%调用下三角系数矩阵求解函数
x=solveUpTriangle(U,y);%调用上三角系数矩阵求解函数
③solveDownTriangle.m
function x=solveDownTriangle(A,b)
%求下三角系数矩阵的线性方程组Ax=b
N=size(A);
n=N(1);
for i=1:n
if (i>1)
s=A(i,1:(i-1))*x(1:(i-1),1);
else
s=0;
end
x(i,1)=(b(i)-s)/A(i,i);
end
④solveUpTriangle.m
function x=solveUpTriangle(A,b)
% 求上三角系数矩阵的线性方程组Ax=b
N=size(A);
n=N(1);
for i=n:-1:1
if (i<n)
s=A(i,(i+1):n)*x((i+1):n,1);
else
s=0;
end
x(i,1)=(b(i)-s)/A(i,i);
end
3.Jacobi法
function [x,n]=jacobi(a,x0)
a=input('请输入系数矩阵的维数n=');
x0=input('请输入迭代初始向量x0');
eps=1.0e-6;%解的精度控制
m=10000;%迭代步数控制
H=hilb(a);%生成h矩阵
x_exact=ones(a,1);%求出x精确值
b=H*x_exact;
D=diag(diag(H));
L=-tril(H,-1);
U=-triu(H,1);
B=D\(L+U);
f=D\b;
x=x0;
n=0;
tol=1;
while tol>=eps
x=B*x0+f;
n=n+1;
tol=norm(x-x0);
x0=x;
if (n>=m)
disp('迭代次数太多,可能不收敛');
return;
end
end
disp(x)
disp(n)
4.GS法
function [x,n]=gauseidel(a,x0)
a=input('请输入系数矩阵的维数n=');
x0=input('请输入迭代初始向量x0');
eps=1.0e-6;%解的精度控制
m=100000;%迭代步数控制
H=hilb(a);%生成h矩阵
x_exact=ones(a,1);%求出x精确值
b=H*x_exact;
D=diag(diag(H));
L=-tril(H,-1);
U=-triu(H,1);
G=(D-L)\U;
f=(D-L)\b;
x=x0;
n=0;
tol=1;
while tol>=eps
x=G*x0+f;
n=n+1;
tol=norm(x-x0);
x0=x;
if (n>=m)
disp('迭代次数太多,可能不收敛');
return;
end
end
disp(x)
disp(n)
5.SOR法
function [x,n]=SOR(a,x0,w)
a=input('请输入系数矩阵的维数n=');
x0=input('请输入迭代初始向量x0=');
w=input('请输入w=');
eps=1.0e-6;%解的精度控制
m=100000;%迭代步数控制
H=hilb(a);%生成h矩阵
x_exact=ones(a,1);%求出x精确值
b=H*x_exact;
if (w<=0||w>=2)
error;
return;
end
D=diag(diag(H));
L=-tril(H,-1);
U=-triu(H,1);
B=inv(D-L*w)*((1-w)*D+w*U);
f=w*inv((D-L*w))*b;
x=x0;
n=0;
tol=1;
while tol>=eps
x=B*x0+f;
n=n+1;
tol=norm(x-x0);
x0=x;
if (n>=m)
disp('迭代次数太多,可能不收敛');
return;
end
end
disp(x)
disp(n)
欢迎您的下载,资料仅供参考!。