高斯-赛德尔迭代

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验题目:数值分析之高斯-赛德尔迭代

学生姓名:

专业:

学号:

完成日期:

实验题目: 数值分析之高斯-赛德尔迭代 学生姓名: 学号: 完成日期: 2011.10.21 1 实验目的

利用高斯-赛德尔迭代法求解线性方程组 ⎪⎩⎪

⎨⎧=++=++=++6

9228281027321

321321x x x x x x x x x

2 实验步骤

2.1 算法原理

高斯-赛德尔迭代是计算

1

(+k x

的第i 个分量)1(+k i x ,利用了已经计算出得最新分量

)1,...,2,1()

1(-==+i j x k j

.高斯-赛德尔迭代法可以看作雅克比迭代法的一种改进.高斯-赛

德尔迭代法没迭代一次只需计算一次矩阵与向量的乘法

2.2 算法步骤

选取分裂矩阵M 为A 的下三角部分,即选取L D M -=(下三角矩阵),N M A -=,

于是得到解b Ax =的高斯-赛德尔(Gauss-Seidel )迭代法

⎩⎪⎨⎧=+=+,...,1,0,,)

()

1()0(k f Bx x

x k k 初始向量

(2.4) 其中.)(,)()(1

1

1

b L D f G U L D A L D I B ----=≡-=--=称U L D G 1

)(--=为解

b Ax =的高斯-赛德尔迭代法的迭代矩阵.

下面给出高斯-赛德尔迭代法的分量计算公式.记

T

k n k i

k k x x x x

),...,,...,()()

()(1)

(=

由(2.4)式有

,)()

()

1(b Ux

x L D k k +=-+

,)

()

1()

1(b Ux

Lx

Dx

k k k ++=++

∑∑-=+=++=-

-

=11

1

)

()1()1(.,...,,2,1,i j n

i j k j ij

k j

ij

i k i

ii n i x a

x

a

b x a

于是解b Ax =的高斯-赛德尔迭代法计算公式为

()()⎪⎪

⎪⎪⎨⎧==--==∑∑+=-=++.,1,0,,2,1/)(),,(1

)

(11)

1()1()0()0(1)0( k n i a x a

x a b x x x x ii n

i j k j ij

i j k j ii i k i

T

n

2.3 程序流程图

3 实验结果分析

4 实验结论

高斯-赛德尔迭代法是计算

1

(+k x

的第i 个分量)

1(+k i

x ,利用了已经计算出得最新分量

)1,...,2,1()

1(-==+i j x k j

,高斯-赛德尔迭代法可以看作雅克比迭代法的一种改进.

5 实验心得体会

此次实验,我体会到了计算机与数学的紧密联系--利用计算机解决复杂的数学问题。

参考文献

白峰杉.数值分析引论.北京:高等教育出版社,2004.

李庆扬,王能超,易大义.数值分析.武汉:华中理工大学出版社,1986.

附录(源代码)

#include "stdio.h" #include "math.h" # define m 3 float a[m][m];

float c[m];

void gaosi();

void main()

{

int i,j;

float x[m],x1[m],eps[m];

float s=0;

float t=0;

int p=1;

int q=1;

int k=0;

float eps1;

gaosi();

for(i=0;i<=m-1;i++)

{

for(j=0;j<=m-1;j++)

{

s=float(s+fabs(a[i][j])); t=float(t+fabs(a[j][i])); }

q=q&&(s<2*fabs(a[i][i])); p=p&&(t<2*fabs(a[i][i])); s=0;

t=0;

}

if((p+q)==0)

printf("ERROR!");

else

{

for(i=0;i<=m-1;i++)

{

x[i]=0;

x1[i]=0;

}

do

{

eps1=x[0]-x1[0];

for(i=0;i<=m-1;i++)

{

for(j=0;j<=m-1;j++) s=s+a[i][j]*x[j]; x[i]=(c[i]+a[i][i]*x[i]-s)/a[i][i]; s=0;

eps[i]=float(fabs(x[i]-x1[i]));

x1[i]=x[i];

eps1=(eps1>eps[i])?eps1:eps[i];

printf("x%d=%f",i,x[i]);

printf("\n");

}

k=k+1;

}

while(eps1>1e-3);

printf("迭代 %d 次",k);

}

}

void gaosi()

{

int i,j;

float b[m*m];

printf("请输入一个矩阵a:\n");

for(i=0;i<=m-1;i++)

相关文档
最新文档