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