高斯-赛德尔迭代法解线性方程组
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数值分析实验五
班级: 10信计二班 学号:59 姓名:王志桃 分数:
一.实验名称
高斯-赛德尔迭代法解线性方程组
二.实验目的
1. 学会利用高斯赛德尔方法解线性方程组
2. 明白迭代法的原理
3. 对于大型稀疏矩阵方程组适用于迭代法比较简单
三.实验内容
利用Gauss-Seidel 迭代法求解下列方程组
⎪⎩⎪⎨⎧=++=-+=+-36123633111420238321
321321x x x x x x x x x , 其中取→=0)0(x 。
四、算法描述
由Jacobi 迭代法中,每一次的迭代只用到前一次的迭代值,若每一次迭代充分利用当前最新的迭代值,即在计算第i 个分量)1(+k i
x 时,用最新分量)1(1+k x ,⋅⋅⋅+)1(2k x )1(1-+k i x 代替旧分量)(1k x ,⋅⋅⋅)(2k x )(1-k i x ,就得到所谓解方程组的Gauss-Seidel 迭代法。
其迭代格式为 T n x x x x )()0()0(2)0(1)0(,,,⋅⋅⋅= (初始向量),
)(11111)()1(
)
1(∑∑-=-+=++--=i j i i j k j ij k j ij i ii i i x a x a b a x )210i 210(n k ⋅⋅⋅=⋅⋅⋅=,,,;,,,
或者写为 ⎪⎩
⎪⎨⎧--=⋅⋅⋅=⋅⋅⋅==∆+=∑∑-=-+=+++)(1)210i 210(1111)(
)1()1()()1(i j i i j k j ij k j ij i ii i i i k i k i x a x a b a x n k k x x x ,,,;,,,
五、 编码
#include
#include
#include
#define MAX_n 100
#define PRECISION 0.0000001
#define MAX_Number 1000
void VectorInput(float x[],int n) //输入初始向量
{
int i;
for(i=1;i<=n;++i)
{
printf("x[%d]=",i);
scanf("%f",&x[i]);
}
}
void MatrixInput(float A[][MAX_n],int m,int n) //输入增广矩阵
{
int i, j;
printf("\n===Begin input Matrix elements===\n");
for(i=1;i<=m;++i)
{
printf("Input_Line %d : ",i);
for(j=1;j<=n;++j)
scanf("%f",&A[i][j]);
}
}
void VectorOutput(float x[],int n) //输出向量
{
int i;
for(i=1;i<=n;++i)
printf("\nx[%d]=%f",i,x[i]);
}
int IsSatisfyPricision(float x1[],float x2[],int n) //判断是否在规定精度内{
int i;
for(i=1;i<=n;++i)
if(fabs(x1[i]-x2[i])>PRECISION) return 1;
return 0;
}
int Jacobi_(float A[][MAX_n],float x[],int n) //具体计算{
float x_former[MAX_n];
int i,j,k;
printf("\nInput vector 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
return 1;
}
++k;
}while(IsSatisfyPricision(x,x_former,n) && k if(k>=MAX_Number) return 1; else { printf("\nG-S %d times!",k); return 0; } } int main() //主函数 { int n; float A[MAX_n][MAX_n],x[MAX_n];