您的当前位置:首页正文

高斯-赛德尔迭代

来源:帮我找美食网


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

学生姓名: 专 业: 学 号: 完成日期:

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

7x1x22x310 利用高斯-赛德尔迭代法求解线性方程组 x18x22x38

2x2x9x62312 实验步骤

2.1 算法原理

高斯-赛德尔迭代是计算

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

(j1,2,...,i1).高斯-赛德尔迭代法可以看作雅克比迭代法的一种改进.高斯-赛

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

2.2 算法步骤

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

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

(0)x,初始向量(2.4) (k1)(k)Bxf,k0,1,...,x1111其中BI(DL)A(DL)UG,f(DL)b.称G(DL)U为解

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

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

x(k)(x1,...,xi(k)(k),...,xn)

(k)T由(2.4)式有

(DL)x或

Dx(k1)(k1)Ux(k)b,

Lx(k1)Ux(k)b,

i1nij aiix(k1)ibiaj1x(k1)jaji1ijxj,i1,2,,...,n.

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

(0)Tx(0)(x1(0),,xn)i1(k1)(k1)(biaiixjxij1i1,2,,nk0,1,.naji1ij(k)xj)/aii

2.3 程序流程图

开始 输入数据 yixixii1,2,...,nk1 (0) yi(biajiijyj)/aii i1,2,...,n.maxyixi?1in输出y1,y2,...,yn kk1xiyii1,2,...,n输出错误 kN? 结束

3 实验结果分析

4 实验结论

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

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

(j1,2,...,i1),高斯-赛德尔迭代法可以看作雅克比迭代法的一种改进.

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\

printf(\"\\n\");

}

k=k+1;

}

while(eps1>1e-3);

printf(\"迭代 %d 次\ }

void gaosi() {

int i,j; float b[m*m];

printf(\"请输入一个矩阵a:\\n\"); for(i=0;i<=m-1;i++)

}

{

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

{

scanf(\"%f\ a[i][j]=b[j+i*m];

}

}

printf(\"请输入矩阵b\\n\"); for(i=0;i<=m-1;i++) }

scanf(\"%f\

因篇幅问题不能全部显示,请点此查看更多更全内容

Top