高斯-赛德尔迭代法的算法及程序设计

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

题目:高斯-赛德尔迭代法的算法及程序设计
摘要
本文通过理论与实例对线性方程组的解法、收敛性及误差分析进行了探讨.在对线性方程组数值解法的讨论下用到了高斯-赛德尔迭代法,进一步研究和总结了高斯-赛德尔迭代法的理论与应用,使我们在分析问题与编辑程序时能更好的把握对高斯-赛德尔迭代法的应用。

关键词 Gauss-Seidel迭代法;收敛性;误差分析;流程图;Mathematica编程
目录
第一章高斯-赛德尔迭代法 (1)
§1.1 高斯-赛德尔迭代法的提出 (1)
§1.1.1 高斯-赛德尔迭代法的思想理论 (1)
§1.1.2 高斯-赛德尔迭代法的定义及表达形式 (2)
§1.2 高斯-赛德尔迭代法的收敛性 (1)
§1.3 高斯-赛德尔迭代法的误差分析 (1)
第二章高斯-赛德尔迭代法的程序设计 (1)
§2.1 高斯-赛德尔迭代法在上机中的应用 (1)
§2.1.1 高斯-赛德尔迭代法的流程图 (1)
§2.1.2 高斯-赛德尔迭代法的源程序 (1)
参考文献 (22)
附录 (23)
第一章 高斯-赛德尔迭代法
考虑线性方程组
Ax b =
其中为非奇A 异矩阵,对于由工程技术中产生的大型稀疏矩阵方程组(A 的阶数很大n 但零元素很多),利用迭代法求解线性方程组是合适Ax b =的.在计算机内存和运算两方面,迭代法通常都可利用中A 有大量零元素的特点.
本章将介绍迭代法中的高斯-赛德尔法的思想理论、收敛性及误差分析.
§1.1 高斯-赛德尔迭代法的提出
§1.1.1 高斯-赛德尔迭代法的思想理论
在研究雅可比迭代法时,计算1k i x +时,已得(1)(1)
(1)
12
1
,,,k k k i x x x +++-(这些分别为121,,,i x x x -的第k+1次近似),Gauss-Seidel 迭代法认为在计算时启用新值,从而产

1(1)
(1)
()11
1()i n
k k k i
i ij j ij j j j i ii x
b a x a x a -++==+=--∑∑. 具体原理如下图所示
()k x →→→
图1.1 基本迭代原理
§1.1.2 高斯-赛德尔迭代法的定义及表达形式
定义1.1 我们注意到在雅可比迭代法中并没有对新算出的分量11k x +,12k x +,,
11k i x +-进行充分利用.不妨设想,在迭代收敛的条件下,我们把
(1)()()()
1
1211331111
(1)()()()
2
2112332222
(1)()()()
1122,111()1(1(k k k k n n k k k k n n k k k k n
n n n n n nn x a x a x a x b a x a x a x a x b a x a x a x a x b a +++--⎧=---+⎪⎪
⎪=---+⎪⎨⎪⎪
⎪=---+⎪

式中第一个方程算出的11k x +立即投入到第二个方程中,代替进行计()1k x 算,当算出后
代1
2k x +替马上投入()2k x 到第三个方程中计算,依次进行下去,这样也许会得到更好的收
敛效果.根据这种思路建立的一种新的迭代格式,我们称为高斯-赛德尔(Gauss-Seide l )迭代公式,
高斯=赛德尔迭代法的分量形式:
(1)()()()
11211331111(1)(1)()()
221123322
22(1)(1)(1)(1)
1122,111()1(1(k k k k n n k k k k n n k k k k n
n n n n n nn x a x a x a x b a x a x a x a x b a x a x a x a x b a +++++++--⎧=---+⎪⎪
⎪=---+⎪⎨
⎪⎪
⎪=---+⎪

高斯-赛德尔迭代法的矩阵形式:
(1)(),(0,1,2,)k k x Bx f k +=+=
其中
1()B D L U -=-,1()f D L b -=-
B 称为高斯-赛德尔迭代矩阵,f 称为高斯-赛德尔迭代常量..
§1.2 高斯-赛德尔迭代法的收敛性
根据上节所述,高斯-赛德尔迭代法的迭代格式为
(1)(),(0,1,2,)k k x Bx f k +=+= (1-1)
其中
1()B D L U -=-,1()f D L b -=- .
本节要讨论的问题就是任意选取初始值(0)x ,利用迭
代格式(1-1)得到的向量序列是否一{}()k x 定收敛,如果收敛的话需要满足什么条件? 下面我们给出一般迭代收敛的条件:
定理1.2 简单迭代法(1-1)收敛的充分必要条件是迭代矩阵的B 谱半径()1B ρ<. 定理1.3 若迭代矩阵B 的某种范数1<B 则(1-2-1)确定的迭代法对任意初值均收敛于(0)X 方程组的唯x Bx f =+一解*x 。

特殊线性方程组迭代法的收敛性定理:
定理1.4 设对于方程组Ax b =,若系数矩阵A 是严格对角占优矩阵,则 (1)A 非奇异.
(2)Gauss-Seidel 迭代法收敛.
定理1.5 若系数矩阵A 对称正定,则Gauss-Seidel 迭代公式收敛. 例1.1 已知方程组
1231231232211221
x x x x x x x x x +-=⎧⎪
++=⎨⎪++=⎩, 用Gauss-Seidel 迭代法解此方程组的收敛性.
方程组的系数矩阵
122111221A -⎡⎤
⎢⎥=⎢⎥
⎢⎥⎣⎦, 所以有
111D ⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦,010220L ⎡⎤⎢⎥=-⎢⎥⎢⎥--⎣⎦,022010U -⎡⎤⎢⎥=-⎢⎥
⎢⎥⎣⎦ 1
1100022()11
0012210G B D L U ---⎡⎤
⎡⎤
⎢⎥⎢⎥=-=-⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦
⎣⎦
=02
2232-⎡⎤⎢⎥-⎢⎥⎢⎥⎣
⎦ 22det()02
3
2
G I B λ
λλλ--=--,

1230,2λλλ===
故()21B λ=>,因此Gauss-Seidel 迭代法不收敛.
§1.3 高斯-赛德尔迭代法的误差分析
科学计算的主要过程是:对给定的实际问题建立数学模型,通过已获得的有关基本数据,建立近似数值方法,设计算法编制程序,最后上机进行数值计算得到数值结果.其大致过程如下图:
图1.2 误差分析表
定义1.2 假设某一量的标准值为x 近似解为*x ,则与之差叫x *x 做近似解的x 绝对误差(简称误差),记为()x ε,即
*()x x x ε=-
定义1.3 绝对误差与准确值之比
*
()
(),0i x x x x x x x
εε-=-≠
称为的相对*x 误差.
定理 1.6 设是方程组*x Ax b =的同解方程x Bx f =+的准确解,若迭代公式
(1)()k k x Bx f +=+中迭代矩阵B 的某种范数1<=q B ,则有
1))1()(*)
(1---≤
-k k k X X q
q
X X
2))0()1(*
)
(1X X q
q X
X
K k --≤-
第二章高斯-赛德尔迭代法的程序设计第二章高斯-赛德尔迭代法的程序设计20世纪50年代是用数字计算机求解电力系统
潮流问题的开始阶段,人们普通采用以节点导纳矩阵为基础的高斯-赛德尔迭代法.此方法原理简单,占用内存量较小,编程容易实现,特别是对于配网潮流有其独特优势.但是此算法也有着其致命缺点那就是收敛速度比较慢,尤其是随着电力系统的发展。

网络中的节点增多,这个问题将会更加突出.
本章将研究高斯-赛德尔迭代法的流程图及程序应用.
§2.1 高斯-赛德尔迭代法在上机中的应用
§2.1.1 高斯-赛德尔迭代法的流程图
在实际应用中,有时需解决的问题中运算很复杂且运算量也很大,这时我们就需要借助计算机的帮助解决实际问题,即利用高斯-赛德尔迭代法在C语言中的编程实现.高斯-赛德尔迭代法在计算机中的主要实现过程如下图所示
图2.3 高斯-赛德尔迭代法流程图
§2.1.2高斯-赛德尔迭代法在计算机中的应用
在C 语言环境中解线性方程组的问题需要进行程序编辑,如果解决每一个线性方程组都需要重新编辑程序,就没体现计算机语言的简便性,所以需要一个程序使其对大多数问题都适用.
例2.1 设方程组的Ax b =系数矩阵的对角线元素(1,2,
,)i n =,M 为迭代次数容
许的最大值,ε为容许误差。

1 取初始向量令k=0. 2 对i=1,2,…,n 计算
3 如果则输出结束;否则执行4
4 如果则不收敛,终止程序;否则,转2 源程序:
#include <stdio.h> #include <math.h> #define N 600 void main() {
int i;
double x[4];
double c[4][5]={10,-1,2,0,-11,0,8,-1,3,-11,2,-1,10,0,6,-1,3,-1,11,25}; void GaussSeidel(double *,int,double[]); GaussSeidel(c[0],4,x);
for(i=0;i<=3;i++)
printf("x[%d]=%f\n",i,x[i]);}
void GaussSeidel(double *a,int n,double x[])
{
int i,j,k=1; double d,dx,eps; for(i=0;i<=3;i++) while(1) {eps=0;
for(i=0;i<=3;i++) { d=0;
for(j=0;j<=4;j++) {
if(j==i)continue;
d+=*(a+i*(n+1)+j)*x[j]; }
dx=(*(a+i*(n+1)+n)-d)/(*(a+i*(n+1)+i));
eps+=fabs(dx-x[i]);
x[i]=dx;
}
if(eps<1e-6)
{printf("迭代次数是:%d\n",k);return;}
if(k>N)
{
printf("迭代发散n\n");
return;
}
}
}
输出结果
结果分析:
从输出结果可以看出此方程组的迭代次数为1,此时能得到精确结果是
x[0]=-1.467391,x [1]=-2.358696,x[2] =0.657609,x[3] =2.842391
从结果和原有知识可以知道其系数矩阵是严格对角占优的。

所以此迭代解法有很好的收敛性.
参考文献
[1] 贺俐、陈桂兴.计算方法[M].武汉水利电力大学出版社.1998-8-1
[2] 袁慰平等.计算方法与实习[M].东南大学出版社.2000-7-1
[3] 徐士良.数值方法与计算机实现[M].清华大学出版社.2006-2-1
[4] 李炳钊.数值分析基础[M].上海:同济大学出版,1998.
[5] 张光澄. 实用数值分析[M].四川:四川大学出版,2004.
[6] 刘春凤.应用数值分析[M].北京: 冶金工业出版社,2005
附录 C语言编程
源程序
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#define N 3
main()
{
int i,j,k,s;
float a[N][N]={0},L[N][N]={0},U[N][N]={0},sigma1,sigma2;
for(i=0;i<N;i++)
{
L[i][i]=1;
}
for(i=0;i<N;i++)
{
printf("请输入矩阵第%d行元素:\n",i+1);
for(j=0;j<N;j++)
scanf("%f",&a[i][j]);
}
for(i=0;i<N;i++)
{
U[0][i]=a[0][i];
L[i][0]=a[i][0]/U[0][0];
}
for(k=1;k<N;k++)
{
for(j=k;j<N;j++)
{
sigma1=0;
for(s=0;s<=k-1;s++)
sigma1+=L[k][s]*U[s][j];
U[k][j]=a[k][j]-sigma1;
}
for(i=k;i<N;i++)
{
sigma2=0;
for(s=0;s<=k-1;s++)
sigma2+=L[i][s]*U[s][k];
L[i][k]=(a[i][k]-sigma2)/U[k][k];
}
}
printf("a矩阵为:\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%5.1f ",a[i][j]);
printf("\n");
}
printf("L矩阵为:\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%5.1f ",L[i][j]);
printf("\n");
}
printf("U矩阵为:\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%5.1f ",U[i][j]);
printf("\n");
}
}。

相关文档
最新文档