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