矩阵与数值分析讲解 下载本文

2013级工科硕士研究生

《矩阵与数值分析》课程数值实验题目

一、设SN??j?2N106,分别编制从小到大和从大到小的顺序程序分别计算 j2?1S10000,S1000000

并指出两种方法计算结果的有效位数。 Matlab程序如下:

function [si,sd]=S(N) format long; si=0;sd=0; for j=N:-1:2

si=1.0e6/(j^2-1)+si; end

for j=2:N

sd=1.0e6/(j^2-1)+sd; end end

在matlab命令窗口中输入:[si,sd]=S(10000) 运行结果:si =7.499000049995000e+005

sd =7.499000049994994e+005

在matlab命令窗口中输入:[si,sd]=S(1000000) 运行结果:si =7.499990000005000e+005

sd =7.499990000005200e+0051

结果分析:si为从大到小的顺序求和的值,sd为从小到大的顺序求和的值。当N分别为10000和1000000时,si分别为7.499000049995000e+005和7.499990000005000e+005,可以看出这两个数的有效值均为13位;而sd分别为7.499000049994994e+005和7.499990000005200e+005,这两个数的有效值均为16位。这就出现了我们在矩阵理论课上所学的“大数吃小数”的问题。为了使结果更为精确我们必须避免在四则运算中出现“大数吃小数”的情况,应该按从小到大的顺序进行求和。

二、解线性方程组

1.分别利用Jacobi迭代法和Gauss-Seidel迭代法求解线性方程组Ax?b,其中常向量为?n?1?维随机生成的列向量,系数矩阵A具有如下形式

2?Tn?1?2In?1?In?1????In?1?, A????In?1????In?1Tn?1?2In?1???2?1????1其中T??迭代法计算停止的条件?为n?1阶矩阵,In?1为n?1阶单位矩阵,n?1??1????12??为:xk?1?xk?10,给出n?10,100,1000时的不同迭代步数. ?102求解系数矩阵A和向量b的Matlab程序如下:

function [A,b,x0]=jz(n)

for i=1:n-1 %此处n赋值即可,如n=100 for j=1:n-1 if(i==j)

T(i,j)=2; end

if(i==(j+1)) T(i,j)=-1; end

if(i==(j-1)) T(i,j)=-1; end end end

I=eye(n-1); k=1;

for mm=1:(n-1)

A(k:(k+n-2),k:(k+n-2))=T+2*I; k=k+n-1; end k=1;

for xx=1:(n-2)

A(k:(k+n-2),(k+n-1):(k+2*n-3))=-I; A((k+n-1):(k+2*n-3),k:(k+n-2))=-I; k=k+n-1; end

b=randn((n-1)^2,1); x0=zeros((n-1)^2,1);

Jacobi迭代法Matlab程序如下:

function n=jacobi(A,b,x0) eps= 1.0e-10;

M = 10000;

D=diag(diag(A)); %求A的对角矩阵 L=-tril(A,-1); %求A的下三角阵 U=-triu(A,1); %求A的上三角阵 B=D\\(L+U); f=D\\b; x=B*x0+f;

n=1; %迭代次数 while norm(x-x0)>=eps x0=x;

x=B*x0+f; n=n+1; if(n>=M)

disp('Warning: 迭代次数太多,可能不收敛!'); return; end end

Gauss-Seidel迭代法Matlab程序如下:

function n=gauseidel(A,b,x0) eps= 1.0e-10; M = 10000;

D=diag(diag(A)); %求A的对角矩阵 L=-tril(A,-1); %求A的下三角阵 U=-triu(A,1); %求A的上三角阵 G=(D-L)\\U; f=(D-L)\\b; x=G*x0+f;

n=1; %迭代次数 while norm(x-x0)>=eps x0=x;

x=G*x0+f; n=n+1; if(n>=M)

disp('Warning: 迭代次数太多,可能不收敛!'); return; end end

在matlab命令窗口中输入:

[A,b,x0]=jz(10); J10=jacobi(A,b,x0) G10=gauseidel(A,b,x0) [A,b,x0]=jz(20); J20=jacobi(A,b,x0) G20=gauseidel(A,b,x0)