GaussSeidel迭代法求解线性方程组.docx
《GaussSeidel迭代法求解线性方程组.docx》由会员分享,可在线阅读,更多相关《GaussSeidel迭代法求解线性方程组.docx(11页珍藏版)》请在冰点文库上搜索。
![GaussSeidel迭代法求解线性方程组.docx](https://file1.bingdoc.com/fileroot1/2023-6/24/04e8bf99-9b77-4466-8c09-442349e34443/04e8bf99-9b77-4466-8c09-442349e344431.gif)
GaussSeidel迭代法求解线性方程组
一.问题描述
用Gauss-Seidel迭代法求解线性方程组
由Jacobi迭代法中,每一次的迭代只用到前一次的迭代值。
使用了两倍的储藏空间,浪
费了储藏空间。
若每一次迭代充分利用当前最新的迭代值,即在计算第
i个重量xi(k1)
时,
用最新重量x1
,x2
(k1)
(k)
(k1)
(k1)
xi-1代替旧重量x1(k),x2
(k)
xi-1,可以起到节约储藏
空间的作用。
这样就获取所谓解方程组的
Gauss-Seidel迭代法。
二.
算法设计
将A分解成A
L
D
U,则Ax
b等价于(LD
U)x
b
则Gauss-Seidel迭代过程
Dx(k1)bLx(k1)Ux(k)
故
(DL)x(k1)bUx(k)
若设(DL)1存在,则
x(k1)(DL)1Ux(k)(DL)1b
令
G(DL)1U,f(DL)1b
则Gauss-Seidel迭代公式的矩阵形式为
x(k1)Gx(k)f
其迭代格式为
x(0)
(x1(0),x2(0),,xn(0))T
(初始向量),
(i1)1
xi(bi
也许
xi(k1)xi(k)
xi(i1)
i1
i1
aijx(jk1)
aijx(jk))(k0,1,2,;i
0,1,2,n)
j1
ji1
xi
(kk0,1,2,;i
0,1,2,n)
1(bi
i1
i1
aijx(jk1)
aijx(jk))
aii
j1
ji1
三.程序框图
开始
读入数据n,初始向量,增广矩阵
1k
i1
i1
(bi
aijx(jk1)
aijx(jk))/aiiyi
j1
ji1
maxxiyi?
k1k
yixik=N
i1,2,3,n
输出迭代失
败标志
结束
四.结果显示
TestBench
利用Gauss-Seidel迭代法求解以下方程组
5x1
2x2
x3
12
x1
4x2
2x3
20,
其中取x(0)
1。
2x1
3x2
10x3
3
输出
y1,y2yn
运行程序
依次输入:
1.方阵维数
2.增广矩阵系数
3.初始向量
获取:
迭代12次后算出
x[1]=
x[2]=
x[3]=
五.程序
#include<>
#include<>
#include<>
#include<>
#defineMAX_n100
#definePRECISION
#defineMAX_Number1000
voidVectorInput(floatx[],intn)//输入初始向量
{
inti;
for(i=1;i<=n;++i)
{
printf("x[%d]=",i);
scanf("%f",&x[i]);
}
}
voidMatrixInput(floatA[][MAX_n],intm,intn)//输入增广矩阵
{
inti,j;
printf("\n输入系数矩阵:
\n");
for(i=1;i<=m;++i)
{
printf("增广矩阵行数%d:
",i);
for(j=1;j<=n;++j)
scanf("%f",&A[i][j]);
}
}
voidVectorOutput(floatx[],intn)
{
//输出向量
inti;
for(i=1;i<=n;++i)
printf("\nx[%d]=%f",i,x[i]);
}
intIsSatisfyPricision(floatx1[],floatx2[],intn)//判断可否在规定精度内
{
inti;
for(i=1;i<=n;++i)
if(fabs(x1[i]-x2[i])>PRECISION)return1;
return0;
}
intJacobi_(floatA[][MAX_n],floatx[],intn)
{
//详尽计算
floatx_former[MAX_n];
inti,j,k;
printf("\n初始向量x0:
\n");
VectorInput(x,n);
k=0;
do{
for(i=1;i<=n;++i)
{
printf("\nx[%d]=%f",i,x[i]);
x_former[i]=x[i];
}
printf("\n");
for(i=1;i<=n;++i)
{
x[i]=A[i][n+1];
for(j=1;j<=n;++j)
if(j!
=i)x[i]-=A[i][j]*x[j];if(fabs(A[i][i])>PRECISION)
x[i]/=A[i][i];
else
return1;
}
++k;
}while(IsSatisfyPricision(x,x_former,n)&&kif(k>=MAX_Number)
return1;
else
{
printf("\nGauss-Seidel迭代次数为%d次",k);
return0;
}
}
intmain()//主函数
{
intn;
floatA[MAX_n][MAX_n],x[MAX_n];
printf("\n方阵维数n=");
scanf("%d",&n);
if(n>=MAX_n-1)
{
printf("\n\007nmust<%d!
",MAX_n);
exit(0);
}
MatrixInput(A,n,n+1);
if(Jacobi_(A,x,n))
printf("\nGauss-Seidel迭代失败!
");
else
{
printf("\n结果:
");
VectorOutput(x,n);
}
printf("\n\n\007Pressanykeytoquit!
\n");
getch();
}