4.解:利用matlab计算源程序:A=[ 3 -2 0 0 0 0 0 0 0 0
-1 3 -2 0 0 0 0 0 0 0
0 -1 3 -2 0 0 0 0 0 0
0 0 -1 3 -2 0 0 0 0 0
0 0 0 -1 3 -2 0 0 0 0
0 0 0 0 -1 3 -2 0 0 0
0 0 0 0 0 -1 3 -2 0 0
0 0 0 0 0 0 -1 3 -2 0
0 0 0 0 0 0 0 -1 3 -2
0 0 0 0 0 0 0 0 -1 3 ];
V3=[1 0 0
0 1 0
0 0 1
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0];
V5=[1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0];
b=[1;0;0;0;0;0;0;0;0;2];
x0=zeros(10,1);
x=ones(10,1);
r0=b-A*x0;
H3=(V3)'*A*(V3);
H3=inv(H3);
z3=V3*H3*(V3)'*r0;
x3=x0+z3
r3=norm(b-A*x3)
e3=norm(x3-x)
H5=(V5)'*A*(V5);
H5=inv(H5)
z5=V5*H5*(V5)'*r0; x5=x0+z5
r5=norm(b-A*x5)
e5=norm(x5-x)
计算结果:
x3’ = 0.4667
0.2000
0.0667
r3=norm(b-A*x3)= 2.0011
e3=norm(x3-x)= 2.9657
x5 = 0.4921
0.2381
0.1111
0.0476
0.0159
r5=norm(b-A*x5)= 2.0001 e5=norm(x5-x) = 2.9162 可见,随着m的变大,残余向量二范数越来越接近于零,所求得的x的值也越来越接近于精确值。 6. 解:利用matlab计算源程序: m=4; h=zeros(m,m); A=[1 0 0 0 1 1 0 0 1 1 1 0 1 1 1 1]; v(:,1)=[1;0;0;0]; for j=1:m for i=1:j h(i,j)=dot(v(:,i),A*v(:,j)); end q=zeros(m,1); for i=1:j q=q+h(i,j)*v(:,i); end r(:,j)=A*v(:,j)-q; h(j+1,j)=norm(r(:,j)); v(:,j+1)=r(:,j)/h(j+1,j); end v=v(:,1:m) h=h(1:m,:) 计算结果: v = 1.0000 0 0 0 0 0.5774 -0.7071 0.4082 0 0.5774 -0.0000 -0.8165 0 0.5774 0.7071 0.4082 h = 1.0000 0 0 0 1.7321 2.0000 -0.8165 0.0000 0 0.8165 0.5000 -0.2887 0 0 0.2887 0.5000 7.解:利用Arnoldi算法计算源程序:m=2; n=4; b=[1;1;1;1]; x0=zeros(4,1); h=zeros(m,m); A=[1 0 0 0 1 1 0 0 1 1 1 0 1 1 1 1]; r0=b-A*(x0); v(:,1)=r0/norm(r0) for j=1:m for i=1:j h(i,j)=dot(v(:,i),A*v(:,j)); end q=zeros(n,1); for i=1:j q=q+h(i,j)*v(:,i); end r(:,j)=A*v(:,j)-q; h(j+1,j)=norm(r(:,j)); v(:,j+1)=r(:,j)/h(j+1,j); end v=v(:,1:m) h=h(1:m,:) h=inv(h); p=zeros(m,1); p(1,1)=norm(r0); z=v*h*p x=z+x0 利用Arnoldi算法计算结果: h = 2.5000 -1.1180 1.1180 0.5000 z = 0.8000 0.4000 -0.0000 -0.4000 x = 0.8000 0.4000 -0.0000 -0.4000 利用GMRES算法计算源程序:m=2; n=4; b=[1;1;1;1]; x0=zeros(4,1); h=zeros(m,m); A=[1 0 0 0 1 1 0 0 1 1 1 0 1 1 1 1]; r0=b-A*(x0); v(:,1)=r0/norm(r0); for j=1:m for i=1:j h(i,j)=dot(v(:,i),A*v(:,j)); end q=zeros(n,1); for i=1:j q=q+h(i,j)*v(:,i); end r(:,j)=A*v(:,j)-q; h(j+1,j)=norm(r(:,j)); v(:,j+1)=r(:,j)/h(j+1,j); end v=v(:,1:m) h=h(1:m+1,:) g=zeros(m+1,1); g(1,1)=norm(r0) for i=1:m W=eye(m+1); s=h(i+1,i)/h(i,i); c=s*s; c=1+c; c=1/c; c=sqrt(c); s=s*c; W(i,i)=c; W(i+1,i+1)=c; W(i,i+1)=s; W(i+1,i)=-s; h=W*h g=W*g end h=h(1:m,:) g=g(1:m,:) y=inv(h)*g x=x0+v*y 利用GMRES算法计算结果:v = 0.5000 -0.6708 0.5000 -0.2236 0.5000 0.2236 0.5000 0.6708 h’ = 2.5000 -1.1180 1.1180 0.5000 0 0.4472 g0’ = 2 h1’ = 2.7386 -0.8165 0 0.9129 0 0.4472 g1’= 1.8257 -0.8165 h2’= 2.7386 -0.8165 0 1.0165 0 0 g2’ = 1.8257 -0.7332 0.3592 h= 2.7386 -0.8165 0 1.0165 g = 1.8257 -0.7332 y = 0.4516 -0.7213 x = 0.7097 0.3871 0.0645 -0.2581 Arnoldi算法所得结果GMRES算法所得结果 0.8000 0.4000 -0.0000 -0.4000 0.7097 0.3871 0.0645 -0.2581 8.解:利用matlab计算源程序: u=zeros(20,1); for m=1:20 n=100; b=ones(100,1); x0=zeros(100,1); x0(1,1)=1; h=zeros(m,m); A=zeros(100,100); for i=1:100 A(i,i)=2; end for i=2:100 A(i,i-1)=-1; A(i-1,i)=1; end r0=b-A*(x0); v(:,1)=r0/norm(r0); for j=1:m for i=1:j h(i,j)=dot(v(:,i),A*v(:,j)); end q=zeros(n,1); for i=1:j q=q+h(i,j)*v(:,i); end r(:,j)=A*v(:,j)-q; h(j+1,j)=norm(r(:,j)); v(:,j+1)=r(:,j)/h(j+1,j); end v=v(:,1:m); h=h(1:m+1,:); g=zeros(m+1,1); g(1,1)=norm(r0); for i=1:m W=eye(m+1); s=h(i+1,i)/h(i,i); c=s*s; c=1+c; c=1/c; c=sqrt(c); s=s*c; W(i,i)=c; W(i+1,i+1)=c; W(i,i+1)=s; W(i+1,i)=-s; h=W*h; g=W*g; end h=h(1:m,:); g=g(1:m,:); y=inv(h)*g; x=x0+v*y; u(m,1)=norm(b-A*x) end semilogy(u,'k--','MarkerSize',6,'LineWidth', 2) title('利用GMRES(m)求解所得残余向量的二范数(||r||)随m变化示意图') xlabel('m') ylabel('||r||') 所得结果: ||r||=1.5623 m=1 0.86362 m=2 0.27691 m=3 0.12772 m=4 0.049607 m=5 0.021147 m=6 0.0086574 m=7 0.0035917 m=8 0.0014937 m=9 0.00061425 m=10 0.00025673 m=11 0.00010526 m=12 4.4069e-005 m=13 1.8049e-005 m=14 7.562e-006 m=15 3.0955e-006 m=16 1.2974e-006 m=17 5.309e-007 m=18 2.2259e-007 m=19 9.1054e-008 m=20 由此可见,此题中,随着m的增大,||r||趋近于零,利用GMRES求得的解趋向于准确值。