高斯-赛德尔迭代法解线性方程组精选.
高斯赛德尔法
的系数矩阵A可逆且主对角元素都不为零,令
)
并将A分解成
A = (A D) + D
Dx = (D A)x + b 从而方程可以写成 x = B1 x + f1 令 B = I D A, f = D b 其中
1 1 1 1
以 B 为迭代矩阵的迭代法 称为雅克比迭代法。
1
x ( k +1) = B1 x ( k ) + f1
(k ) 由雅可比迭代公式可知,在迭代的每一步计算过程中是用x 的全部分量 ( k +1 ) ( k+1) x i 时,已经算出最新的 来计算 x 的 所有分量 , 显然在计算第i个分量 分量,但没被利用。因此,将最新算出来的第k+1次近似加以利用,就 得到了高斯赛德尔迭代法。 A = D L U 将矩阵A分解成 其中 D = diag ( a11 ,a 22 ,..., a nn ) , L ,U 是A的主对角除外的下三角 和上三角部分,于是有 (D L )x = Ux + b
ρ 是迭代矩阵的谱半径(B0中绝对值最大的特征值的绝对值)
首先取 α =1.5,迭代若干次后,有 式中: 为第k 次迭代的节点电压与该节 点前次迭代值的差值的绝对值 U ( m ) U ( m 1) 为所有节点中差值绝对值最大的 ∞ Bso为加速迭代矩阵 再有
U ( m ) U ( m 1)
将上式带入最佳加速因子公式得到近似最佳加 速因子 α 。
x = B2 x + f 2 即 B = (D L ) U , f = (D L ) 其中 以 B2 为迭代矩阵的迭代法 x ( k +1) = B2 x ( k ) + f 2 称为高斯-赛德尔迭代法。
Gauss-Seidel迭代法
G a u s s-S e i d e l迭代法-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN数值分析课程论文姓名:学号:Gauss-Seidel迭代法求解线性方程组摘要线性方程组的求解在许多的工程技术中是一个极为常见的问题,对于线性方程组的求解无论从理论上还是实践应用上都已经成熟.对于一般线性方程组的求解有Gauss消元法为基础的直接法,也有迭代法.其中Gauss-Seidel是一个重要的组成部分.鉴于此,本论文细致地研究了用Gauss-Seidel迭代法求解线性方程组.论文的第一部分先介绍了迭代法求解线性方程组的一般模式,并给出这种迭代法的收敛性条件,Gauss-Seidel迭代法求解线性方程组的基本原理.这一部分是Gauss-Seidel迭代法的理论基础.论文的第二部分给出了Gauss-Seidel迭代法的具体操作步骤,以伪代码的形式细致的描绘如何使用Gauss-Seidel迭代法的求解方程组.同时,为了验证算法的有效性,在这一部分,还引入一个简单的算例,用于MATLAB编程发现计算结果完全正确.论文的第三部分给出了关于Gauss-Seidel迭代法的MATLAB程序,用于计算线性方程组.关键词:Gauss-Seidel迭代法,基本原理,算例,MATLAB程序目录1 Gauss-Seidel迭代法的基本理论 (1)1.1线性方程组的迭代法求解 (1)1.2Gauss-Seidel迭代法的原理 (2)2.具体的算例和操作步骤 (3)2.1. Gauss-Seidel迭代法的伪代码 (3)2.2.具体的算例验证算法的有效性 (3)3.MATLAB程序 (4)参考文献 (6)Gauss-Seidel 迭代法求解线性方程组一. Gauss-Seidel 迭代法的基本理论1.1线性方程组的迭代法求解在考虑求解线性方程组Ax=b 时,其中A 为非奇异矩阵.尽管Guass 消元法通过有限次运算可以求解此问题,其对应的计算复杂度为3O(n ).但是对于工程技术中和某些偏微分方程过程中出现的大型稀疏型矩阵利用迭代法可以更快的收敛,找到解.另外一方面,由于迭代法占用的计算机内存少,且便于计算.这两方面的优势促成了迭代法求解线性方程组的研究.关于迭代法的收敛的几个判定条件 1(迭代法基本原理)设有方程组f Bx x +=,对于任意初始向量()0x 及任意f ,解此方程组的迭代法(即()()f Bx x k k +=+1)收敛的充要条件是()1<B ρ.2(迭代法收敛的充分条件)如果方程组f Bx x +=的迭代公式为()()f Bx x k k +=+1(()0x 为任意初始向量),且迭代矩阵的某一种范数1<=q B v ,则:︒1迭代法收敛;︒2()()()v k k vk x x q qx x 11-*--≤-;︒3()()()v kvk x x q q xx 011--≤-*.定理3 如果mn RA ⨯∈为严格对角占优阵或为不可约弱对角占优阵,则对于任意的()0x ,解方程组b Ax =的Jacobi 迭代法,Gauss-Seidel 迭代法均收敛.定理4如果A 为对称正定矩阵,且20<<ω,则解式b Ax =的SOR 方法收敛.1.2Gauss-Seidel 迭代法的原理由Jacobi方法迭代公式()()()()010k k xx B x f +⎧⎪⎨=+⎪⎩初始向量,可知,迭代的每一步计算过程,都是用()k x 的全部分量来计算()1+k x 的所有分量,显然在计算第i 个分量()1+k ix时,已经计算出的最新分量()11+k x ,()12+k x ,…,()11+-k i x 没有被利用.从直观上看,最新计算出的分量可能比旧的分量要好些.因此,对这些最新计算出来的第1+k 次近似()1+k x 的分量()1+k jx 加以利用,就得到所谓解方程组的Gauss-Seidel 迭代法(简称G-S 方法):()()()()()T=002010n x x x x ,,, (初始向量),()()()()n i k x a x a b a x i j n i j k j ij k j ij i iik i,,2,1;,2,1,0111111 ==⎪⎪⎭⎫ ⎝⎛--=∑∑-=+=++或写为()()()()()⎪⎩⎪⎨⎧⎪⎪⎭⎫ ⎝⎛--=∆==∆+=∑∑-==++.1,,,2,1;,2,1,01111i j ni j k j ij k iij i ii i i k i k i x a x a b a x n i k x x x上面第2个式子利用了最新计算出的分量()11+k x ,第i 个式子利用了计算出的最新分量()()1,,2,11-=+i j x k j .还可写成矩阵形式()()()()()()k k k k k Ux b x L D Ux Lx b Dx+=-++=+++111,,若设()1--L D 存在,则()()()()b L D Ux L D x k k 111--+-+-=, 于是Gauss-Seidel 迭代公式的矩阵形式为()()f Gx x k k +=+1,()6.2.8 其中 ()U L D G 1--=,()b L D f 1--=.由此可以看出,应用Gauss-Seidel 迭代法解式b Ax =,就是对方程组f Gx x +=应用迭代法.G 称为解式的Gauss-Seidel 迭代法的迭代矩阵.Gauss-Seidel 迭代法的一个明显优点是,在用计算机计算时,只需一组工作单元,以便存放近似解.由式可以看出,每迭代一步只需计算一次矩阵与向量的乘法.二.具体的算例和操作步骤2.1. Gauss-Seidel 迭代法的伪代码 1.输入问题的参数A,b 2.分解A 为D,L,U.3.计算迭代方程G ,f.4.开始迭代,随机设定一个初值.5.以迭代方程更新x 的值.6.如果到达迭代次数,则进入步骤7;否则,回到步骤5.7.输出x ,结束.2.2.具体的算例验证算法的有效性 求解如下的线性方程组1231231238-3+2=204+11-=336+3+12=36x x x x x x x x x ⎧⎪⎨⎪⎩ 这个方程的真实解为(3,2,1). 程序运行结果: 情况1:输入GS (A,b ) GS(A,b)xhis =0 0 0 2.5000 2.0909 1.2273 2.9773 2.0289 1.0041 3.0098 1.9968 0.9959 2.9998 1.9997 1.0002 2.9998 2.0001 1.0001 3.0000 2.0000 1.0000 3.0000 2.0000 1.0000 3.0000 2.0000 1.0000 3.0000 2.0000 1.0000 3.0000 2.0000 1.0000 ans = 3.0000 2.00001.00000.51.5解的迭代情况图一。
《数值分析》-雅格比法与高斯-赛德尔迭代法解线性方程组
4. 线性方程组求解4.用雅格比法与高斯-赛德尔迭代法解下列方程组Ax =b ,研究其收敛性,上机验证理论分析是否正确,比较它们的收敛速度,观察右端项对迭代收敛有无影响。
(1)A 行分别为A 1=[6,2,-1],A 2=[1,4,-2],A 3=[-3,1,4]; b 1=[-3,2,4]T , b 2=[100,-200,345]T ,(2) A 行分别为A 1=[1,0.8,0.8],A 2=[0.8,1,0.8],A 3=[0.8,0.8,1];b 1=[3,2,1] T , b 2=[5,0,-10]T ,(3)A 行分别为A 1=[1,3],A 2=[-7,1];b =[4,6]T , (1)雅可比法A 为所求方程组的系数矩阵,将系数矩阵()n n ij A a R ⨯=∈分为三部分,即111212221211000000n n nn n n a a a a a a A a a a --⎛⎫⎛⎫⎛⎫ ⎪ ⎪ ⎪-- ⎪ ⎪ ⎪=-- ⎪ ⎪ ⎪ ⎪⎪ ⎪--⎝⎭⎝⎭⎝⎭D L U ≡--构造迭代方程,选取M 为A 的对角元素部分,即选取M D =,A D N =-,由此构造得到解AX b =的雅可比迭代法如下:()()()01,,0,1,,k k x xBx f k +⎧⎨=+=⎩ 初始向量(4-1)其中()111B I D A D L U J f D b ---=-=+≡=,,J 为雅可比迭代矩阵。
若A 为n 阶矩阵,迭代公式如下:()()()()()()()00001211,,,()/1,2,,;0,1,T n n k k ii ij j ii j j ix x x x x b a x a i n k +=≠⎧=⎪⎪⎪=-⎨⎪⎪==⎪⎩∑初始向量表示迭代次数(4-2) 在运行程序时首先需要手动输入矩阵A ,阶数n 、向量b 和初始向量x 0,根据式(4-2)不断迭代可求解得近似解。
MATLAB Gauss-Seidel法解线性代数方程组
Gauss-Seidel 法解线性代数方程组Gauss-Seidel 法解线性代数方程组算法:Step 1取初始点)0(x ,精度要求epsStep 2若ε>-∞+)()1(k k x x 转到Step 3 否则转到Step 4Step 3用下式计算:()()b L D Ux L D x k k 1)(1)1(--++++-=转到Step 2 Step 4停止计算()1(+k x 作为线性方程组的解) Step 5 )22(643211k k k k h y y n n ++++=+Gauss-Seidel 法解线性代数方程组程序:function GS(A,b,x,eps)%A----线性方程组系数矩阵%b----线性方程组的解(列向量)%x----初始迭代点%D----A 对角阵%e----取误差(计算范数)D=diag(diag(A));L=tril(A,-1);%取下三角阵U=triu(A,1);%取上三角阵e=inf;X=x;s=0;while e>=epsx=inv(D+L)*U*x+inv(D+L)*b;e=norm(x-X);X=x;s=s+1;endif s<100xelsedisp('超过最大迭代次数')disp('迭代到100次的结果为')xend例:用Gauss-Seidel 迭代法解下列线性方程组⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-1166122111221321x x x 输入:clear allclcA=[1 2 -2;1 1 1;2 2 1];b=[6;6;11];x=[0;0;0];ep=1e-3;GS(A,b,x,ep)得到:超过最大迭代次数迭代到100次的结果为x =1.0e+308 *-1.78011.7807-0.0012指导教师: 年 月 日。
Gauss-Seidel迭代法求解线性方程组
一. 问题描述用Gauss-Seidel 迭代法求解线性方程组由Jacobi 迭代法中,每一次的迭代只用到前一次的迭代值。
使用了两倍的存储空间,浪费了存储空间。
若每一次迭代充分利用当前最新的迭代值,即在计算第i 个分量)1(+k ix 时,用最新分量)1(1+k x ,⋅⋅⋅+)1(2k x )1(1-+k i x 代替旧分量)(1k x ,⋅⋅⋅)(2k x )(1-k i x ,可以起到节省存储空间的作用。
这样就得到所谓解方程组的Gauss-Seidel 迭代法。
二. 算法设计将A 分解成U D L A --=,则b x =A 等价于b x =--U)D (L 则Gauss-Seidel 迭代过程)()1()1(k k k Ux Lx b Dx ++=++故)()1()(k k Ux b x L D +=-+若设1)(--L D 存在,则b L D Ux L D x k k 1)(1)1()()(--+-+-=令b L D f U L D G 11)()(---=-=,则Gauss-Seidel 迭代公式的矩阵形式为f Gx x k k +=+)()1(其迭代格式为Tn x x x x )()0()0(2)0(1)0(,,,⋅⋅⋅= (初始向量),)(11111)()1()1(∑∑-=-+=++--=i j i i j k j ijk j ij i ii i ix ax 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 ,,,;,,,三. 程序框图四. 结果显示TestBench利用Gauss-Seidel 迭代法求解下列方程组⎪⎩⎪⎨⎧=+-=++--=++3103220241225321321321x x x x x x x x x , 其中取→=1)0(x 。
Gauss-Seidel迭代法求解方程组
Gauss-Seidel 迭代法求解方程组设方程组Ax=b 中的A 是n n ⨯阶矩阵,x 和b 都是n 维列向量。
若系数矩阵A 为非奇异的且0,1,2,ii a i n ≠= ,将A 分解为:A=D+L+U其中1122(,,,)nn D diag a a a =21120000000n n a L a a ⎡⎤⎢⎥⎢⎥=⎢⎥⎢⎥⎣⎦ , 1212000000n n a a a U ⎡⎤⎢⎥⎢⎥=⎢⎥⎢⎥⎣⎦将方程组1,1,2,,nij ji j a xb i n ===∑分析雅克比方法的迭代过程我们发现,在计算(1)k i x +时,虽然(1)(1)(1)121,,k k k i x x x +++- 已经全部计算出来,但是(1)k i x +计算还是用()()()121,,k k k i x x x - 而未用(1)(1,2,,1)k j x j i +=- 有理由认为(1)k jx +比()k jx 个接近精确值的相应分量,因此我们计算(1)k i x +时,用(1)k jx +代替()(1,2,,1)k j x j i =- ,即1(1)(1)()111(),1,2,,i nk k k ii ij j ij j j j i ii x b a x a x i n a -++==+=--=∑∑ 简记为:(1)()k k x Bx f +=+其中 B =- (D +L)1-U, f= (D +L)1-b我们称()x Bx f ϕ=+为迭代函数,任取初始向量(0)x x =,按照(1)()k k xBx f +=+即1(1)(1)()111(),1,2,,i nk k k ii ij j ij j j j i ii x b a x a x i n a -++==+=--=∑∑ 形式,称这种迭代方法为 Gauss -Seidel 迭代法。
Gauss -Seidel 迭代法算法简单描述:(0)(0)(0)(0)12(,,,),T n x x x x = ( 向量初始)For 0,1,2,k =For 1,2,,k n =1(1)(1)()111(),1,2,,i nk k k ii ij j ij j j j i ii x b a x a x i n a -++==+=--=∑∑ 如果()(1)k k x xε--≤ 停止,否则Next k 用Gauss -Seidel 迭代法求解方程组实例为:1231212978798x x x x x x x --=⎧⎪-+=⎨⎪-+=⎩,的解,初始向量(0)(0,0,0),T x = 解 由公式知,Gauss -Seidel 迭代法为:(1)()()123(1)(1)21(1)(1)311(7)91(7)81(8)9k k k k k k k x x x x x x x +++++⎧=++⎪⎪⎪=+⎨⎪⎪=+⎪⎩由初始向量(0)(0,0,0),T x =迭代可得(1)(0.7778,0.9722,0.9753),T x =(2)(0.9942,0.9993,0.9994),T x =(3)(0.9999,0.9999,0.9999),T x =(4)(1,1,1),T x =(5)(1,1,1),T x =所以方程组的解为(1,1,1)T x =。
高斯-赛德尔法--数值分析线性方程组的迭代解法
实验六、高斯-塞德尔法
一、实验目的
通过本实验学习线性方程组的迭代解法。掌握高斯-赛德尔迭代法编程。
二、计算公式
}
if(k==T)printf("\nNo");
else
printf("\n",k);
for(i=0;i<M;i++)
printf("x(%d)=%15.7f\n",i+1,x[i]);
}
四、例题
书P189页例6:用高斯-塞德尔迭代解线性方程组:
取 使得
#include<math.h>
#define M 3
#define N 4
main()
{
double a[M][N]={{8,-3,2,20},
{4,11,-1,33},
{6,3,12,36},
};
double x[M]={0,0,0};//初值
double r,t,q,eps=0.0000202;//需要精度
if(j!=i)q=q+a[i][j]*x[j];
x[i]=(a[i][N-1]-q)/a[i][i];
if(fabs(x[i]-t)>r)r=fabs(x[i]-t);
}
if(r<eps)break;
printf("\nk=%d,",k);
for(i=0;i<M;i++)
printf("\nx[%d]=%lf",i,x[i]);
Gauss-Seidel迭代法
Gauss-Seidel 迭代法从Jacobi 迭代法的格式可以看出,后一步的迭代值仅仅与前一步有关,而且先算哪一个分量是无关紧要的。
新算出来的分量无法及时地用到下一个分量的计算之中,导致收敛的速度比较慢。
如果能将新计算出来的分量及时地更新到当前要计算的分量之中,应该可以加快收敛的速度。
这就引出了Gausss-Seidel 迭代法。
对Jacobi 迭代法进行修正,得到如下的Gauss-Seidel 迭代法:1(1)()11(1)i nk k i ij jijjj j i k i iib a xa xx a −+==++−−=∑∑,1,2,,i n =⋅⋅⋅同样地,Gauss-Seidel 迭代格式也有其相应的矩阵形式。
事实上,A D L U =++,于是,Ax b =等价于()D L x b Ux +=−。
于是,得到迭代格式(1)()()k k D L x b Ux ++=−也就是(1)1(1)1()1k k k x D Lx D Ux D b +−+−−=−−+, (1)1()1()()()k k k G x D L Ux D L b L x f +−−=−+++=+,其中,1()G L D L U −=−+,1()f D L b −=+。
Gsuss-Seidel 迭代法的Matlab 程序只需要在Jacobi 迭代地程序中做少量改动即可,这里不再写出。
例2.试用Gauss-Seidel 迭代法解线性方程组1231021321011512510x x x −−⎛⎞⎛⎞⎛⎞⎜⎟⎜⎟⎜⎟−−=⎜⎟⎜⎟⎜⎟⎜⎟⎜⎟⎜⎟−−⎝⎠⎝⎠⎝⎠【解答】 迭代格式为()()23(1)1(1)()(1)132(1)(1)(1)3123210152101025k k k k k k k k k x x x x x x x x x ++++++⎛⎞++⎜⎟⎜⎟⎛⎞⎜⎟++⎜⎟=⎜⎟⎜⎟⎜⎟⎜⎟⎝⎠++⎜⎟⎜⎟⎝⎠选(0)(0,0,0)T x =作为初值和610ε−=作为控制精度,选2-范数来衡量误差。
gauss-seidel求解线性方程组
#define N 20
double a[N][N]; //声明系数矩阵
double b[N]; //声明方程组右边的值(数组)
double eps; //声明相对误差变量
double x[3]={0,0,0};
int iteration;
//函数声明
void GetData(); //此函数用以进行对系数矩阵赋值
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("%10lf ",a[i][j]);
}
printf("%10lf\n\n",b[i]);
}
printf("求解方程的准许误差是:%lf\n\n",eps);
}
//==================================================================================
//以下是主函数
void main()
{
printf("============================================================\n\n");
printf("此程序运用gauss-seidel迭代法求解方程组的解\n\n");
printf("============================================================\n\n");
//一下定义GetData()函数
void GetData()
高斯赛德尔迭代计算方法
高斯赛德尔迭代计算方法高斯赛德尔迭代方法是一种求解线性方程组的方法,特别适用于具有对角占优的方程组。
该方法通过反复迭代逼近方程组的解,直到满足预设的精度要求。
这种方法可以有效地解决大规模线性方程组的求解问题。
高斯赛德尔迭代方法的基本原理是利用方程组中已知的解元素估计未知的解元素。
具体来说,对于方程组Ax=b,求解x的过程中,使用当前迭代步骤中已经求得的解元素作为估计值去计算其他未知解元素的值。
假设当前迭代步骤中已经求得的解元素为x(k) = [x1(k), x2(k), ..., xn(k)],则在下一步迭代中可以利用这些已知值来求解未知解元素。
高斯赛德尔迭代的迭代公式为:x1(k+1) = (b1 - (a12*x2(k) + a13*x3(k) + ... + a1n*xn(k)))/a11x2(k+1) = (b2 - (a21*x1(k+1) + a23*x3(k) + ... + a2n*xn(k)))/a22 ...xn(k+1) = (bn - (an1*x1(k+1) + an2*x2(k+1) + ... + an-1*xn-1(k+1)))/ann其中a_ij表示方程组矩阵A中第i行、第j列的元素,b_i表示方程组右侧向量b中第i个元素。
高斯赛德尔迭代方法的收敛性与方程组矩阵的特征值有关。
在一些情况下,该方法可以保证收敛到方程组的解,并且收敛速度较快。
但在一些特殊情况下,该方法可能无法收敛或者收敛速度较慢。
因此,在应用高斯赛德尔迭代方法求解线性方程组时,需要对方程组的性质进行分析,以确定该方法的适用性。
为了提高高斯赛德尔迭代的收敛速度,可以采用一些加速技巧,如超松弛法。
超松弛法是在每次迭代过程中引入一个松弛因子ω,通过调整松弛因子的大小,可以使迭代收敛的速度更快。
超松弛法的迭代公式为:x1(k+1) = (1-ω)*x1(k) + (ω/a11)*(b1 - (a12*x2(k) + a13*x3(k)+ ... + a1n*xn(k)))x2(k+1) = (1-ω)*x2(k) + (ω/a22)*(b2 - (a21*x1(k+1) + a23*x3(k) + ... + a2n*xn(k)))...xn(k+1) = (1-ω)*xn(k) + (ω/ann)*(bn - (an1*x1(k+1) +an2*x2(k+1) + ... + an-1*xn-1(k+1)))其中ω的取值一般为0<ω<2,根据经验可以选择合适的ω值。
用雅克比迭代法和高斯-赛德迭代法解方程组
解:由x=[1;2;3],算出b=[-3; 7;6]知:X1=(2*X3-3)/3X2=(-X3+7)/2X3=(2X1-X2+6)/21.雅克比法:X1(1)=0;X2(1)=0;X3(1)=0;for i=1:50X1(i+1)= (2*X3(i)-3)/3;X2(i+1)=(-X3(i)+7)/2;X3(i+1)=(2*X1(i)-X2(i)+6)/2;End迭代50次结果如下:X1 =Columns 1 through 110 -1.0000 1.0000 -0.8333 1.0000 -0.6806 1.0000 -0.5405 1.0000 -0.4121 1.0000Columns 12 through 22-0.2945 1.0000 -0.1866 1.0000 -0.0877 1.0000 0.0029 1.0000 0.0860 1.0000 0.1622Columns 23 through 331.0000 0.2320 1.0000 0.2960 1.0000 0.3547 1.0000 0.4085 1.0000 0.4577 1.0000Columns 34 through 440.5029 1.0000 0.5444 1.0000 0.5823 1.0000 0.61711.0000 0.6490 1.0000 0.6783Columns 45 through 511.0000 0.7051 1.0000 0.7297 1.0000 0.7522 1.0000X2 =Columns 1 through 110 3.5000 2.0000 3.3750 2.0000 3.2604 2.0000 3.1554 2.0000 3.0591 2.0000Columns 12 through 222.9708 2.0000 2.8899 2.0000 2.8158 2.0000 2.7478 2.0000 2.6855 2.0000 2.6284Columns 23 through 332.0000 2.5760 2.0000 2.5280 2.0000 2.4840 2.0000 2.4437 2.0000 2.4067 2.0000Columns 34 through 442.3728 2.0000 2.3417 2.0000 2.3133 2.0000 2.2871 2.0000 2.2632 2.0000 2.2413Columns 45 through 512.0000 2.2212 2.0000 2.2027 2.0000 2.1859 2.0000X3 =Columns 1 through 110 3.0000 0.2500 3.0000 0.4792 3.0000 0.6892 3.0000 0.8818 3.0000 1.0583Columns 12 through 223.0000 1.2201 3.0000 1.3684 3.0000 1.5044 3.0000 1.6290 3.0000 1.7433 3.0000Columns 23 through 331.8480 3.0000 1.9440 3.00002.03203.0000 2.1127 3.0000 2.1866 3.0000 2.2544Columns 34 through 443.0000 2.3165 3.0000 2.3735 3.0000 2.4257 3.0000 2.4736 3.0000 2.5174 3.0000Columns 45 through 512.55763.0000 2.5945 3.0000 2.6283 3.0000 2.6593 2.高斯-赛德法:XX1(1)=0;XX2(1)=0;XX3(1)=0;for i=1:50XX1(i+1)= (2*X3(i)-3)/3;XX2(i+1)=(-X3(i)+7)/2;XX3(i+1)=(2*X1(i+1)-X2(i+1)+6)/2;End迭代50次结果如下:X1 =Columns 1 through 110 -1.0000 1.0000 -0.8333 1.0000 -0.6806 1.0000 -0.5405 1.0000 -0.4121 1.0000Columns 12 through 22-0.2945 1.0000 -0.1866 1.0000 -0.0877 1.0000 0.0029 1.0000 0.0860 1.0000 0.1622Columns 23 through 331.0000 0.2320 1.0000 0.2960 1.0000 0.3547 1.0000 0.4085 1.0000 0.4577 1.0000Columns 34 through 440.5029 1.0000 0.5444 1.0000 0.5823 1.0000 0.61711.0000 0.6490 1.0000 0.6783Columns 45 through 511.0000 0.7051 1.0000 0.7297 1.0000 0.7522 1.0000X2 =Columns 1 through 110 3.5000 2.0000 3.3750 2.0000 3.2604 2.0000 3.1554 2.0000 3.0591 2.0000Columns 12 through 222.9708 2.0000 2.8899 2.0000 2.8158 2.0000 2.7478 2.0000 2.6855 2.0000 2.6284Columns 23 through 332.0000 2.5760 2.0000 2.5280 2.0000 2.4840 2.0000 2.4437 2.0000 2.4067 2.0000Columns 34 through 442.3728 2.0000 2.3417 2.0000 2.3133 2.0000 2.2871 2.0000 2.2632 2.0000 2.2413Columns 45 through 512.0000 2.2212 2.0000 2.2027 2.0000 2.1859 2.0000X3 =Columns 1 through 110 3.0000 0.2500 3.0000 0.4792 3.0000 0.6892 3.0000 0.8818 3.0000 1.0583Columns 12 through 223.0000 1.2201 3.0000 1.3684 3.0000 1.5044 3.0000 1.6290 3.0000 1.7433 3.0000Columns 23 through 331.8480 3.0000 1.9440 3.00002.03203.0000 2.1127 3.0000 2.1866 3.0000 2.2544Columns 34 through 443.0000 2.3165 3.0000 2.3735 3.0000 2.4257 3.0000 2.4736 3.0000 2.5174 3.0000Columns 45 through 512.55763.0000 2.5945 3.0000 2.6283 3.0000 2.6593结果分析:从上面的雅可比迭代法和高斯—赛德尔迭代法这两种方法所得的实验结果可知,对于同样的矩阵,对于同样的精度,雅可比迭代法要比高斯-赛德尔迭代法慢。
高斯-赛得尔迭代法
0
则
L~ D 1L, U~ D1U
于是 I L~ D1D D1L D1(D L) (3 16)
7
解线性方程组的迭代法
x(k1) (I L~)1U~x(k ) (I L~)1 g I L~ D1D D1L D1(D L) L~ D 1L, U~ D1U
将式(3-16)代入式(3-15)得
b1n xn(k)
g1
x2(k
1)
b x (k1) 21 1
b23x3(k) L
b x (k 2n1 n1
)
b2nxn(k)
g2
M
x (k1) n
b x (k1) n1 1
bn2x2(k1)
bn3x3(k1)
L
b x (k1) nn1 n1
gn
(3 13)
p4
2
解线性方程组的迭代法
b2n xn(k )
g2
M
x (k 1) n
bn1x1(k )
bn2 x2(k )
bn3 x3(k )
L
bnn
1xn
( 1
k
)
gn
其中
bij
aij aii
,
gi
bi aii
(i j,i, j 1, 2,L , n),
(i 1, 2,L , n).
(3 12)
1
解线性方程组的迭代法
因此,在Jacobi迭代法的计算过程中,要同时保留
即每算出新近似解的一个分量
x , ( k 1) i
再算下一个
x 分量
x(k 1) i 1
时,用新分量
x(k 1) i
代替老分量
(k ) i
进行计算。这样,在整个计算过程中,只需用n个
高斯-赛德尔迭代法例题
高斯-赛德尔迭代法例题高斯-赛德尔迭代法是一种用于解线性方程组的迭代方法。
它通过不断更新变量的值来逼近方程组的解。
以下是一个使用高斯-赛德尔迭代法求解线性方程组的例题:考虑以下线性方程组:```2x + y + z = 9x + 3y + z = 10x + y + 4z = 16```我们可以将方程组表示为矩阵形式:```| 2 1 1 | | x | | 9 || 1 3 1 | x | y | = | 10 || 1 1 4 | | z | | 16 |```迭代的过程如下:1. 选择一个初始解向量,比如x=0, y=0, z=0。
2. 使用迭代公式进行更新:-更新x 的值:x_new = (9 - y - z) / 2-更新y 的值:y_new = (10 - x_new - z) / 3-更新z 的值:z_new = (16 - x_new - y_new) / 43. 重复步骤2,直到解向量的值收敛于方程组的解。
假设我们进行3次迭代,初始解向量为x=0, y=0, z=0。
则迭代的过程如下:1. 第一次迭代:-更新x 的值:x_new = (9 - 0 - 0) / 2 = 4.5-更新y 的值:y_new = (10 - 4.5 - 0) / 3 ≈1.83-更新z 的值:z_new = (16 - 4.5 - 1.83) / 4 ≈2.422. 第二次迭代:-更新x 的值:x_new = (9 - 1.83 - 2.42) / 2 ≈2.87-更新y 的值:y_new = (10 - 2.87 - 2.42) / 3 ≈1.9-更新z 的值:z_new = (16 - 2.87 - 1.9) / 4 ≈2.813. 第三次迭代:-更新x 的值:x_new = (9 - 1.9 - 2.81) / 2 ≈1.65-更新y 的值:y_new = (10 - 1.65 - 2.81) / 3 ≈1.85-更新z 的值:z_new = (16 - 1.65 - 1.85) / 4 ≈3.14经过3次迭代后,解向量的值接近于x ≈ 1.65, y ≈1.85, z ≈3.14,这就是方程组的近似解。
高斯赛德尔迭代计算方法
高斯-赛德尔迭代(Gauss-Seidel iteration)是一种用于解线性方程组的迭代计算方法。
它是雅可比迭代(Jacobi iteration)的一种改进,以求解形如 Ax = b 的线性方程组。
迭代过程中,高斯-赛德尔方法按顺序更新解向量的每个分量,所得新值将直接用于后续计算。
这种按顺序更新的方法使收敛速度通常比雅可比迭代法更快。
给定一个 n×n 的系数矩阵 A 和一个 n 维列向量 b ,线性方程组表示为 Ax = b。
高斯-赛德尔迭代的步骤如下:将系数矩阵 A 分解为两部分:一个下三角矩阵 L(包括对角线)和一个上三角矩阵 U(不包括对角线)。
因此,A = L + U。
选取一个初始解向量 x^(0)。
对于每次迭代,按以下顺序更新 x 中的每个分量:x^(k+1)_i = (b_i - sum(A_ij * x^(k+1)_j, j=1 to i-1) - sum(A_ij * x^(k)_j, j=i+1 to n)) / A_ii, for i=1 to n其中,k 是迭代次数,x^(k)_i 是第 k 次迭代得到的解向量中的第 i 个分量。
判断收敛性:计算解向量相邻两次迭代之间的误差,通常采用范数(如无穷范数)表示。
如果误差满足设定的收敛准则(如小于某个阈值),则停止迭代。
如果未达到收敛准则,返回步骤 3,再次迭代。
需要注意的是,高斯-赛德尔迭代的收敛性并非总是得到保证。
通常,当系数矩阵 A 为严格对角占优矩阵(或正定矩阵)时,迭代方法才具有收敛性。
在实际应用中,常尝试使用一系列预处理技术(如 ILU 分解)通过改变原始线性方程组的形式来提高迭代收敛性。
GaussSeidel迭代法
Gauss Seidel 迭代法:Gauss Seidel 迭代法是逐个分量进行计算的一种方法,考虑线性代数方程组Ax=b 的分量法表示i j j ij b x a==∑n 1 , i=1,2,···,n对于给定的初值)0(x ,Ga迭代法如下: Gauss Seidel 迭代算法:· k=0· 11)(11)1(1/)2(x a x a b n j k j j k ∑=-==+ ·22)(2)1(1212)1(2/)3(x a x a x a b n j k j j k k ∑=--==++· …·1,1)(,12)1(,11)1(1-n /)1(x ----+--+-=-=∑=n n k n n n n j k j j n n k a x a x a b ·nn n j k j nj n k a x a b /)(x 11)1()1(n ∑-++-=== ·2)0()1(2)()1(x x x x k k k -<-++ε停止,否则k=k+1从Gauss Seidel 迭代算法的计算过程可以发现,每计算一个新的分量都需要前面所有新计算出来的分量的结果,这是一个严格的串行过程。
那么,如何设计一个并行计算的方法呢?记)0(1s j n i j ij i x a ∑+== ,i=1,2, …,n-1,s n =0。
并行计算方法如下:并行Gauss Seidel 迭代算法:k=0for i=1,n do0,/)(x )1(=-=+i ii i i k i s a s bfor j=1,n,j ≠i do)1(s ++=k i ji j j x a send{for} end{for}2)0()1(2)()1(x x x x k k k -<-++ε停止,否则k=k+1在并行Gauss Seidel 迭代算法中,每次并行计算j s ,之后可以并行计算截止条件是否满足。
高斯-赛得尔迭代法
b12x2(k) b13x3(k)
x2(k
1)
b x (k1) 21 1
b23x3(k)
b x (k) 1n1 n1
b1n xn(k)
g1
b x( 2n1 n1
k
)
b2nxn(k)
g2
x (k1) n
b x (k1) n1 1
bn2
x (k1) 2
bn3x3(k1)
b x (k1) nn1 n1
9
解线性方程组的迭代法
例 用Gauss-Seidel迭代法求线性方程组
10x1 x2 2x3 72,
x1 10x2 2x3 83,
x1 x2 5x3 42,
x1 0.1x2 0.2x3 7.2 x2 0.1x1 0.2x3 8.3 x3 0.2x1 0.2x2 8.4
x )
x (k 1) 2
0.4x2(k )
0.7( x1(k 1)
x (k) 3
)
x (k 1) 3
0.4x3(k ) 0.7(1.8 x2(k1) )
20
解线性方程组的迭代法
x (k 1) 1
0.4x1(k )
0.7(1 x2(k) )
参数 , 误差限 , 最大容许迭代次数N.
2. 置 k 1.
3.计算
18
解线性方程组的迭代法
n
x1 (1 ) x1(0) (b1
a1
j
x(0) j
)
/
a11
j2
i 1
n
xi (1 )xi(0) (bi aij x j
aij
x
(0) j
)
/
aii
j 1
高斯-赛德尔迭代法例题
高斯-赛德尔迭代法例题高斯-赛德尔迭代法是一种用于解线性方程组的迭代算法。
它属于一类称为迭代法的数值计算方法,用于逼近方程组的解。
下面我们来看一个例题,以帮助理解高斯-赛德尔迭代法的工作原理。
假设我们有以下线性方程组:```3x + 2y - z = 12x - 2y + 4z = -2-x + 0.5y - z = 0```首先,我们需要将方程组转化为迭代形式。
将每个方程的未知数移到等号右边,得到:```x = (1 - 2y + z) / 3y = (-2 - 2x + 4z) / 2z = (-x + 0.5y) / -1```然后,我们选择一个初始解,例如x0 = 0, y0 = 0, z0 = 0。
根据这个初始解,我们可以使用上述迭代公式计算下一个近似解x1、y1 和z1。
将x0、y0 和z0 分别代入迭代公式中,我们可以计算得到新的近似解:```x1 = (1 - 2y0 + z0) / 3y1 = (-2 - 2x0 + 4z0) / 2z1 = (-x0 + 0.5y0) / -1```接着,我们可以使用这个新的近似解x1、y1 和z1,再次代入迭代公式中,计算得到更接近方程组解的近似解x2、y2 和z2。
按照上述步骤,我们可以进行多次迭代,直到达到预定的精度要求或迭代次数。
每次迭代都会产生一个新的近似解,逐渐逼近方程组的解。
需要注意的是,高斯-赛德尔迭代法的收敛性取决于方程组的特性。
对于某些特殊的方程组,该方法可能不会收敛或收敛速度较慢。
因此,在实际应用中,我们需要对问题进行分析和评估收敛性。
希望以上解答能够帮助您理解高斯-赛德尔迭代法的例题。
如果您还有其他问题,欢迎随时提问。
高斯—塞德尔迭代法
x(7) (3.00002 , 1.9999987 , 0.9999932 )T , ε (7)
x(7) x *
2.2 106.
AX=b.
(1.1)
低阶稠密的线性方程组用直接法(如高斯消去法和三 角分解法)。
大型稀疏非带状的线性方程组(n很大,且零元素很多. 如偏微方程数值解产生的线性方程组,n≥104)的求解 问题? 零元素多,适合用迭代法。 我们将介绍迭代法的一般理论及雅可比迭代法、高 斯—塞德尔迭代法,研究它们的收敛性。 例1 求解线性方程组
解线性代数方程组的迭代法
§1 引言
考虑线性方程组
a11x1 a12 x2 a1n xn b1 a x a x a x b 21 1 22 2 2n n 2 an1x1 an2 x2 ann xn bn
也就是
§2
考虑线性方程组
基本迭代法
a11x1 a12 x2 a1n xn b1 a x a x a x b 21 1 22 2 2n n 2 an1x1 an2 x2 ann xn bn
也就是
Ax=b.
(2.1)
进行矩阵分裂
A=M-N,
(2.2)
其中M为可选择的非奇异矩阵,且使Mx=d容易求解. 于是, Ax=b⇔x=M-1Nx+M-1b.
可得一阶定常迭代法:
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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
<stdio.h> #include <stdlib.h>
#include <conio.h>
#include <math.h>
#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<MAX_Number);
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];
printf("\nInput n=");
scanf("%d",&n);
if(n>=MAX_n-1)
{
printf("\n\007n must <%d!",MAX_n);
exit(0);
}
MatrixInput(A,n,n+1);
if(Jacobi_(A,x,n))
printf("\nG-S Failed!");
else
{
printf("\nOutput Solution:");
VectorOutput(x,n);
}
printf("\n\n\007Press any key to quit!\n");
getch();
}
通过实验使我更加熟练的掌握和使用高斯赛贝尔迭代法来解线性方程组,而且这个方法可以用来解大型的稀疏矩阵,是的解线性方程组更加的便捷。
但是,这个实验很繁琐,必须要仔细的对待。
最新文件仅供参考已改成word文本。
方便更改。