用C语言实现高斯-赛德尔迭代方法
Guass-Seidel迭代法
1、高斯-塞德尔迭代法:实验B 、用Guass-Seidel 迭代法求解12310127.111028.3115 4.2x x x --⎛⎫⎛⎫⎛⎫ ⎪⎪ ⎪--= ⎪⎪ ⎪ ⎪⎪ ⎪--⎝⎭⎝⎭⎝⎭这里要求当()(1)61.010k k x x --∞-<⨯时迭代终止。
高斯-塞德尔迭代法程序代码:GaussSeidel.mfunction [ x ] = GaussSeidel( A, b, x0, epsilon, N ) % GaussSeidel 迭代法求解线性方程组的解 % A 方程组系数矩阵,方阵,% b 方程组右端项,% x0 迭代初始值,列向量% epsilon 精度要求,% N 最大迭代次数% x 迭代结果,方程组的近似解,列向量x=x0; %给x 赋一个值[mA,nA]=size(A);mb=length(b);if mA~=nA || mA~=mbdisp('A ,b 输入不正确!');return;endD=diag(diag(A)); %取出A 的对角矩阵DL=-tril(A,-1); %取出A 的严格下三角矩阵,加负号 U=-triu(A,1); %取出A 的严格上三角矩阵,加负号 B=(D-L)\U; %右除,即inv(D-L)*U;f=(D-L)\b;n=1;while n<=N %迭代x=B*x0+f %将迭代的中间步骤显示在命令窗口 if norm(x-x0,inf)<epsilonn %输出满足精度的迭代次数return;endn=n+1;x0=x;endif n>Ndisp('超出最大迭代次数N ,x 尚未达到精度。
'); endendshi.mA=[10,-1,-2;-1,10,-2;-1,-1,5];b=[7.1;8.3;4.2];x0=[0;0;0];epsilon=10^-6;N=30;[ x ] = GaussSeidel( A, b, x0, epsilon, N );。
Gauss-seidel迭代法的思想及C语言编程
即xi( k +1) = (bi − ∑ aij x (jk +1) −
j =1
i −1
j =i +1
∑a x
ij
( k +1)
n
(k ) j
) / aii
( k +1)
这样,每一个计算出来的分量 xi 法收敛得快。
马上就可以用于计算下一个分量 xi +1 ,这种方法比 Jacobi 迭代
(2)Gauss-seidel 迭代法的矩阵形式的推导
⎞ ⎛ x1(k +1) ⎞ ⎛ 0 −a12 " −a1,n−1 −a1n ⎞ ⎛ x1(k ) ⎞ ⎛ b1 ⎞ ⎛ a11 ⎞ ⎛ x1(k +1) ⎞ ⎛ 0 ⎟ ⎜ (k +1) ⎟ ⎜ ⎜ ⎟ ⎜ (k +1) ⎟ ⎜ −a ⎟ ⎜ (k ) ⎟ ⎜ b ⎟ 0 a22 0 " −a2,n−1 −a2n ⎟ ⎜ x2 ⎟ ⎜ 2⎟ ⎟ ⎜ x2 ⎟ ⎜ ⎜ ⎟ ⎜ x2 ⎟ ⎜ 21 ⎟⎜ # ⎟ + ⎜ ⎟⎜ # ⎟ = ⎜ # # % % ⇔⎜ % # # ⎟⎜ # ⎟ + ⎜ # ⎟ ⎟ ⎜ (k +1) ⎟ ⎜ ⎜ ⎟ ⎜ (k +1) ⎟ ⎜ ⎟ ⎜ (k ) ⎟ ⎜ ⎟ 0 an−1,n−1 b −an−1,n ⎟ ⎜ xn 0 ⎟ ⎜ xn−1 ⎟ ⎜ −1 ⎟ ⎜ n−1 ⎟ ⎜ ⎟ ⎜ xn−1 ⎟ ⎜ −an−1,1 −an−1,2 " ( k +1) ⎟ ⎜ ( k +1) ⎟ ⎜ (k ) ⎟ ⎜ ⎟ ⎜ ⎟ ⎟ ⎜ ⎜ ⎜ ann ⎠ ⎝ xn ⎠ ⎝ −an1 −an2 " −an,n−1 0⎠ ⎝ xn ⎠ ⎝ 0 ⎠ ⎝ xn ⎠ ⎝ bn ⎟ ⎝ ⎠ ( k +1) ( k +1) (k ) ⇔ Dx = Lx +Ux + b ⇔ (D − L)x(k +1) = Ux(k ) + b ⇔ x(k +1) = (D − L)−1Ux(k ) + (D − L)−1b = BJ x + g 其中BJ =(D − L)−1U, g = (D − L)−1b
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解的迭代情况图一。
二维gauss-seidel迭代法matlab代码
二维Gauss-Seidel迭代法是解线性方程组的一种常用方法,通过迭代求解,能够快速且精确地得到方程组的解。
在MATLAB中,可以使用简洁的代码实现二维Gauss-Seidel迭代法,下面我们将介绍该方法的原理以及在MATLAB中的具体实现。
一、Gauss-Seidel迭代法原理1. Gauss-Seidel迭代法是一种逐次逼近的方法,通过不断迭代更新方程组中的未知数,最终得到方程组的解。
其基本思想是利用已知的未知数值不断逼近更精确的解。
2. 对于线性方程组Ax=b,可以将其表示为x(k+1)=Tx(k)+c的形式,其中T为迭代矩阵,c为常量向量,x为未知数向量。
Gauss-Seidel 迭代法通过不断更新x(k)的值,逐步逼近方程组的解。
3. 迭代矩阵T和常量向量c的具体计算方式为:首先将系数矩阵A分解为下三角矩阵L、对角矩阵D和上三角矩阵U,然后得到T=-L*(D^-1)*U,c=L*(D^-1)*b。
4. 通过不断迭代更新x(k)的值,直到满足一定的精度要求或者迭代次数达到设定值,即可得到方程组的解。
二、MATLAB实现二维Gauss-Seidel迭代法在MATLAB中,可以很方便地实现二维Gauss-Seidel迭代法,以下是具体的实现代码:```matlabfunction [x, k] = gauss_seidel(A, b, x0, tol, max_iter)A为系数矩阵,b为常量向量,x0为初始解向量,tol为精度要求,max_iter为最大迭代次数返回x为方程组的解,k为实际迭代次数n = length(b);x = x0;k = 0;err = tol + 1;L = tril(A, -1); 下三角矩阵U = triu(A, 1); 上三角矩阵D = diag(diag(A)); 对角矩阵T = -L*(D\U);c = L*(D\b);while err > tol k < max_iterx_old = x;x = T*x + c;err = norm(x - x_old, inf);k = k + 1;endend```三、代码说明1. 函数gauss_seidel接受系数矩阵A、常量向量b、初始解向量x0、精度要求tol和最大迭代次数max_iter作为输入参数,返回方程组的解x和实际迭代次数k。
雅克比迭代法与高斯-赛德尔
实验三 线性方程组的迭代法班级:**计本 ** 班 姓名:** 座号: ** 时间:2010/6/2一、 实验目的(1) 熟悉VC++开发平台和开发语言。
(2) 掌握雅可比及高斯-塞德尔迭代法解方程组的迭代法,并能根据给定的精度要求计算(包括迭代过程);比较两种方法的优劣。
(3) 培养编程和上机调试能力。
二、 实验设备一台PC 机,XP 操作系统,VC++软件三、 实验内容用雅可比迭代法和高斯-塞德尔迭代法解方程组1231231238322041133631236x x x x a x x x x x -+=⎧⎪+-=⎨⎪++=⎩,其精度为10-5。
四、 算法描述1. 雅克比迭代法公式:X[0][k+1] = ( 1 / a[0][0] )*[ b[0] –a[0][1]*X[1][k] – a[0][2]*X[2][k] ]; X[1][k+1] = ( 1 / a[1][1] )*[ b[1] –a[0][0]*X[0][k] – a[0][2]*X[2][k] ]; X[2][k+1] = ( 1 / a[2][2] )*[ b[2] –a[0][0]*X[0][k] – a[0][1]*X[1][k] ];2. 高斯-赛德尔迭代法公式:X[0][k+1] = ( 1 / a[0][0] )*[ b[0] –a[0][1]*X[1][k] – a[0][2]*X[2][k] ]; X[1][k+1] = ( 1 / a[1][1] )*[ b[1] –a[0][0]*X[0][k+1] – a[0][2]*X[2][k] ]; X[2][k+1] = ( 1 / a[2][2] )*[ b[2] –a[0][0]*X[0][k+1] – a[0][1]*X[1][k+1] ];3. 流程图雅克比流程图高斯-赛德尔流程图五、程序代码/*雅克比方法类Jacobi.h*/#ifndef A#define A#define MAX_SIZE 50class Jacobi{public:void Solve(int n,double a[MAX_SIZE][MAX_SIZE],double b[MAX_SIZE],intMAX_XunHuan,double e,int pre);};#endif/*雅克比方法类方法实现Jacobi.cpp*/#ifndef B#define B#include "Jacobi.h"#include "iostream"#include "math.h"#include "iomanip"using namespace std;double X[MAX_SIZE][MAX_SIZE]={0};double E[MAX_SIZE];void Jacobi::Solve(int n,double a[MAX_SIZE][MAX_SIZE],double b[MAX_SIZE],int MAX_XunHuan,double e,int pre){int i,j=1,z;double s=0;int flag=1;cout<<"请输入初始值X[i][0]:";for (i=0;i<n;i++){cin>>X[i][0];}for (j=1;j<MAX_XunHuan&&flag;j++){flag=0;for (i=0;i<n;i++){s=0;for (z=0;z<n;z++){if (i!=z){s+=a[i][z]*X[z][j-1];}}X[i][j]=1.0/a[i][i]*(b[i]-s);}E[j]=fabs(X[0][j]-X[0][j-1]);for (i=1;i<n;i++){if(fabs(X[i][j]-X[i][j-1])>E[j])E[j]=fabs(X[i][j]-X[i][j-1]);}if (E[j]>e){flag=1;}}if(flag==0){for (i=0;i<n;i++){cout<<" X"<<i<<"(k) ";}cout<<" 误差"<<endl;for (i=0;i<j;i++){cout<<setiosflags(ios::left)<<setiosflags(ios::fixed)<<setprecision(pre)<<X[0][i]<<" "<<X[1][i]<<" "<<X[2][i]<<" ";if(i>0){if(i!=j-1)cout<<E[i]<<endl;elsecout<<E[i]<<" < "<<e<<endl;}elsecout<<" ∞"<<endl;}}elsecout<<"没有结果,最大循环次数不够\n";cout<<"迭代次数为"<<j<<endl;}#endif/*/*高斯-赛德尔方法类Gauss.h*/#ifndef C#define C#define MAX_SIZEG 50class Gauss{public:void Solve(int n,double a[MAX_SIZEG][MAX_SIZEG],double b[MAX_SIZEG],int MAX_XunHuan,double e,int pre);};#endif/*高斯-赛德尔方法类方法实现Gauss.cpp*/#ifndef D#define D#include"Gauss.h"#include "math.h"#include "iostream"#include "iomanip"using namespace std;double XG[MAX_SIZEG][MAX_SIZEG]={0};double EG[MAX_SIZEG];void Gauss::Solve(int n,double a[MAX_SIZEG][MAX_SIZEG],double b[MAX_SIZEG],int MAX_XunHuan,double e,int pre){int i,j=1,z;double s=0;int flag=1;cout<<"请输入初始值XG[i][0]:";for (i=0;i<n;i++){cin>>XG[i][0];}for (j=1;j<MAX_XunHuan&&flag;j++){flag=0;for (i=0;i<n;i++){s=0;for (z=0;z<n;z++){if (i!=z){if(z>i)s+=a[i][z]*XG[z][j-1];elses+=a[i][z]*XG[z][j];}}XG[i][j]=1.0/a[i][i]*(b[i]-s);}EG[j]=fabs(XG[0][j]-XG[0][j-1]);for (i=1;i<n;i++){if(fabs(XG[i][j]-XG[i][j-1])>EG[j])EG[j]=fabs(XG[i][j]-XG[i][j-1]);}if (EG[j]>e){flag=1;}}if(flag==0){for (i=0;i<n;i++){cout<<" XG"<<i<<"(k) ";}cout<<" 误差"<<endl;for (i=0;i<j;i++){cout<<setiosflags(ios::left)<<setiosflags(ios::fixed)<<setprecision(pre)<<XG[0][i]<<" "<<XG[1][i]<<" "<<XG[2][i]<<" ";if(i>0){if(i!=j-1)cout<<EG[i]<<endl;elsecout<<EG[i]<<" < "<<e<<endl;}elsecout<<" ∞"<<endl;}}else cout<<"没有结果,最大循环次数不够\n";cout<<"迭代次数为"<<j<<endl;}#endif/*主函数Main*/#include "iostream"#include "Jacobi.h"#include "Jacobi.cpp"#include "Gauss.h"#include "Gauss.cpp"using namespace std;int main(){Jacobi J;Gauss G;int key;int i,j;int pre;double a[MAX_SIZE][MAX_SIZE]={0};double b[MAX_SIZE]={0};int n,MAX_XunHuan;double e;do{cout<<"请输入方程组的阶数:";cin>>n;cout<<"请输入系数矩阵A:";for (i=0;i<n;i++){for (j=0;j<n;j++){cin>>a[i][j];}}cout<<"请输入常数矩阵B:";for (i=0;i<n;i++){cin>>b[i];}cout<<"请输入最大循环次数:";cin>>MAX_XunHuan;cout<<"请输入最小误差:";cin>>e;cout<<"请输入精度输出控制(小数点后的位数)"; cin>>pre;cout<<"结束0:\n雅克比迭代法求解1:\n高斯-赛德尔求解2:";cin>>key;if (key==1){J.Solve(n,a,b,MAX_XunHuan,e,pre);}if (key==2){G.Solve(n,a,b,MAX_XunHuan,e,pre);}} while (key);return 0;}六、实验结果1.这次试验很简单,主要是公式问题,做得很顺利。
线性方程组的数值算法C语言实现(附代码)
线性方程组AX=B 的数值计算方法实验一、 实验描述:随着科学技术的发展,线性代数作为高等数学的一个重要组成部分,在科学实践中得到广泛的应用。
本实验的通过C 语言的算法设计以及编程,来实现高斯消元法、三角分解法和解线性方程组的迭代法(雅可比迭代法和高斯-赛德尔迭代法),对指定方程组进行求解。
二、 实验原理:1、高斯消去法:运用高斯消去法解方程组,通常会用到初等变换,以此来得到与原系数矩阵等价的系数矩阵,达到消元的目的。
初等变换有三种:(a)、(交换变换)对调方程组两行;(b)、用非零常数乘以方程组的某一行;(c)、将方程组的某一行乘以一个非零常数,再加到另一行。
通常利用(c),即用一个方程乘以一个常数,再减去另一个方程来置换另一个方程。
在方程组的增广矩阵中用类似的变换,可以化简系数矩阵,求出其中一个解,然后利用回代法,就可以解出所有的解。
2、选主元:若在解方程组过程中,系数矩阵上的对角元素为零的话,会导致解出的结果不正确。
所以在解方程组过程中要避免此种情况的出现,这就需要选择行的判定条件。
经过行变换,使矩阵对角元素均不为零。
这个过程称为选主元。
选主元分平凡选主元和偏序选主元两种。
平凡选主元:如果()0p pp a ≠,不交换行;如果()0p pp a =,寻找第p 行下满足()0p pp a ≠的第一行,设行数为k ,然后交换第k 行和第p 行。
这样新主元就是非零主元。
偏序选主元:为了减小误差的传播,偏序选主元策略首先检查位于主对角线或主对角线下方第p 列的所有元素,确定行k ,它的元素绝对值最大。
然后如果k p >,则交换第k 行和第p 行。
通常用偏序选主元,可以减小计算误差。
3、三角分解法:由于求解上三角或下三角线性方程组很容易所以在解线性方程组时,可将系数矩阵分解为下三角矩阵和上三角矩阵。
其中下三角矩阵的主对角线为1,上三角矩阵的对角线元素非零。
有如下定理:如果非奇异矩阵A 可表示为下三角矩阵L 和上三角矩阵U 的乘积: A LU = (1) 则A 存在一个三角分解。
高斯赛德尔与超松弛迭代法
分别运用高斯赛德尔迭代法和超松弛迭代法解线性方程组:⎪⎪⎪⎭⎫ ⎝⎛-=⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎭⎫ ⎝⎛--243024410143034321x x x 。
1. 高斯赛德尔迭代法编程思路:高斯赛德尔迭代法实在雅克比迭代法的基础上进行优化得到的,即在进行迭代时,将已经算得的第k+1步的迭代值代入第k+1步后边的变量的计算当中去,从而加快了迭代速度。
程序代码:function varargout=Gauss_Seidelli(varargin)A=[4 3 0;3 4 -1;0 -1 4];b=[24 30 -24]';x0=[0;0;0];x=Gauss_Seidel(A,b,x0)function x=Gauss_Seidel(A,b,x0)n=100;%最大迭代次数ee=0.0001;%精度n1=length(b);for i=1:nx1=x0;for j=1:n1s=0;for k=1:n1if k~=js=s+A(j,k)*x0(k);endendx0(j)=(b(j)-s)/A(j,j);endif norm(x1-x0)<eebreakendendx=x0;2. 超松弛迭代法该方法是在高斯赛德尔迭代法的基础上将前一步的结果)(k i x 和)1( k i x 进行适当的线性组合以加速收敛,松弛因子ω的选择是关键,当1<ω<2时,即为超松弛迭代法。
程序代码:function varargout=SORli(varargin)clcA=[4 3 0;3 4 -1;0 -1 4];b=[24;30;-24];x0=[0;0;0];w=1.3;x=SOR(A,b,x0,w);for i=1:3fprintf('%4.2f ',x(i));endfprintf('\n');function x=SOR(A,b,x0,w)%AX=b%x0初始点%w 为 松弛因子n=100;%最大迭代次数ee=0.0001;%精度n1=length(b);for i=1:nx1=x0;for j=1:n1s=0;for k=1:n1if k~=js=s+A(j,k)*x0(k);endendx0(j)=(1-w)*x0(j)+w*(b(j)-s)/A(j,j);endif norm(x1-x0)<eebreakendendx=x0;。
高斯赛德尔算法程序说明
高斯赛德尔算法程序说明高斯赛德尔算法(Gauss-Seidel algorithm)是一种用于求解线性方程组的迭代方法。
它通过逐次修正线性方程组的解来逼近方程组的精确解。
算法步骤如下:1. 初始化解向量的初值,可以是全零向量或者任意向量。
2. 对于每个方程,使用当前的解来计算该方程中除未知数所在位置以外的其他已知数和常数项的值,然后用这些值代入方程中求解未知数的值,更新当前解向量的对应分量。
3. 重复步骤2,直到当前解向量的变化足够小或达到迭代次数的上限。
通过迭代计算,可以逼近线性方程组的精确解。
高斯赛德尔算法的程序示例:```pythondef gauss_seidel(A, b, x0, tol=1e-6, max_iter=100):n = len(A)x = x0.copy()# 迭代计算for k in range(max_iter):for i in range(n):sum1 = sum(A[i][j] * x[j] for j in range(i))sum2 = sum(A[i][j] * x[j] for j in range(i + 1, n))x[i] = (b[i] - sum1 - sum2) / A[i][i]# 检查当前解的变化是否足够小error = max(abs(A[i][i] * x[i] - b[i]) for i in range(n))if error < tol:breakreturn x```输入参数说明:- A: 系数矩阵(n × n)- b: 常数向量(长度为n)- x0: 初始解向量(长度为n)- tol: 解的变化容许度,默认为1e-6- max_iter: 最大迭代次数,默认为100输出为线性方程组的近似解向量。
需要注意的是,在使用高斯赛德尔算法求解线性方程组时,有时候可能会出现算法发散的情况,即迭代无法收敛到方程组的解。
高斯-赛德尔迭代法[整理版]
一、实验目的与要求对于线性方程组⎪⎩⎪⎨⎧=++=++=++69228281027321321321x x x x x x x x x1. 用高斯-赛德尔迭代法求此方程组的近似解(终止迭代过程的最大允许迭代次数N ,近似解的误差限eps ,均由用户设定);2. 通过数值实验说明,求此线性方程组的近似解时,高斯-赛德尔迭代法的收敛速度比雅可比迭代法的收敛速度要快一些。
(用同样精度要求的条件来比较迭代次数)五、 实验方案(程序源文件)运用MATLAB 软件编辑M 文件如下:function EX()a=input('请输入系数矩阵a :');b=input('请输入矩阵b:');N=input('请输入最大迭代次数N :'); esp=input('请输入近似解的误差限:'); if any(diag(a))==0error('系数矩阵错误,迭代终止!')endD=diag(diag(a)); X0=zeros(size(b));x1=0;x2=0; x3=0;X1=[x1;x2;x3]; h=inv(D)*b; B=inv(D)*(D-a);B1=triu(B); B2=tril(B);k=1;fprintf('高斯-赛德尔迭代法 \n');fprintf('第0次迭代得:')disp(X1'); while k<=Nx1=h(1,1)+B1(1,:)*X0;X1=[x1;x2;x3];x2=h(2,1)+B1(2,:)*X0+B2(2,:)*X1;X1=[x1;x2;x3];x3=h(3,1)+B2(3,:)*X1; X1=[x1;x2;x3];if norm(X1-X0,inf)<espfprintf('已满足误差限。
')break ;endX0=X1;fprintf('第%2d次迭代得:',k)disp(X1');k=k+1;endfprintf('满足误差限的高斯-赛德尔迭代近似解为:')disp(X1');fprintf('雅可比迭代法 ');t=0;Y0=zeros(size(b));while t<=NY1=h+B*Y0;if norm(Y1-Y0,inf)<espfprintf('满足误差限 \n')break ;endY0=Y1;fprintf('第%2d次迭代得:',t)disp(Y1');t=t+1;endfprintf('满足误差限的雅可比迭代近似解为:')disp(Y1');fprintf('用高斯-赛德尔迭代法迭代次数为 %d次\n用高斯-赛德尔迭代法迭代次数为%d次\n',k-1,t-1)六、实验结果和数据处理(运行结果,截图)七、结论。
数值分析实验-雅可比迭代和高斯塞德尔迭代
1.雅可比迭代源代码A=[6,-2,-1,-1;-2,18,-1,-1;-1,-1,6,-2;-1,-1,-1,12];b=[-16;6;9;43];x0=[0;0;0;0];it_max=500;eps=1e-6;[x,k]=jacobi(A,b,x0,eps,it_max)function [x,n]=jacobi(A,b,x0,eps,it_max)% 求线性方程组的Jacobi迭代法,调用格式为% [x, k] = jacobi(A,b,x0,eps,it_max)% 其中, A 为线性方程组的系数矩阵,b 为常数项,eps 为精度要求,默认为1e-6, % it_max 为最大迭代次数,默认为200% x 为线性方程组的解,k迭代次数if nargin ==3eps = 1.0e-6;M = 200;elseif nargin<3disp('输入参数数目不足3个');returnelseif nargin ==5M = it_max;endD = diag(diag(A));%求A的对角矩阵L = -tril(A,-1);%求A的下三角矩阵U = -triu(A,1);%求A的上三角矩阵B = D\(L+U);f = D\b;x = B*x0+f;n = 1;%迭代次数while norm(x-x0)>=epsx0 = x;x = B*x0+fn = n+1;if(n>=M)disp('Warning:迭代次数太多,可能不收敛!')return;endEnd2.高斯赛德尔迭代源代码A=[6,-2,-1,-1;-2,18,-1,-1;-1,-1,6,-2;-1,-1,-1,12];b=[-16;6;9;43];x0=[0;0;0;0];it_max=500;eps=1e-6;[x,k]=jacobi(A,b,x0,eps,it_max)function [x,n] = guaseidel(A,b,x0,eps,it_max)% 求线性方程组的Gauss-Seidel迭代法,调用格式为% [x, k] = guaseidel(A,b,x0,eps,it_max)% 其中, A 为线性方程组的系数矩阵,b 为常数项,eps 为精度要求,默认为1e-5, % it_max 为最大迭代次数,默认为100% x 为线性方程组的解,k迭代次数if nargin == 3eps = 1.0e-6it_max= 200elseif nargin == 4it_amx = 200elseif nargin <3disp('输入参数个数不足3个');return;endD = diag(diag(A));%求A的对角矩阵L = -tril(A,-1);%求A的下三角矩阵,不带对角线U = -triu(A,1);%求A的上三角矩阵G = (D-L)\U;f = (D-L)\b;x = G*x0+f;n=1; %迭代次数while norm(x-x0)>=epsx0 = x;x = G*x0+f;n = n+1;if(n>=it_max)disp('Warning:迭代次数太多,可能不收敛');return;endEnd3.方程组A=[6,-2,-1,-1;-2,18,-1,-1;-1,-1,6,-2;-1,-1,-1,12]; b=[-16;6;9;43];即4.MATLAB运行结果截图jacobi运行结果guaseidel运行结果jacobi迭代和guaseidel迭代从以上的运行结果比较来看,guaseidel的收敛性和收敛速度更快。
数值分析 c语言实现高斯赛德尔解法
数值分析程序设计学院:计算机学院姓名:袁薪洋1.实验目的:1熟练掌握C语言程序设计,编程求解问题。
2.运用高斯-赛德尔迭代公式求解线性方程组。
2.实验内容:用高斯-赛德尔迭代公式求解方程组。
10x1-x2-2x3=7.2-x1+10x2-2x3=8.3-x1-x2+5x3=4.2程序的核心代码:#include"math.h"#include<stdio.h>#define NUMBER 20float A[NUMBER][NUMBER+1] ; float ark;int flag,n;void exchange(int r,int k);float max(int k);void main(){float x[NUMBER]; /*此数组用于存放方程解*/int r,k,i,j;printf("***********************************");printf("\n\n用高斯-赛德尔迭代法解线性方程组\n\n");printf("***********************************");printf("\n\n 请输入方程组的维数:n=");scanf("%d",&n);printf(" \n\n请输入系数矩阵A和向量b:");for(i=1;i<=n;i++){printf("\n\n请输入a%d1--a%d%d系数和向量b%d(数之间用空格格开):",i,i,n,i);//实现将每一行中的系数和向量一次性输入,数之间用空格格开,输完后回车确定for(j=1;j<=n+1;j++) //将刚才输入的数存入数组scanf("%f",&A[i][j]);}for(k=1;k<=n-1;k++){ark=max(k);if(ark==0) //判断方程是否为线性方程printf("\n\n此方程组不合法!");}else if(flag!=k)exchange(flag,k);for(i=k+1;i<=n;i++)for(j=k+1;j<=n+1;j++)A[i][j]=A[i][j]-A[k][j]*A[i][k]/A[k][k]; }x[n]=A[n][n+1]/A[n][n];for( k=n-1;k>=1;k--){float me=0;for(j=k+1;j<=n;j++){me=me+A[k][j]*x[j];}x[k]=(A[k][n+1]-me)/A[k][k];}for(i=1;i<=n;i++){printf(" \n\nx%d=%f",i,x[i]);}void exchange(int r,int k) //交换行的矩函数{int i;for(i=1;i<=n+1;i++)A[0][i]=A[r][i];for(i=1;i<=n+1;i++)A[r][i]=A[k][i];for(i=1;i<=n+1;i++)A[k][i]=A[0][i];}float max(int k) //比校系数大小的函数{int i;float temp=0;for(i=k;i<=n;i++)if(fabs(A[i][k])>temp){temp=fabs(A[i][k]);flag=i;}return temp; }3.运行结果:截图如下:。
高斯-赛得尔迭代法
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
高斯赛德尔迭代计算方法
高斯赛德尔迭代计算方法## 高斯赛德尔迭代计算方法高斯赛德尔迭代计算方法(Gauss-Seidel Iterative Method)是一种迭代解线性方程组的数值方法。
该方法基于一个简单的观察:在求解一个方程组时,可以利用已经得到的解来逐步逼近最终的解。
这种方法通常用于解决稀疏矩阵或特殊矩阵的方程组。
### 原理高斯赛德尔迭代计算方法是一种逐次逼近求解的迭代方法。
对于一个线性方程组 Ax = b,其中 A 是系数矩阵,x 是未知向量,b 是已知向量,可以将该方程组转化为以下形式:```x(i+1) = Dx(i) + c```其中,`x(i)` 表示第 `i` 次迭代的近似解,`D` 是一个对角矩阵,`c` 是一个常向量。
为了简化计算,可以将 `D` 拆分为两个部分:`D = L + U`,其中 `L` 是 A 的严格下三角部分,`U` 是 A 的严格上三角部分。
将上述表达式代入,则可以得到以下迭代公式:```x(i+1) = -D^(-1)(Lx(i+1) + Ux(i)) + D^(-1)b```其中 `D^(-1)` 表示 `D` 的逆矩阵。
这个公式可以用来逐步更新 `x(i+1)` 直到收敛为止。
迭代过程中,每次更新`x(i+1)` 的值需要利用上一次迭代得到的`x(i)` 值。
### 算法步骤高斯赛德尔迭代计算方法的一般步骤如下:1. 初始化 `x(0)` 为一个向量,可随机选择或使用估计值。
2. 根据迭代公式计算 `x(i+1)` 的值,直到满足停止条件。
3. 检查迭代结果是否收敛。
如果未收敛,则返回第二步。
迭代的停止条件可以根据需要进行选择,常见的条件包括迭代次数、误差限制等。
### 示例以一个简单的二元线性方程组作为示例来说明高斯赛德尔迭代计算方法的应用。
假设有如下方程组:```3x + 2y = 10x + 4y = 8```将其转化为矩阵表示形式:```| 3 2 | | x | | 10 || | | | | || 1 4 | x | y | = | 8 |```可以得到 `A`、`b` 和初始解 `x(0)` 的值如下:```A = | 3 2 || || 1 4 |b = | 10 || || 8 |x(0) = | 0 || || 0 |```根据迭代公式进行计算,每次迭代的结果如下:```第 1 次迭代: x(1) = | 10/3 || || 2/3 |第 2 次迭代: x(2) = | 16/5 || || 14/5 |第 3 次迭代: x(3) = | 873/238 || || 127/238 |...```根据迭代过程,可以看到解 `x` 的值逐步逼近真实解。
高斯-赛德尔迭代法的算法及程序设计
题目:高斯-赛德尔迭代法的算法及程序设计摘要本文通过理论与实例对线性方程组的解法、收敛性及误差分析进行了探讨.在对线性方程组数值解法的讨论下用到了高斯-赛德尔迭代法,进一步研究和总结了高斯-赛德尔迭代法的理论与应用,使我们在分析问题与编辑程序时能更好的把握对高斯-赛德尔迭代法的应用。
关键词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)参考文献 .............................................. 错误!未定义书签。
附录 .................................................. 错误!未定义书签。
第一章 高斯-赛德尔迭代法考虑线性方程组A x b=其中A 为非奇异矩阵,对于由工程技术中产生的大型稀疏矩阵方程组(A 的阶数n 很大但零元素很多),利用迭代法求解线性方程组A x b =是合适的.在计算机内存和运算两方面,迭代法通常都可利用A 中有大量零元素的特点.本章将介绍迭代法中的高斯-赛德尔法的思想理论、收敛性及误差分析.§1.1 高斯-赛德尔迭代法的提出§1.1.1 高斯-赛德尔迭代法的思想理论在研究雅可比迭代法时,计算1k i x +时,已得(1)(1)(1)121,,,k k k i x x x +++- (这些分别为121,,,i x x x - 的第k+1次近似),Gauss-Seidel 迭代法认为在计算时启用新值,从而产生1(1)(1)()111()i nk k k ii ij jij j j j i iixb a xa x a -++==+=--∑∑.具体原理如下图所示图1.1 基本迭代原理§1.1.2 高斯-赛德尔迭代法的定义及表达形式定义1.1 我们注意到在雅可比迭代法中并没有对新算出的分量11k x+,12k x +, ,11k i x +-进行充分利用.不妨设想,在迭代收敛的条件下,我们把(1)()()()11211331111(1)()()()22112332222(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 进行计算,当12k x +算出后代替()2k x 马上投入到第三个方程中计算,依次进行下去,这样也许会得到更好的收敛效果.根据这种思路建立的一种新的迭代格式,我们称为高斯-赛德尔(Gauss-Seidel )迭代公式,高斯=赛德尔迭代法的分量形式:(1)()()()11211331111(1)(1)()()22112332222(1)(1)(1)(1)1122,111()1(1(k k k k n n k k k k n n k k k k nn n n n nnn 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 xBxf k +=+= 其中1()BD L U -=- ,1()f D L b -=- B称为高斯-赛德尔迭代矩阵,f 称为高斯-赛德尔迭代常量.. §1.2 高斯-赛德尔迭代法的收敛性根据上节所述,高斯-赛德尔迭代法的迭代格式为(1)(),(0,1,2,)k k xBxf 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 。
用C语言实现高斯-赛德尔迭代方法
用C语言实现高斯-赛德尔迭代方法,源程序代码:#include "stdlib.h"#include "stdio.h"#include "conio.h"#include "string.h"#include "math.h"#define N 100float Table(int n,float a[N][N],float b[N]){int i,j;float c[N][N];printf("Please input the matrix A by row!\n");label:for(i=0;i<n;i++){printf("Row %d:",i+1);for(j=0;j<n;j++)scanf("%f",&a[i][j]);}printf("Please input the vector b:");for(i=0;i<n;i++)scanf("%f",&b[i]);for(i=0;i<n;i++)for(j=0;j<n;j++){if(i==j){c[i][j]=0;continue;}c[i][j]=-a[i][j]/a[i][i];}printf("\nThe matrix A and vector b:\n"); for(i=0;i<n;i++){for(j=0;j<n;j++)printf("%10.5f",a[i][j]);printf("%10.5f",b[i]);printf("\n");}printf("\nThe Gauss-Seidel iterative scheme:\n"); for(i=0;i<n;i++){for(j=0;j<n;j++)printf("%10.5f",c[i][j]);printf("%10.5f",b[i]/a[i][i]);printf("\n");}}float init_vec(int n,float x[N]){int i;printf("Please input the initial iteration vector x:"); for(i=0;i<n;i++)scanf("%f",&x[i]);printf("\nThe initial iteration vector x:\n");for(i=0;i<n;i++)printf("%10.5f",x[i]);printf("\n");}float gs(int n,float a[N][N],float b[N],float x[N]) {int i,j,k;float tmp1,tmp2,x2[N];for(k=0;k<10001;k++){for(i=0;i<n;i++)x2[i]=x[i];for(i=0;i<n;i++){tmp1=0.0;tmp2=0.0;for(j=0;j<i;j++)tmp1+=a[i][j]*x[j];for(j=i+1;j<n;j++)tmp2+=a[i][j]*x2[j];x[i]=(b[i]-tmp1-tmp2)/a[i][i];}for(i=0,j=0;i<n;i++)if(fabs(x2[i]-x[i])<0.00001) j++;if(j==n){printf("\nThis Gauss-Seidel iterative scheme is convergent!"); printf("\nNumber of iterations: %d",k+1);break;}if(k==499){printf("\nThis Jacobi iterative scheme may be not convergent!"); break;}}printf("\nThe results:\n");for(i=0;i<n;i++)printf("%12.7f",x[i]); }int main(){int n;float x[N],a[N][N],b[N];printf("Input n:");scanf("%d",&n);Table(n,a,b);init_vec(n,x);gs(n,a,b,x);getch();}另一种/*seidel iterative mathod */ #include <stdio.h> #include <math.h>void load();# define m 10 /*定义矩阵*/float a[m][m];float c[m];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 epsi;load();for(i=0;i<=m-1;i++){for(j=0;j<=m-1;j++){s=s+fabs(a[i][j]);t=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("seidel iterative is not retrain"); else {for(i=0;i<=m-1;i++){x[i]=0;x1[i]=0;}do{epsi=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]=fabs(x[i]-x1[i]);x1[i]=x[i];epsi=(epsi>eps[i])?epsi:eps[i];printf("x%d=%f",i,x[i]);printf("\n");}k=k+1;}while(epsi>=1e-3);printf("iteratived %d times",k);}getch();}void load(){int i,j;float b[m*m];printf("\nplease input matrix a\n"); for(i=0;i<=m-1;i++){for(j=0;j<=m-1;j++){scanf("%f",&b[j+i*m]);a[i][j]=b[j+i*m];}}printf("please input const vector c\n"); for(i=0;i<=m-1;i++) scanf("%f",&c[i]); }。
雅克比迭代法、高斯-赛德尔迭代法
昆明理工大学(计算机算法)实验报告实验名称:实验时间:2009 年 6 月 3 日专业:电信071姓名:李春华学号:200711102118成绩:一、实验目的1.通过实验进一步掌握高斯消去法的基本思想;2.通过上机实验进一步掌握高斯消去法的计算步骤,并能灵活运用;3.通过对高斯消去法的调试练习,进一步体会他的特点;4.通过上机调试运行,逐步培养解决实际问题的编程能力。
二、实习要求1.熟悉Turbo C的编译环境;2.实习前复习雅可比迭代法、高斯—塞得儿迭代法的计算步骤。
三、实习设备1.硬件设备:单机或网络环境下的微型计算机一台;2.软件设备:DOS3.3以上炒作系统,Turbo C2.0编译器。
四、实习内容雅可比迭代法与高斯—塞得儿迭代法用雅可比雅可比迭代法与高斯—塞得儿迭代法求解线性方程组Ax=b:要求:(1)写出程序的运行结果。
(2)写出迭代次数。
程序如下:1、雅可比迭代法#include<stdio.h>#include<math.h>#define n 3#define MAX_N 100#define eps 1e-6int yacobi(float a[n][n],float b[n],float x[n]){float d,s,max;float y[n];int i,j,k,flag;k=0;for(i=0;i<n;i++)x[i]=0.0;while(1){max=0.0;k++;for(i=0;i<n;i++){s=0.0;k++;for(j=0;j<n;j++){if(j==i)continue;s=s+a[i][j]*x[j];}y[i]=(b[i]-s)/a[i][i];d=fabs(y[i]-x[j]);if(max<d) max=d;}if(max<eps){flag=1;break;if(k>=MAX_N){flag=0;break;}for(i=0;i<n;i++)x[i]=y[i];}return(flag);}void zg_matric(float a[n][n],float b[n]) {int i,j;for(i=0;i<n;i++){ for(j=0;j<n;j++)printf("%10f",a[i][j]);printf("%12f",b[i]);printf("\n");}printf("\n");}{float a[][n]={{6,2 -1},{1,4,-2},{-3,1,4}};float b[n]={-3,2,4 };float x[n];int i,k;zg_matric(a,b);k=yacobi(a,b,x);if(k==1)for(i=0;i<n;i++)printf(" x%d=%11.7f\n",i+1,x[i]);elseprintf("The Method is disconvergent!\n");}结果如图:2、高斯—赛德尔迭代法#include<stdio.h>#include<math.h>#define n 3#define MAX_N 100#define eps 1e-6int seidel(float a[n][n],float b[n],float x[n]) {float d,s,max,temp;int i,j,k,flag;k=0;for(i=0;i<n;i++)x[i]=0.0;while(1){max=0.0;k++;for(i=0;i<n;i++){s=0.0;temp=x[i];for(j=0;j<n;j++){if(j==i)continue;s=s+a[i][j]*x[j];}x[i]=(b[i]-s)/a[i][i];d=fabs(x[i]-temp);if(max<d) max=d;}if(max<eps){flag=1;break;}if(k>=MAX_N){flag=0;break;}}return(flag);}void zg_matric(float a[n][n],float b[n]) {int i,j;for(i=0;i<n;i++){ for(j=0;j<n;j++)printf("%10f",a[i][j]);printf("%12f",b[i]);printf("\n");}printf("\n");}void main(){float a[][n]={{6,2,-1},{1,4,-2},{-3,1,4}};float b[n]={-3,2,4};float x[n];int i,k;zg_matric(a,b);k=seidel(a,b,x);if(k==1)for(i=0;i<n;i++)printf(" x%d=%11.7f\n",i+1,x[i]);elseprintf("The Method is disconvergent!\n");}结果如下:五、思考题:(1)雅可比迭代法与高斯—塞得尔迭代法的基本思想是什么?答:雅可比迭代法基本思想为对于给定的线性方程组Ax=b,可以用不同的方法把它变为与之等价的,行为:x=Bx+f的方程组。
研究生数值分析(12)高斯-赛德尔(Gauss-Seidel)迭代法
按行严格对角占优或按列严格对角占优,即满足条件
n
aii aij
(i 1, 2, , n)
j 1 ji
n
或 a jj aij
( j 1, 2, , n)
i 1 i j
则方程组AX=b有唯一解,且对任意初始向量 X (0)
雅可比迭代法与高斯-赛德尔迭代法都收敛。
定理5 若方程组 AX=b 的系数矩阵 A [aij ]nn 为对称正定矩阵。则对任意初始向量 X (0) 高斯 -赛德尔迭代法都收敛。
1 2 2 1
A 1 1
1
,
b
1
2 2 1 1
解:先计算迭代矩阵
0 2 2
BJ
D1(L U )
1
0
1
2 2 0
再计算
0 2 2 BG (D L)1U 0 2 3
0 0 2
其矩阵表示形式为 X (k1) D1(LX (k1) UX (k) b)
现将 X (k1) 显式化,由 (D L) X (k1) UX (k) b
得
X (k1) (D L)1UX (k ) (D L)1b
令
BG (D L)1U
(称为高斯-赛德尔(Gauss-Seidel)迭代矩阵),
一种算子范数 , 即
(A)
A r
证明:设λ为A的任一特征值,X为对应于λ的A
的特征向量,即 AX= λX, (X ≠0)
由范数的性质立即可得
X X AX A X
r
r
r
r
r
因为 X ≠0 , 所以
A r
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Table(n,a,b);
init_vec(n,x);
x[i]=(b[i]-tmp1-tmp2)/a[i][i];
}
for(i=0,j=0;i<n;i++)
if(fabs(x2[i]-x[i])<0.00001) j++;
{
if(i==j)
{ Leabharlann c[i][j]=0; continue;
}
c[i][j]=-a[i][j]/a[i][i];
#include "stdlib.h"
#include "stdio.h"
#include "conio.h"
#include "string.h"
#include "math.h"
#define N 100
float Table(int n,float a[N][N],float b[N])
if(j==n)
{
printf("\n这个高斯-赛德尔迭代方案收敛!");
printf("\n迭代次数: %d",k+1);
printf("\n");
}
}
float init_vec(int n,float x[N])
{
int i;
printf("请输入初始迭代向量x:");
for(i=0;i<n;i++)
scanf("%f",&x[i]);
for(i=0;i<n;i++)
printf("%12.7f",x[i]);
}
int main()
{
int n;
float x[N],a[N][N],b[N];
printf("请输入n:");
{
int i,j;
float c[N][N];
printf("请输入矩阵的行!\n");
label:for(i=0;i<n;i++)
{
printf("Row %d:",i+1);
for(j=0;j<n;j++)
scanf("%f",&a[i][j]);
{
int i,j,k;
float tmp1,tmp2,x2[N];
for(k=0;k<10001;k++)
{
for(i=0;i<n;i++)
x2[i]=x[i];
for(i=0;i<n;i++)
{
gs(n,a,b,x);
getch();
}
}
printf("\n高斯-赛德尔迭代的方案:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%10.5f",c[i][j]);
printf("%10.5f",b[i]/a[i][i]);
break;
}
if(k==499)
{
printf("\n这雅可比迭代计划可能不收敛!");
break;
}
}
printf("\n结果为:\n");
}
printf("\n矩阵A和向量b:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%10.5f",a[i][j]);
printf("%10.5f",b[i]);
printf("\n");
}
printf("请输入向量b:");
for(i=0;i<n;i++)
scanf("%f",&b[i]);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
printf("\n初始迭代向量x:\n");
for(i=0;i<n;i++)
printf("%10.5f",x[i]);
printf("\n");
}
float gs(int n,float a[N][N],float b[N],float x[N])
tmp1=0.0;
tmp2=0.0;
for(j=0;j<i;j++)
tmp1+=a[i][j]*x[j];
for(j=i+1;j<n;j++)
tmp2+=a[i][j]*x2[j];