Gauss-Seidel迭代法求解线性方程组.docx

上传人:b****9 文档编号:144647 上传时间:2022-10-04 格式:DOCX 页数:6 大小:139.44KB
下载 相关 举报
Gauss-Seidel迭代法求解线性方程组.docx_第1页
第1页 / 共6页
Gauss-Seidel迭代法求解线性方程组.docx_第2页
第2页 / 共6页
Gauss-Seidel迭代法求解线性方程组.docx_第3页
第3页 / 共6页
Gauss-Seidel迭代法求解线性方程组.docx_第4页
第4页 / 共6页
Gauss-Seidel迭代法求解线性方程组.docx_第5页
第5页 / 共6页
点击查看更多>>
下载资源
资源描述

Gauss-Seidel迭代法求解线性方程组.docx

《Gauss-Seidel迭代法求解线性方程组.docx》由会员分享,可在线阅读,更多相关《Gauss-Seidel迭代法求解线性方程组.docx(6页珍藏版)》请在冰豆网上搜索。

Gauss-Seidel迭代法求解线性方程组.docx

一.问题描述

用Gauss-Seidel迭代法求解线性方程组

由Jacobi迭代法中,每一次的迭代只用到前一次的迭代值。

使用了两倍的存储空间,浪费了存储空间。

若每一次迭代充分利用当前最新的迭代值,即在计算第个分量时,用最新分量,代替旧分量,,可以起到节省存储空间的作用。

这样就得到所谓解方程组的Gauss-Seidel迭代法。

二.算法设计

将分解成,则等价于

则Gauss-Seidel迭代过程

若设存在,则

则Gauss-Seidel迭代公式的矩阵形式为

其迭代格式为

(初始向量),

或者

三.程序框图

开始

读入数据,初始向量,增广矩阵

k=N?

输出迭代失败标志

结束

输出

四.结果显示

TestBench

利用Gauss-Seidel迭代法求解下列方程组

,其中取。

运行程序

依次输入:

1.方阵维数

2.增广矩阵系数

3.初始向量

得到:

迭代12次后算出

x[1]=-4.0

x[2]=3.0

x[3]=2.0

五.程序

#include

#include

#include

#include

#define MAX_n 100

#definePRECISION 0.0000001

#defineMAX_Number 1000

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)&&k

if(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();

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1