高斯-赛德尔算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数值计算方法实验报告
班级:09医软1班 指导教师:金力
工作组成员:谢清泉(负责程序主体部分的编写) 魏月圆(负责流程图和实验报告的书写)
项波波(负责程序的调试和修改) 王兆德(负责材料的收集和整理)
一 实验名称
高斯—塞德尔迭代法
二 实验目的
理解高斯塞德尔算法的基本思想,及公式的推导过程,会用此公式解简单线性方程组。 三 实验原理
在雅可比迭代中,总是用前次近似分量x 1(k ),x 2(k )
,..
….x i-1(k)
,x i (k)
, (x)
n
(k)去计算当前分量x i
(
k+1
)
(i=1,2,……,n )。实际上此刻前i-1个分量x 1,x 2,…..x i-1
的新近似值x 1(k+1),x 2(k+1),……x i-1(k+1)代替x 1(k),x 2(k),……
X i-1(k)去计算x i (k+1)可能会得到更满意的效果。据此得到迭代公式就是高斯—塞德尔公式,即
X i
(k+1)
=(b i - 1
1
1
+-=∑k j
i j ij
x
a
- )
(1
k j
n
i j ij
x a
∑+=)/a ii (i=1,2,……n)
四 流程图
输入线性方程行数n ,输入系数矩阵a ,常数矩阵b ,精度m
K=1
i=0
X i
(k+1)
=(b i - 11
1
+-=∑k j
i j ij
x a
- )
(1
k j n
i j ij
x a
∑+=)/a ii X i
i Y N Y 开始 |x i+1-x i ︳ K<10001 输出此次迭代失败 结束 i++ 输出结果 K++ Y N N 五程序代码 #include"string.h" #include"math.h" #define N 100 float Table(int n,float a[N][N],float b[N]) /*定义数组并分配值*/ { int i,j; printf("请输入系数矩阵a:\n"); label:for(i=0;i { printf("行%d:",i+1); for(j=0;j scanf("%f",&a[i][j]); /*二维数组分配值*/ } printf("请输入常量向量b:"); for(i=0;i scanf("%f",&b[i]); /*一维数组分配值*/ printf("联合矩阵为:\n"); for(i=0;i { for(j=0;j printf("%10.5f",a[i][j]); printf("%10.5f",b[i]); printf("\n"); } } float init_vec(int n,float x[N]) /*获取初始值*/ { int i; printf("请输入初始解x:"); for(i=0;i scanf("%f",&x[i]); } float gs(int n,float a[N][N],float b[N],float x[N]) /*迭代的实现*/ { int i,j,k; float m; float tmp1,tmp2,x2[N]; printf("请输入精度m:"); scanf("%f",&m); for(k=0;k<10001;k++) /*设定最大迭代次数不能超过1000*/ { for(i=0;i x2[i]=x[i]; for(i=0;i { tmp1=0.0; tmp2=0.0; for(j=0;j tmp1+=a[i][j]*x[j]; for(j=i+1;j tmp2+=a[i][j]*x2[j]; x[i]=(b[i]-tmp1-tmp2)/a[i][i]; } for(i=0,j=0;i if(fabs(x2[i]-x[i]) { printf("\n Gauss-Seidel 迭代已完成!"); printf("最终迭代次数: %d",k+1); break; } if(k==499) { printf("\n此次迭代求解无法完成!"); break; } printf("迭代次数: %d \n",k+1 ); for(i=0;i printf("%12.7f ",x[i] ); printf("\n"); } printf("\n结果:\n"); for(i=0;i