高斯-赛德尔迭代法解线性方程组

  • 格式:doc
  • 大小:170.50 KB
  • 文档页数:6

下载文档原格式

  / 6
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

#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];