高斯赛德尔与超松弛迭代法
- 格式:doc
- 大小:28.50 KB
- 文档页数:2
迭代法求解线性方程组的研究【摘要】:本文总结了解线性方程组的三个迭代法,Jacobi 迭代法,Gauss-seidel 迭代法,SOR迭代法,并且介绍了现代数值计算软件MATLAB 在这方面的应用,即分别给出三个迭代法的数值实验。
【关键字】:Jacobi 迭代法 Gauss-seidel 迭代法 SOR 迭代法 数值实验一. 引言迭代法是用某种极限过程去逐步逼近线性方程组精确解的方法,它是解高阶稀疏方程组的重要方法。
迭代法的基本思想是用逐次逼近的方法求解线性方程组。
设有方程组b Ax = …① 将其转化为等价的,便于迭代的形式f Bx x += …② (这种转化总能实现,如令b f A I B =-=,), 并由此构造迭代公式 f Bx xk k +=+)()1( …③式中B 称为迭代矩阵,f 称为迭代向量。
对任意的初始向量)0(x,由式③可求得向量序列∞0)(}{k x ,若*)(lim x xk k =∞→,则*x 就是方程①或方程②的解。
此时迭代公式②是收敛的,否则称为发散的。
构造的迭代公式③是否收敛,取决于迭代矩阵B 的性质。
本文介绍三种解线性方程组的最主要的三种迭代法:Jacobi 迭代法,Gauss-Seidel 迭代法和SOR 迭代法。
本文结构如下:第二部分介绍Jacobi 迭代法及其数值实验,第三部分介绍Gauss-Seidel 迭代法及其数值实验,第四部分介绍SOR 迭代法及其数值实验,第五部分总结。
二. 雅克比(Jacobi )迭代法1. 雅克比迭代法的格式设有方程组),,3,2,1(1n i b x aj j nj ij==∑= …①矩阵形式为b Ax =,设系数矩阵A 为非奇异矩阵,且),,3,2,1(,0n i a ii =≠从式①中第i 个方程中解出x ,得其等价形式)(111j nj j ijiii x ab a x ∑≠=-= …②取初始向量),,,()0()0(2)0(1)0(n x x x x=,对式②应用迭代法,可建立相应的迭代公式:)(111)()1(∑≠=++-=nj j i k j ij ii k ib x a a x …③ 也可记为矩阵形式:J x J k F B xk +==)()1( …④若将系数矩阵A 分解为A=D-L-U ,式中⎪⎪⎪⎪⎪⎭⎫ ⎝⎛=nn a a a D2211,⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛=--0000121323121nn n n a a a a a a L ,⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛=--0000122311312n n n n a a a a a a D 。
Gauss-Seidel迭代法是解线性方程组的一种常用方法,它通过不断迭代更新解向量,逐步逼近方程组的精确解。
在实际应用中,我们往往需要判断迭代法是否收敛,以保证计算结果的准确性和可靠性。
本文将以matlab为例,介绍如何利用数值计算软件对Gauss-Seidel迭代法的收敛性进行判断,并对其进行详细分析和讨论。
一、Gauss-Seidel迭代法简介Gauss-Seidel迭代法是一种逐次迭代的线性代数方法,用于求解线性方程组Ax=b的解向量x。
它的迭代更新公式为:xn+1i=1/aii(bi-∑(j=1,j≠i)n aijxj)其中,i=1,2,...,n;n为方程组的阶数;aii为系数矩阵A的第i行第i 列元素;bi是方程组右端的常数;xj为解向量x的第j个分量;∑(j=1,j≠i)n aijxj为除去第i个分量的求和。
通过不断迭代更新解向量的各个分量,最终可以逼近线性方程组的解。
二、Gauss-Seidel迭代法的收敛性判断针对Gauss-Seidel迭代法的收敛性判断,我们可以利用数值计算软件matlab进行分析。
在matlab中,可以使用以下命令进行Gauss-Seidel迭代法的计算:function[x,k]=GaussSeidel(A,b,x0,tol,maxk)n=length(b);x=x0;for k=1:maxkx0=x;for i=1:nx(i)=1/A(i,i)*(b(i)-A(i,:)*x+x(i));endif norm(x-x0,inf)<tolreturn;endenderror('达到最大迭代次数,方法未收敛');end在上述matlab代码中,A为系数矩阵,b为右端常数向量,x0为初始解向量,tol为迭代精度,maxk为最大迭代次数。
在函数中,我们设定了最大迭代次数以及迭代精度的条件,当满足这些条件时,算法将停止迭代。
三、Gauss-Seidel迭代法的收敛性分析Gauss-Seidel迭代法的收敛性与系数矩阵A的性质有关。
利用超松弛迭代法求解问题在电场中,利用有限差分法求解场域中各个节点的点位。
其中求解差分方程组的解运用到了超松弛方法。
超松弛方法是高斯—塞德尔迭代法的变形。
它在迭代过程中,为了加速收敛,再把所得结果依次带入进行计算的同时,还使用把每一次迭代的变化量加权后再代入的方法。
运用超松弛迭代法求解下述问题:试用超松弛迭代法求解接地金属槽内的电位的分布。
已知:A=4CM,H=A\4=10CM给定边值:如图示;给定初值:Φ=0误差范围:E=10^-5计算:迭代次数N=?,Φ的分布。
分析:(1)、节点按从下到上,从左到右的顺序排列。
(2)、按高斯—塞德尔迭代公式进行迭代。
(3)、选择加速因子Α,且A在1到2之间。
以下为该题程序段:#INCLUDE <IOSTREAM.H>#INCLUDE<MATH.H>#INCLUDE<IOMANIP.H>BOOL SUCCESS(DOUBLE A[5][5][2], DOUBLE B) 构建函数其中DOUBLE A 代表记录数据前后两次的值。
{INT I,J;FOR (I=1;I<5;I++)FOR (J=1;J<5;J++) 依次对定义数组赋值{IF ( FABS(A[I][J][1]-A[I][J][0]) > B ) 误差在题设范围内则返回值TRUERETURN TRUE;} 否则返回FALSE RETURN FALSE;}INT MAIN(){INT N,I,J;DOUBLE A[5][5][2];DOUBLE B;B=0.00005;DOUBLE S=1.21;WHILE (1){N=0;COUT<<"输入加速因子数值(1<= A < 2 ) "<<ENDL; 输入题设CIN>>S;FOR(I=0;I<5;I++)FOR(J=0;J<5;J++){A[I][J][0]=0;A[I][J][1]=0;}FOR (I=0;I<5;I++){A[I][4][0]=100;A[I][4][1]=100;}WHILE ( N==0 || SUCCESS(A,B)){FOR(I=1;I<4;I++)FOR(J=1;J<4;J++){A[I][J][0]=A[I][J][1];A[I][J][1]=A[I][J][1]+(A[I-1][J][1]+A[I+1][J][1]+A[I][J+1][1]+A[I][J-1][1] [I][J][1]*4)*S/4; 由高斯—塞德尔迭代公式写出相应公式。
线性⽅程组的J-迭代,GS-迭代,SOR-迭代,SSOR-迭代⽅法西京学院数学软件实验任务书【实验课题】雅克⽐迭代、⾼斯—赛德尔迭代、超松弛迭代【实验⽬的】学习和掌握线性代数⽅程组的雅克⽐迭代、⾼斯—赛德尔迭代、超松弛迭代法,并且能够熟练运⽤这些迭代法对线性⽅程组进⾏求解。
【实验内容】 1、问题重述:对于线性⽅程组A b X =,即:1111221n 12112222n 21122nn n n n n n na x a x a xb a x a x a x b a x a x a x b +++=??+++=??+++= (1),其中,111212122111 0 - - 0 - 0 0 () - - - 0 n ij n nn n nn nn a a a a a a a a a a ?--A ==--??0n D L U≡--()1,n b b b T=如何运⽤雅克⽐迭代、⾼斯—赛德尔迭代、超松弛迭代法对线性⽅程组进⾏求解。
2、⽅法原理: 2.1雅克⽐迭代迭代思想:⾸先通过A b X =构造形如()x f x =的等式,然后给定⼀个初值(0)(0)(0)(0)12(,,)n x x x X = ,再通过(1)()()k k f +X =X 进⾏迭代。
step1 :对(1)相应第i ⾏中的i x ⽤其它元素表⽰为:11111121111122,12211111()()11()()11()()n nj j j j j j n ni i ij ji j j j i j i j iin nn n nj j n n nj j j j nn nn x b a x x b a x a a x b a x x b a x a a x b a x x b a x a a ===≠=-==?=-=+-??=-=+-??=-=+-∑∑∑∑∑∑即:()D b L U X =-+XStep 2 :进⾏迭代(0)(0)(0)(0)12(1)11()(,,)()n k k x x x D b D L U +--?X =?X=-+X ? ,0,1,2k = ,取它的判断条件为()(1)k k -X -X ⼩于⼀个确定的误差值ε,跳出循环。
Jacobi 迭代法与Gauss-Seidel迭代法算法比较目录1 引言 (1)1.1Jacobi迭代法 (2)1.2Gauss-Seidel迭代法 (2)1.3逐次超松弛(SOR)迭代法 (3)2算法分析 (3)3 结论 (5)4 附录程序 (5)参考文献 (8)Jacobi 迭代法与Gauss-Seidel 迭代法比较1 引言解线性方程组的方法分为直接法和迭代法,直接法是在没有舍入误差的假设下,能在预定的运算次数内求得精确解,而迭代法是构造一定的递推格式,产生逼近精确值的序列。
这两种方法各有优缺点,直接法普遍适用,但要求计算机有较大的存储量,迭代法要求的存储量较小,但必须在收敛性得以保证的情况下才能使用。
对于高阶方程组,如一些偏微分方程数值求解中出现的方程组,采用直接法计算代价比较高,迭代法则简单又实用,所以比较受工程人员青睐。
迭代法求解方程组就是构造一个无限的向量序列,使它的极限是方程组的解向量。
即使计算机过程是精确的,迭代法也不能通过有限次算术运算求得方程组的精确解,而只能逐步逼近它。
因此迭代法存在收敛性与精度控制的问题。
迭代法是常用于求解大型稀疏线性方程组(系数矩阵阶数较高且0元素较多),特别是某些偏微分方程离散化后得到的大型稀疏方程组的重要方法。
设n 元线性微分方程组b Ax = (1)的系数矩阵A 非奇异,右端向量0≠b ,因而方程组有唯一的非零解向量。
而对于这种线性方程组的近似解,前辈们发展研究了许多种有效的方法,有Jacobi 迭代法、Gauss —Seidel 迭代法,逐次超松弛迭代法(SOR 法),这几种迭代方法均属一阶线性定常迭代法,即若系数矩阵A 分解成两个矩阵N 和P 的差,即P N A -=;其中N 为可逆矩阵,线性方程组(1)化为:b x P N =-)(b Px Nx +=b N Px N x 11--+=可得到迭代方法的一般公式:d Gx xk k +=+))1(( (2)其中:P N G 1-=,b N d 1-=,对任取一向量)0(x 作为方程组的初始近似解,按递推公式产生一个向量序列)1(x ,)2(x ,...,)k x(,...,当k 足够大时,此序列就可以作为线性方程组的近似解。
超松弛迭代法求解两点边值问题(二)超松弛迭代法求解两点边值问题(二)摘要本文是在matlab环境下熟悉的运用计算机编程语言并结合超松弛变量超松弛迭代法的理论基础对方程组求解。
首先,本文以微分方程边值问题为例,导出了离散化后线性方程组即稀疏线性方程组,转化对稀疏线性方程组求解问题。
其次,用超松弛( SOR) 迭代法编写matlab程序,对产生的稀疏线性方程组进行迭代法求解。
然后,分别改变松弛因子ω和分段数n的值,分析其收敛性和收敛速度,做出各个方面的分析和比较得到相关结论。
最后,将超松弛迭代算法在计算机上运用matlab语言实现, 得出了一组与精确解较接近的数值解,并画图比较,验证逐次超松弛( SOR) 迭代法的精确性。
关键词:稀疏线性方程组;逐次超松弛迭代法;松弛因子;matlab编程OVERRELAXATION ITERATIVE METHOD FORSOLVINGTWO-BOUNDARY VALUE PROBLEM(TWO)ABSTRACTThis is familiar with the use of computer programming in matlab language and overrelaxation variable overrelaxation iteration method of the theoretical basis of solving equations.First of all, as an example, based on differential equation boundary value problem is derived after discretization is sparse system of linear equations of linear equations, the transformation of sparse linear equations to solve the problem. Second, use write matlab program over relaxation (SOR) iteration method, the iteration method solving sparse linear equations. Then, change the values of relaxation factor and section number n omega,analyzes its convergence and convergence speed, all aspects to make the analysis and comparison of related conclusions. Finally, the over-relaxation iteration algorithm is implemented on a computer using matlab language and obtained a set of numerical solution with exact solution is close to, and draw the comparison, verification of successive overrelaxation (SOR) the accuracy of iterative method.Key words: Sparse linear system of equations;Successive over relaxation iteration method; Relaxation factor;Matlab programming目录1 绪论 (1)1.1 课题研究 (1)2课题研究方法 (2)2.1 超松弛法产生的背景 (2)2.2 超松弛迭代法理论基础 (2)3 实验过程和运行结果 (5)4 结论 (9)参考文献 (10)附录 (11)1 绪论1.1 课题研究考虑两点边值问题容易知道它的精确解为为了把微分方程离散,把区间等分,令,,得到差分方程简化为从而离散后得到的线性方程组的系数矩阵为对,,,分别用、和的超松弛迭代法求解线性方程组,然后比较与精确解的误差;探讨使超松弛迭代法收敛较快的取值,对结果进行分析;探讨在迭代过程中取4位有效数字和7位有效数字有什么不同;谈谈你的体会。
数值分析课程设计雅克比迭代、高斯赛德尔迭代、超松弛迭代求解线性方程组的雅克比迭代法、高斯-赛德尔迭代法和超松弛迭代法的算法实现学院:数学科学学院学号: 11111111111姓名: hhhhhhhhhh班级: 计算 0901实验报告一实验目的与要求(实验题目)1(分别利用雅可比迭代法和高斯-塞德尔迭代法求解以下线性方程组5,2,1,,12xxx,123 ,,1x,4x,2x,20,123 , 2x,3x,10x,3123,,4 使得误差不超过 102.用超松弛迭代法求解方程方程组:(=1.1) ,4x,x,1,12 ,,x,4x,x,4 ,123, ,x,4x,,323, ,65,10 使得误差不超过二计算公式1. 雅可比迭代法n1,1(k)(k)x,b,ax,,,iiijj,,1jaii,ji,i,1,2,...n,k,0,1,2,..., T,,,,,,,,0000,,x,x,x,...x12n其中为初始向量.2.高斯-塞德尔迭代法i,1n1(k,1)(k,1)(k),,x,b,ax,ax,,,iiijjijjj,,11j,iaii,i,1,2,?n,k,0,1,2,...,T,,,,,,,,0000,,x,x,x,...x12n其中为初始向量.3.超松弛迭代法in,1,kkkk(,1)()(,1)()xx(baxax)/a,,,,,,,,,iiiijjijjii ,jj,,11,i1,2,n,k0,1,,?,?,T,,,,,,,,0000,,x,x,x,...x12n其中为初始向量.三、实验过程(算法程序)1. 雅可比迭代法#include "stdio.h"#include "math.h"#include "string.h"void main(){int i,j,k;float m1=0.0,m2=0.0;float a[3][4]={5,2,1,-12,-1,4,2,20,2,-3,10,3};float x[3]={0.0,0.0,0.0}; for(k=1;k<=10;){for(i=0;i<=2;i++){for(j=0;j<i;j++)m1=m1+a[i][j]*x[j];for(j=i+1;j<=2;j++)m2=m2+a[i][j]*x[j];x[i]=(a[i][3]-m1-m2)/a[i][i];m1=0,m2=0;}k++;}printf("雅可比迭代法计算结果为:\n");for(i=0;i<=2;i++)printf("x[%2d]=%8.9f\n",i+1,x[i]); }程序二:#include "stdio.h"#include "math.h"#include "string.h"#define n 3void main(){int i,j,k;float m1=0.0,m2=0.0;float a[n][n+1];printf("请输入方程组的增广矩阵:");for(i=0;i<n;i++)for(j=0;j<n+1;j++)scanf("%f",&a[i][j]); float x[n]={0.0,0.0,0.0}; for(k=1;k<=10;) {for(i=0;i<=n-1;i++){for(j=0;j<i;j++)m1=m1+a[i][j]*x[j];for(j=i+1;j<=n-1;j++)m2=m2+a[i][j]*x[j];x[i]=(a[i][n]-m1-m2)/a[i][i];m1=0,m2=0;}k++;}printf("雅可比迭代法计算结果为:\n");for(i=0;i<=n-1;i++)printf("x[%2d]=%8.9f\n",i+1,x[i]);}2高斯-塞德尔迭代法#include<stdio.h>#include<math.h># define n 3void main(){int i,j,k=1;float x[n]={0,0,0},m[n]={0,0,0},s=1;float a[n][n]={5,2,1,-1,4,2,2,-3,10},d[n]={-12,20,3}; /* float a[n][n],d[n];printf("请输入方程组系数矩阵");for(i=0;i<n;i++)for(j=0;j<n;j++)scanf("%f",&a[i][j]);printf("请输入方程组右端向量");for(i=0;i<n;i++)scanf("%f",&d[i]); */printf("高斯-塞德尔迭代法运算结果为:\n");for(k=0;fabs(s-x[0])>1e-6;k++){s=x[0];for(i=0;i<n;i++){m[i]=0;for(j=0;j<n;j++) m[i]=m[i]-a[i][j]*x[j];m[i]=m[i]+d[i]+a[i][i]*x[i];x[i]=m[i]/a[i][i];}printf("Y1=%f Y2=%f Y3=%f\n",x[0],x[1],x[2]);}getchar() ;}3超松弛迭代法#include <iostream>#include <cmath>using namespace std;float *one_array_malloc(int n); //一维数组分配float **two_array_malloc(int m,int n); //二维数组分配float matrix_category(float* x,int n); int main() {const int MAX=100; //最大迭代次数int n,i,j,k;float** a;float* x_0; //初始向量float* x_k; //迭代向量float precision; //精度float w; //松弛因子cout<<"输入精度e:";cin>>precision;cout<<endl<<"输入系数矩阵的阶数,N:";cin>>n;a=two_array_malloc(n,n+1);cout<<endl<<"输入增广矩阵的各值:\n";for(i=0;i<n;i++){for(j=0;j<n+1;j++){cin>>a[i][j];}}x_0=one_array_malloc(n);cout<<endl<<"输入初始向量:\n";for(i=0;i<n;i++){cin>>x_0[i];}x_k=one_array_malloc(n);cout<<"输入松弛因子w (1<w<2):\n"; cin>>w;float temp; //迭代过程for(k=0;k<MAX;k++){for(i=0;i<n;i++){temp=0;for(j=0;j<i;j++){temp=temp+a[i][j]*x_k[j];}x_k[i]=a[i][n]-temp;temp=0;for(j=i+1;j<n;j++){temp=temp+a[i][j]*x_0[j];}x_k[i]=(x_k[i]-temp)/a[i][i];x_k[i]=(1-w)*x_0[i]+w*x_k[i];} //求两解向量的差的范数for(i=0;i<n;i++){x_0[i]=x_k[i]-x_0[i];}if(matrix_category(x_0,n)<precision) {break;}else{for(i=0;i<n;i++){x_0[i]=x_k[i];}}} //输出过程if(MAX==k){cout<<"迭代不收敛\n";}cout<<"迭代次数为:"<<k<<endl;cout<<"解向量为:\n";for(i=0;i<n;i++){cout<<"x"<<i<<": "<<x_k[i]<<endl;}return 0;}float *one_array_malloc(int n) //一维数组分配 {float *a;a=(float *)malloc(sizeof(float)*n);return a;}float **two_array_malloc(int m,int n) //二维数组分配 { float **a;int i;a=(float **)malloc(m*sizeof(float *));for (i=0;i<m;i++){a[i]=(float *)malloc(n*sizeof(float));}return a;}float matrix_category(float* x,int n){int i;float temp=0;for(i=0;i<n;i++){temp=temp+fabs(x[i]); }return temp;}四(实验结果:1.雅可比迭代法:2.高斯-塞德尔迭代法:.3.超松弛迭代法:五(实验小结通过这次上机,我学会了用J迭代法,G-S迭代法和SOR迭代法求解线性方程组,巩固了C语言程序设计算法编写,对这几种迭代方法有了更好的理解,并能通过编程和调试实现算法,完成了实验内容,收获颇丰。
高斯-塞德尔迭代法
高斯-赛德尔迭代(gauss–seidel method)是数值线性代数中的一个迭代法,可用
来求出线性方程组解的近似值。
该方法以卡尔·弗里德里希·高斯和路德维希·赛德尔命名。
同雅可比法一样,高斯-赛德尔迭代是基于矩阵分解原理。
在数值线性代数中,gauss-seidel方法也称作liebmann方法或已连续加速度方法,
就是用作解线性方程组的运算方法。
它以德国数学家卡尔·弗里德里希·高斯(carl friedrich gauss)和菲利普·路德维希·冯·塞德尔(philipp ludwig von seidel)命名,与雅基数排序方法相近。
高斯-赛德尔迭代法是解线性方程组的常用迭代法之一,设线性方程组为a1x1 +a2x2 +..+ cintn =b.s
(i= 1,2,,n),
高斯赛德尔迭代法的迭代公式,虽然它可以应用于对角线上具有非零元素的任何矩阵,但只能在矩阵是对角线主导的或对称的和正定的情况下,保证收敛。
在年,只在高斯给
他的学生gerling的私人信中提到。
年之前由塞德尔自行出版。
分别运用高斯赛德尔迭代法和超松弛迭代法解线性方程组:⎪⎪⎪⎭⎫ ⎝⎛-=⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎭⎫ ⎝⎛--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:n
x1=x0;
for j=1:n1
s=0;
for k=1:n1
if k~=j
s=s+A(j,k)*x0(k);
end
end
x0(j)=(b(j)-s)/A(j,j);
end
if norm(x1-x0)<ee
break
end
end
x=x0;
2. 超松弛迭代法
该方法是在高斯赛德尔迭代法的基础上将前一步的结果)(k i x 和)1( k i x 进行适当的线性组合以加速收敛,松弛因子ω的选择是关键,当1<ω<2时,即为超松弛迭代法。
程序代码:
function varargout=SORli(varargin)
clc
A=[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:3
fprintf('%4.2f ',x(i));
end
fprintf('\n');
function x=SOR(A,b,x0,w)
%AX=b
%x0初始点
%w 为 松弛因子
n=100;%最大迭代次数
ee=0.0001;%精度
n1=length(b);
for i=1:n
x1=x0;
for j=1:n1
s=0;
for k=1:n1
if k~=j
s=s+A(j,k)*x0(k);
end
end
x0(j)=(1-w)*x0(j)+w*(b(j)-s)/A(j,j);
end
if norm(x1-x0)<ee
break
end
end
x=x0;。