[报告要求]
1.用 Matlab(或c)语言或你熟悉的其他算法语言编程序,使之尽量具有通用性。
2.完成计算后写出计算实验报告,内容包括:计算机型号和所用机时,算法步骤描述,变量说明,程序清单,输出计算结果,结果分析和小结。
3.实习时间: 09年12月19日----09年12月21日。
[实习题目一]
给定方程组
[实习要求]
1用G-S迭代法解该方程组,取初值X(0)=(0,0,0)T迭代到‖x(k+1)-x(k)‖∞≤10-4为止
2讨论迭代法的收敛性
3输出迭代矩阵BG迭代公式,迭代次数及计算结果表[算法描述]
- 运用LU分解得到L矩阵和U矩阵,将方程组转化为LUX=b,令UX=Y,原方程组转化为LY=b和UX=Y,最后解的原方程组得解X。
- 用打印函数输出系数矩阵A,b,L,U,X和行列式A的值。
- 根据矩阵条件数估计的定义,通过程序解得
。
[程序清单]
function [x,k]=GassSeidelMathod(A,b)
k=1;
while k>=1
x=GSM(A,b,k);
y=x(:,k+1)-x(:,k);
f=fanshu(y);
if f<=0.0001
break;
else
k=k+1;
end
end
function x=GSM(A,b,k)
n=length(A);x(1:3,1)=[0 0 0]';
for i=1:n
sum1=0;sum2=0;
for m=1:i-1
sum1=sum1+A(i,m)*x(m,k);
end
for m=i+1:n
sum2=sum2+A(i,m)*x(m,k);
end
x(i,k+1)=(b(i)-sum1-sum2)/A(i,i);
end
function max=fanshu(y)
n=length(y);
for i=1:2
max=y(1);
if y(i+1)>y(i)
max=y(i+1);
end
end
function Convergence(A)
k=0;
[m,n]=size(A);
for i=1:m
sum(i)=0;
for j=1:n
sum(i)=sum(i)+abs(A(i,j));
end
sum(i)=sum(i)-abs(A(i,i));
if abs(A(i,i))>=sum(i)
k=k+1;
end
end
if k==3
'G-S迭代法收敛'
else
'G-S迭代法不收敛'
end
function hanshu1(A,b,v1)
D=diag(v1);L=-tril(A-D);
U=-triu(A-D);B=inv(D-L)*U
f=inv(D-L)*b
[输出结果]
[实习题目二]
, 即 AX=b
[实习要求]
1用平方根法解上述方程组。
2讨论当b 有微小变化,即 b+
b=(-4.02, 3.5, 10)
时,A是否为病态矩阵。给出讨论结果。
3输出分解矩阵L’及解向量 X和 detA。
[程序清单]
function [L,U]=lu(A)
U(1,j)=A(1,j);
if j>=2
L(j,1)=A(j,1)/U(1,1);
elseif j>=i
for k=1: i-1
sum=0;
sum=sum+L(i,k)*U(k,j);
end
U(i,j)=A(i,j)-sum;
elseif i<=j
for k=1:j-1
sum=0;
sum=sum+L(i,k)*U(k,j));
end
L(i,j)=(A(i,j)-sum;
else
break;
end
function x=gauss(A)
[L,U]=lu(A);
x=abs(U(1,1)*U(2,2)*U(3,3))
function Pathological(A)
FS1=fanshu(A);
B=inv(A);
FS2=fanshu(B);
FS=FS1*FS2;
if FS>10
'A为病态矩阵'
else
'A不是病态的'
end
function FS=fanshu(A)
for i=1:3
sum(i)=0;
for j=1:3
sum(i)=sum(i)+A(i,j);
end
end
B=[sum(1) sum(2) sum(3)]';
FS=B(1);
for k=1:3
if B(k)>FS
FS=B(k);
kFS=k;
end
end;
function L=average(A)
for i=1:3
sum=0;
for j=1:i
if i==j
for k=1:j-1
sum=sum+L(i,k)^2;
end
L(i,j)=sqrt(A(i,j)-sum);
elseif j<i
for k=1:j-1
sum=sum+L(i,k)*L(j,k);
end
L(i,j)=(A(i,j)-sum)/L(j,j);
else
break;
end
end
end
function [l,x]=SymPos1(A,b)
L= SymPos2 (A)
l=L';y=inv(L)*b;
x=inv(l)*y;
function L= SymPos2(A)
N = size(A);
n = N(1);
L(1,1) = sqrt(A(1,1));
L(2:n,1) = A(2:n,1)/L(1,1); %L的第一列
for k=2:n
L(k,k) = sqrt(A(k,k)-L(k,1:(k-1))*transpose(L(k,1:(k-1))));
%L的对角元素
for i=(k+1):n
L(i,k) = (A(i,k)-L(i,1:(k-1))*transpose(L(k,1:(k-1))))/L(k,k);
%L的第k列
end
end
[输出结果]
[总结]
通过这次课程实习,我对数值分析这门课的有了一定的认识,初步掌握了GS迭代法、LU分解法、和牛顿求根法等的运用,这对我以后对专业课程的学习有很大的帮助。同时对计算机程序语言,如C语言编程和数学软件MATLAB的应用有了一定的认识了和深入,使我在遇到学习上的困难时可以自己解决。我也将继续努力学习专业知识。
[参考文献]
[1]李庆扬著.数值分析基础教程.高等教育出版社.2004年2月
[2]苏小红等编著.C语言程序设计教程.电子工业出版社.2002年1月
[3]严蔚敏,吴伟明.数据结构(C语言版).清华大学出版社.1997年4月
[4]胡良剑,孙晓君。MATLAB数学实验,高等教育出版社.2006年6月