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

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

(Hilbert 矩阵)病态线性方程组的求解

理论分析表明,数值求解病态线性方程组很困难。考虑求解如下的线性方程组的求解Hx = b ,期中H 是Hilbert 矩阵,()ij n n H h ⨯=,11

ij h i j =

+-,i ,j = 1,2,…,n 1. 估计矩阵的2条件数和阶数的关系 2. 对不同的n ,取(1,1,,1)n

x =∈K ?,分别用Gauss 消去,Jacobi 迭代,Gauss-seidel 迭

代,SOR 迭代和共轭梯度法求解,比较结果。

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

第1小题:

condition.m %第1小题程序

t1=20;%阶数n=20

x1=1:t1;

y1=1:t1;

for i=1:t1

H=hilb(i);

y1(i)=log(cond(H));

end

plot(x1,y1);

xlabel('阶数n');

ylabel('2-条件数的对数(log(cond(H))');

title('2-条件数的对数(log(cond(H))与阶数n 的关系图');

t2=200;%阶数n=200

x2=1:t2;

y2=1:t2;

for i=1:t2

H=hilb(i);

y2(i)=log(cond(H));

end

plot(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.833

2)在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;

end

Gauss.m%Gauss消去法

function x=Gauss(A,b)

n=length(b);

l=zeros(n,n);x=zeros(1,n);

%消去过程

for i=1:n-1

for j=i+1:n

l(j,i)=A(j,i)/A(i,i);

for k=i:n

A(j,k)=A(j,k)-l(j,i)*A(i,k);

end

b(j)=b(j)-l(j,i)*b(i);

end

end

%回代过程

x(n)=b(n)/A(n,n);

for i=n-1:-1:1

c=A(i,:).*x;

x(i)=(b(i)-sum(c(i+1:n)))/A(i,i);

end

Jacobi.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);

相关文档
最新文档