数值分析Hilbert矩阵病态线性方程组的求解Matlab程序Word文件下载.docx
《数值分析Hilbert矩阵病态线性方程组的求解Matlab程序Word文件下载.docx》由会员分享,可在线阅读,更多相关《数值分析Hilbert矩阵病态线性方程组的求解Matlab程序Word文件下载.docx(11页珍藏版)》请在冰豆网上搜索。
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
y2(i)=log(cond(H));
plot(x2,y2);
画出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);
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;
%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;
Gauss.m%Gauss消去法
functionx=Gauss(A,b)
n=length(b);
l=zeros(n,n);
x=zeros(1,n);
%消去过程
n-1
forj=i+1:
n
l(j,i)=A(j,i)/A(i,i);
fork=i:
A(j,k)=A(j,k)-l(j,i)*A(i,k);
end
b(j)=b(j)-l(j,i)*b(i);
%回代过程
x(n)=b(n)/A(n,n);
fori=n-1:
-1:
1
c=A(i,:
).*x;
x(i)=(b(i)-sum(c(i+1:
n)))/A(i,i);
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);
f=D\b;
x=B*x0+f;
n=1;
whilenorm(x-x0)>
e
x0=x;
x=B*x0+f;
n=n+1;
ifn>
m
disp('
Jacobi迭代次数过多,迭代可能不收敛'
break;
G_S.m%Gauss-Seidel迭代,x0表示迭代初值,e表示允许误差(迭代停止条件),n表示迭代次数,m可能最大的迭代次数
function[x,n]=G_S(A,b,x0,e,m)
B=(D-L)\U;
f=(D-L)\b;
Gauss-Seidel迭代次数过多,迭代可能不收敛'
SOR.m%SOR超松弛迭代,x0表示迭代初值,e表示允许误差(迭代停止条件),n表示迭代次数,m可能最大的迭代次数,w松弛因子
function[x,n]=SOR(A,b,x0,e,m,w)
B=(D-w*L)\((1-w)*D+w*U);
f=(D-w*L)\b*w;
SOR超松弛迭代次数过多,迭代可能不收敛'
CG.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;
whilenorm(r1)>
belta=(r1'
*r1)/(r'
*r);
p=r1+belta*p;
r=r1;
alpha=(r'
x=x0+alpha*p;
r1=b-A*x;
CG共轭梯度法迭代次数过多,迭代可能不收敛'