当前位置:文档之家› 数值计算方法实验5

数值计算方法实验5

1
实验报告
学院(系)名称:
姓名 学号 专业
班级 实验项目 线性方程组的解法
课程名称 数值计算方法 课程代码
实验时间 实验地点
批改意见:
成绩

教师签字:
实验目的:
编写列选主元高斯消去法、雅可比和高斯-塞德尔迭代法的算法程序,上机调试通过。
实验环境:
硬件环境:IBM-PC或兼容机
软件环境:Windows操作系统
编程语言:C语言
实验内容:
一. 用列主元高斯消去法求解下列线性方程组

二. 用高斯-塞德尔迭代方法求解线性方程组
要求误差为
实验步骤:
一.列主元高斯消去法
高斯消去法分为消元过程与回代过程,消元过程将所给方程组加工成上三角形方程组,再经回代
过程求解

列选主元法
1. 列选主元是当消元到第k步时,从k列的akk以下(包括akk)的各元素中选出绝对值最大的,
然后通过行交换将其交换到akk的位置上。交换系数矩阵中的两行(包括常数项),只相当于两个方
程的位置交换了,因此列选主元不影响求解的结果
2. 列选主元比全选主元的运算量小,但一般可以满足精度要求,所以列选主元更常被采用
3. 在列主元消去法中,未知数仍然是顺序地消去的,但是把各方程中要消去的那个未知数的系
数按绝对值最大值作为主元素,然后用顺序消去法的公式求解
列主元高斯消去法的流程图:

主程序部分 列选主元部分


52262342321321321xxx
xxx
xxx



7910431017210424321321321xxx
xxx
xxx

51021

2

二.高斯-塞德尔迭代法
高斯-塞德尔迭代法的思想
1. 迭代收敛时,新值xi (k+1) 比老值xi (k) 更准确
2. 算出新值xi (k+1)后,用新值xi (k+1)代替用于后面计算的老值xi (k) ,使每次迭代计算,都
是利用“最新求解信息”
3. 这样,必然会使迭代求解的速度加快
高斯-塞德尔(Seidel)迭代公式

),,2,1(,)(11)(11)1()1(nixaxabax
nijkjijijkjijiiiki



高斯-塞德尔迭代的流程图

实验结果:
一. 列主元消去法
输入各个数据,最终使用列选主元法,得到结果为:
x1=x2=x3=1
二. 高斯-赛德尔迭代法
输入各个数据,输出每一步迭代数据,最终结果为:x1=0.285716,x2=2.142855,x3=-3.285712

附录(源程序及运行结果)
一. 列主元高斯消去法
#include
#include
void print(double a[3][3],int n,double b[3]){
printf("输出矩阵:\n");
for(int i=0;ifor(int j=0;jprintf("%lf ",a[i][j]);
printf("%lf",b[i]);
printf("\n");
}
}
void liezhuyuan(double a[3][3],double b[3],int k,int n){
double d,t;
int l=k,i=k+1;
d=a[k][k];
while(i!=n){
if(fabs(a[i][k])>fabs(d)){
d=a[i][k];
l=i;
}
i++;
}
printf("选出主元:%lf\n",d);
if(d==0)
printf("矩阵奇异!\n");
else if(l!=k){
for(int j=k;jt=a[l][j]; a[l][j]=a[k][j]; a[k][j]=t;
}
t=b[l]; b[l]=b[k]; b[k]=t;
}
}
void main(){
double a[3][3]={2,1,1,1,3,2,1,2,2},
b[3]={4,6,5};
int k=0,i,j,n=3;
3

print(a,n,b); while(k!=n-1){ liezhuyuan(a,b,k,n); for(i=k+1;i=0;i--){ for(j=i+1;j #include void main(){ double a[3][3]={4,-2,-4,-2,17,10,4,10,9}, b[3]={10,3,-7},x[3]={0,0,0},t,s,e,e0=0.000005;
int n=3,i;
do{
e=0;
i=0;
do{
t=x[i];
s=0;
for(int j=0;jif(j!=i)
s=s+a[i][j]*x[j];
x[i]=(b[i]-s)/a[i][i];
if(fabs(x[i]-t>e))
e=fabs(x[i]-t);
i++;
}while(i!=n);
for(i=0;iprintf("%lf ",x[i]);
printf("\n");
}while(e>e0);
}
运行结果:

相关主题