Hilbert矩阵病态线性代数方程组的求解

合集下载

数值分析实验报告——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矩阵)病态线性方程组的求解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矩阵

数值分析——线性方程组直接解法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矩阵病态线性代数方程组的求解

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这称为矩阵的平衡问题,但是这样计算量比原问题本身要多。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)
欢迎您的下载,资料仅供参考!。

相关文档
最新文档