高斯-赛德尔算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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<n
Y
N
Y
开始
|x i+1-x i ︳ <m
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<n;i++)
{
printf("行%d:",i+1);
for(j=0;j<n;j++)
scanf("%f",&a[i][j]); /*二维数组分配值*/ }
printf("请输入常量向量b:");
for(i=0;i<n;i++)
scanf("%f",&b[i]); /*一维数组分配值*/
printf("联合矩阵为:\n");
for(i=0;i<n;i++) /*将数组结合,检验输入是否有误*/
{
for(j=0;j<n;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<n;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<n;i++)
x2[i]=x[i];
for(i=0;i<n;i++)
{
tmp1=0.0;
tmp2=0.0;
for(j=0;j<i;j++)
tmp1+=a[i][j]*x[j];
for(j=i+1;j<n;j++)
tmp2+=a[i][j]*x2[j];
x[i]=(b[i]-tmp1-tmp2)/a[i][i];
}
for(i=0,j=0;i<n;i++)
if(fabs(x2[i]-x[i])<m) j++; /*求解两向量差的范数*/ if(j==n)
{
printf("\n Gauss-Seidel 迭代已完成!");
printf("最终迭代次数: %d",k+1);
break;
}
if(k==499)
{
printf("\n此次迭代求解无法完成!");
break;
}
printf("迭代次数: %d \n",k+1 );
for(i=0;i<n;i++)
printf("%12.7f ",x[i] );
printf("\n");
}
printf("\n结果:\n");
for(i=0;i<n;i++)
printf("%12.7f",x[i]);
}
int main()
{
int n;
float x[N],a[N][N],b[N];
printf(" Gauss-Seidel迭代法解线性方程组\n");
printf(" 工作组成员:********* 项波波\n");
printf(" ********* 王兆德\n");
printf(" ********* 魏月圆\n");
printf(" ********* 谢清泉\n");
printf("输入线性方程组行数n:");
scanf("%d",&n);
Table(n,a,b);
init_vec(n,x);
gs(n,a,b,x);
getch();
}
六程序结果
七实验总结
高斯—塞德尔迭代公式计算x i k+1的第i个分量x i k+1时,利用了已经计算出的最新分量x j k+1(j=1,2,……,i-1)。

高斯—赛德尔迭代法可看作雅可比迭代法的一种改进。

高斯—塞德尔迭代法每一次只需要计算一次矩阵与向量的乘法,在一定条件下,收敛速度很快。

相关文档
最新文档