数值分析大作业 超松弛迭代法如何选取最佳松弛因子

合集下载

不等式约束的松弛因子

不等式约束的松弛因子

不等式约束的松弛因子
松弛因子(relaxation factor)是在使用迭代算法求解不等式约
束问题时引入的一个参数,用于平衡迭代过程中的收敛速度和精度。

在使用迭代算法求解包含不等式约束的问题时,每次迭代都需要根据当前的解更新约束条件。

但由于不等式约束的特殊性,严格满足约束条件可能导致迭代过程的收敛速度变慢甚至无法收敛。

因此,可以引入一个约束松弛因子来放宽约束条件,使得迭代过程更容易收敛。

具体来说,对于一个不等式约束条件g(x) ≤ 0,引入松弛因子
γ(0 < γ < 1),则可以将约束条件改写为g(x) ≤ σ,其中σ =
γg(x)。

通过调整松弛因子的取值,可以控制约束条件的严格
程度,从而平衡收敛速度和精度。

当松弛因子γ 非常接近0时,约束条件变得非常严格,每次迭代都必须严格满足约束条件。

这有助于确保最终解满足约束条件,但可能导致收敛速度较慢。

当松弛因子γ 接近1时,约束条件被放宽,每次迭代只需要部分满足约束条件。

这可以加快迭代过程的收敛速度,但最终解可能不完全满足约束条件。

因此,选择合适的松弛因子是一个权衡收敛速度和精度的问题。

通常需要根据具体问题的特点和要求进行调整。

超松弛迭代法

超松弛迭代法

2012-2013(1)专业课程实践论文超松弛迭代法姓名,吕永杰,0818180119,R数学08-1班一、算法理论逐次超松弛迭代法是Gauss-Seidel方法的一种加速方法,世界大型稀疏矩阵方程组的有效方法之一,它具有计算公式简单,程序设计容易,占用计算机内存较少等优点,但需要选择好的加速因子(即最佳松弛因子)。

设有方程组Ax=b, ............(1)其中A∈错误!未找到引用源。

为非奇异矩阵,且设错误!未找到引用源。

(i=1,2,......,n),分解A为错误!未找到引用源。

.. (2)设已知第k次迭代向量错误!未找到引用源。

,及第k+1次迭代向量错误!未找到引用源。

的分量错误!未找到引用源。

(j=1,2,……,i-1),要求计算分量错误!未找到引用源。

.首先用Gauss—Seidel迭代法定义辅助量错误!未找到引用源。

=错误!未找到引用源。

(错误!未找到引用源。

(i=1,2,......n).. (3)再把错误!未找到引用源。

取为错误!未找到引用源。

某个平均值(即加权平均),即错误!未找到引用源。

=(1-错误!未找到引用源。

)错误!未找到引用源。

+错误!未找到引用源。

=错误!未找到引用源。

+错误!未找到引用源。

(错误!未找到引用源。

) (4)用式(3)代入式(4)即得到解方程组Ax=b的逐次超松弛迭代公式错误!未找到引用源。

, (5)其中错误!未找到引用源。

为松弛因子,或写为错误!未找到引用源。

(6)显然,当错误!未找到引用源。

=1时,解式(1)的SOR方法就是Gauss-Seid el 迭代法。

在SOR方法中,迭代一次主要的运算量是计算一次矩阵与向量的乘法。

由式(5)可知,在计算机上应用SOR方法解方程组时只需一组工作单元,以便存放近似解.二,算法框图开始 输入x 0开始迭代for (k=0;k<m;++k )for(j+0;j<=i-1;++j) for(i=0;i<n;++i)For(j=i;j<n;++j)temp1=temp1+a i [j]*frovalue [j];x[i]=frovalue [i] +w*(b i -temp1-temp2)/a i [j];Temp2=temp2+a [i][j]*x ;结束turefalsefalseFalsetrueture三、 算法程序#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 . 用SOR方法解方程组错误!未找到引用源。

数值分析课程设计-- 松弛迭代法中松弛因子

数值分析课程设计-- 松弛迭代法中松弛因子

数值分析课程设计-- 松弛迭代法中松弛因子安徽建筑大学数值分析设计报告书题目松弛迭代法中松弛因子院系数理系专业信息与计算科学班级信息②班学号 12207210220 姓名穆海山时间 2013-12-10~2013-12-23指导教师刘华勇题目:选用Jacobi 迭代法、Gauss-Seidel 迭代法和超松弛迭代法求解下面的方程组(考虑n 等于150)123216186186186186186n n n x x x x x x --⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦=10.522.522.522.522.521⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦考虑初值的变化和松弛因子ω的变化收敛效果的影响;对上述方程组还可以采用哪些方法求解?选择其中一些方法编程上机求解上述方程组,说明最适合的是什么方法;将计算结果进行比较分析,谈谈你对这些方法的看法。

一、摘要本课程设计用matlab 就线性方程组数值方法,Jacobi 迭代法,Gauss-Seidel 迭代法,超松弛法对所设计的问题进行求解,并编写程序在Matlab 中实现,在文章中对各种迭代法进行了收敛性分析。

接着用几种不同方法对线性方程组进行求解及结果分析,最后对此次课程设计进行了总结。

关键词:线性方程组,迭代,Matlab ,结果分析二、设计目的用熟悉的计算机语言编程上机求解线性方程组。

三、理论基础对方程组 Ax b = 做等价变换 x Gx g =+ 如:令 A M N =-,则11()Ax b M N x b Mx Nx b x M Nx M b --=⇒-=⇒=+⇒=+则,我们可以构造序列 (1)() k k x G x g +=+ 若 ()*k x x →* **x G x g Ax b ⇒=+⇒= 同时:(1)()()**(*)k k k x x Gx Gx G x x +-=-=-1(0)(*)k G x x +==-所以,序列收敛0k G ⇔→,与初值的选取无关1122(,,,)nn D diag a a a =设则转化为矩阵形式(1)()1()()k k k x x D b Ax +-=+-(1)()1()1k k k x x D Ax D b +--=-+(1)1()1()k k x D D A x D b +--=-+ (1)令2112000000n n a L a a ⎛⎫ ⎪- ⎪= ⎪⎪--⎝⎭1212000000n n a a a U --⎛⎫⎪- ⎪= ⎪ ⎪⎝⎭A D L U =-- 或者 D A L U -=+故迭代过程(1)化为(1)1()1()k k x D D A x D b +--=-+ (1)1()1()k k x D L U x D b +--=++ A D L U =-- 11(),,J B D L U f D b --=+=令于是D A L U -=+1111()() , J B D L U D D A I D A f D b----=+=-=-=或者:(1)()k k J x B x f+=+(2)(0,1,2,)k =等价线性方程组为J x B x f=+Ax b =称(2)式为解线性方程组(1)的Jacobi 迭代法(J 法)J B Jacobi 为迭代法的迭代矩阵迭代矩阵 考虑迭代式(2)(1)()k k J x B x f+=+ (0,1,2,)k =即(1)1()1()k k x D L U x D b +--=++ (1)()()k k k Dx Lx Ux b +=++(,)L 注意到的形式下三角不含对角线将上式改为 (1)(1)()k k k DxLx Ux b ++=++ (3) (1)()()k k D L x Ux b +-=+D L -当可逆时 (1)1()1()()k k xD L Ux D L b +--=-+- 11(),(),G G B D L U f D L b --=-=-设得(1)()k k G Gx B x f +=+(4)(0,1,2,)k =超松弛迭代记 ()(1)()k k k x xx +∆=-则 (1)()()k k k xx x +=+∆ 可以看作在前一步上加一个修正量。

松弛因子

松弛因子

松弛因子由于流体力学中要求解非线性的方程,在求解过程中,控制变量的变化是很必要的,这就通过松弛因子来实现的.它控制变量在每次迭代中的变化.也就是说,变量的新值为原值加上变化量乘以松弛因子.如:A1=A0+B*DETAA1 新值A0 原值B 松弛因子DETA 变化量松弛因子可控制收敛的速度和改善收敛的状况!为1,相当于不用松弛因子大于1,为超松弛因子,加快收敛速度小于1,欠松弛因子,改善收敛的条件一般来讲,大家都是在收敛不好的时候,采用一个较小的欠松弛因子。

Fluent里面用的是欠松弛,主要防止两次迭代值相差太大引起发散。

松弛因子的值在0~1之间,越小表示两次迭代值之间变化越小,也就越稳定,但收敛也就越慢。

a 亚松驰因子1、亚松驰(Under Relaxation):所谓亚松驰就是将本层次计算结果与上一层次结果的差值作适当缩减,以避免由于差值过大而引起非线性迭代过程的发散。

用通用变量来写出时,为松驰因子(Relaxation Factors)。

《数值传热学-214》2、FLUENT中的亚松驰:由于FLUENT所解方程组的非线性,我们有必要控制的变化。

一般用亚松驰方法来实现控制,该方法在每一部迭代中减少了的变化量。

亚松驰最简单的形式为:单元内变量等于原来的值加上亚松驰因子a与变化的积分离解算器使用亚松驰来控制每一步迭代中的计算变量的更新。

这就意味着使用分离解算器解的方程,包括耦合解算器所解的非耦合方程(湍流和其他标量)都会有一个相关的亚松驰因子。

注:在FLUENT中,所有变量的默认亚松驰因子都是对大多数问题的最优值。

这个值适合于很多问题,但是对于一些特殊的非线性问题(如:某些湍流或者高Rayleigh数自然对流问题),在计算开始时要慎重减小亚松驰因子。

使用默认的亚松驰因子开始计算是很好的习惯。

如果经过4到5步的迭代残差仍然增长,你就需要减小亚松驰因子。

有时候,如果发现残差开始增加,你可以改变亚松驰因子重新计算。

数值计算方法 松弛迭代法 - 松弛迭代法

数值计算方法 松弛迭代法 - 松弛迭代法
n
n1
(k 1)
1
n2
(k 1)
2
b x
( k 1)
n,n1 n1
g n
x
(
0
)
( x1(0) ,
,
x(0) n
)T
,
xi
x (k1) i
x(k) i
xi
(bi
i 1
a x (k1) ij j
n
aij
xj(k) )
/
aii
x(k) i
ji
j i 1
i 1
n
(bi
aij
x (k1) j
aij
x
(k j
)
)
/
aii
.
(2.13)

j1
ji1

(2) 再由xi(k ) 与x~i(k1) 加权平均定义xi(k1) ,即
x(k1) i
(1 )xi(k)
x(k1) i
x(k) i
( xi(k1)
xi(k) )
(2.14)
将(2.13)代入(2.14)得到解 Ax b 的SOR迭代公式.
第 六
线性插方程值组的法迭代解法

主讲教师:刘春凤
1 迭代法原理
2 Jacobi迭代法 3 高斯-塞德尔迭代法 4 松弛迭代法
5 迭代法的收敛性与稳定 性
松弛法的基本思想 松弛法的矩阵表示 松弛法的程序 迭代法收敛性的其它判定方法
松弛法的基本思想
为Gauss-Seidel 迭代法加速
记:x x1 , x2 , , xn T x(k1) x(k)

可以把 x 看作Gauss-Seidel 迭代的修正项,即第k次

松弛因子

松弛因子

松弛因子由于流体力学中要求解非线性的方程,在求解过程中,控制变量的变化是很必要的,这就通过松弛因子来实现的.它控制变量在每次迭代中的变化.也就是说,变量的新值为原值加上变化量乘以松弛因子.如:A1=A0+B*DETAA1 新值A0 原值B 松弛因子DETA 变化量松弛因子可控制收敛的速度和改善收敛的状况!为1,相当于不用松弛因子大于1,为超松弛因子,加快收敛速度小于1,欠松弛因子,改善收敛的条件一般来讲,大家都是在收敛不好的时候,采用一个较小的欠松弛因子。

Fluent里面用的是欠松弛,主要防止两次迭代值相差太大引起发散。

松弛因子的值在0~1之间,越小表示两次迭代值之间变化越小,也就越稳定,但收敛也就越慢。

a 亚松驰因子1、亚松驰(Under Relaxation):所谓亚松驰就是将本层次计算结果与上一层次结果的差值作适当缩减,以避免由于差值过大而引起非线性迭代过程的发散。

用通用变量来写出时,为松驰因子(Relaxation Factors)。

《数值传热学-214》2、FLUENT中的亚松驰:由于FLUENT所解方程组的非线性,我们有必要控制的变化。

一般用亚松驰方法来实现控制,该方法在每一部迭代中减少了的变化量。

亚松驰最简单的形式为:单元内变量等于原来的值加上亚松驰因子a与变化的积分离解算器使用亚松驰来控制每一步迭代中的计算变量的更新。

这就意味着使用分离解算器解的方程,包括耦合解算器所解的非耦合方程(湍流和其他标量)都会有一个相关的亚松驰因子。

注:在FLUENT中,所有变量的默认亚松驰因子都是对大多数问题的最优值。

这个值适合于很多问题,但是对于一些特殊的非线性问题(如:某些湍流或者高Rayleigh数自然对流问题),在计算开始时要慎重减小亚松驰因子。

使用默认的亚松驰因子开始计算是很好的习惯。

如果经过4到5步的迭代残差仍然增长,你就需要减小亚松驰因子。

有时候,如果发现残差开始增加,你可以改变亚松驰因子重新计算。

超松弛迭代法(SOR方法)

超松弛迭代法(SOR方法)

解:SOR迭代公式
x1( k
1)
(1 )x1(k )
4
(10 2x2(k )
4x3(k ) )
x
(k 2
1)
(1 )x2(k )
17
(3
2
x1(
k
1)
10x3(k ) )
x3( k
1)
(1 )x3(k )
9
(7 4x1(k 1)
10
x
(k 2
1)
)
初值 x (0) (0,0,0)T k = 0,1,2,…,
例该4方.4程用组S的OR精法确求解解线x (性*) 方 程(2组,1,1)T
如值只果需x(0取)迭ω取代(0=,04ω21,00x(=42)即1次T1xx,要11.高4便26达x斯11,可207到—xx要达22同4塞求到x样319德精0x精x3尔度130度迭要x,(3k7代求需1) 法要x)迭(和k) 代同1一1100初6次
数值计算方法
超松弛迭代法(SOR方法) 使用迭代法的困难在于难以估计其计算
量。有时迭代过程虽然收敛,但由于收敛速 度缓慢,使计算量变得很大而失去使用价值 。因此,迭代过程的加速具有重要意义。逐 次超松弛迭代(Successive Over relaxatic Method,简称SOR方法)法,可以看作是带参 数的高斯—塞德尔迭代法,实质上是高斯-塞 德尔迭代的一种加速方法。
或 Dx(k1) (1)Dx(k) (b Lx(k1) Ux(k) )
故 (D L)x(k1) (1)D Ux(k) b
显然对任何一个ω值,(D+ωL)非奇异,(因为假设 aii 0,i 1,2,, n )于是超松弛迭代公式为
x(k1) (D L)1 (1)D U x(k) (D L)1b

matlab超松弛迭代法求方程组

matlab超松弛迭代法求方程组

一、介绍MATLAB(Matrix Laboratory)是一种用于数值计算和数据可视化的专业软件。

在MATLAB中,超松弛迭代法是解决线性方程组的一种有效算法。

本文将介绍MATLAB中超松弛迭代法的基本原理和实现方法,并给出一个具体的例子进行演示。

二、超松弛迭代法的基本原理超松弛迭代法是一种逐步迭代的算法,用于求解线性方程组。

它的基本原理是通过不断迭代更新方程组的解,直到达到满足精度要求的解。

超松弛迭代法的公式如下:X(k+1) = (1-w)X(k) + w*(D-L)⁻¹*(b+U*X(k))其中,X(k)代表第k次迭代的解向量,X(k+1)代表第k+1次迭代的解向量,D、L和U分别代表方程组的对角线元素、下三角元素和上三角元素构成的矩阵,b代表方程组的右端向量,w代表松弛因子。

超松弛迭代法的关键在于选择合适的松弛因子w,一般情况下,可以通过试验选取一个合适的值。

在MATLAB中,可以使用sor函数来实现超松弛迭代法。

三、MATLAB中超松弛迭代法的实现方法在MATLAB中,可以通过调用sor函数来实现超松弛迭代法。

sor 函数的语法格式如下:[X,flag,relres,iter,resvec] = sor(A,b,w,tol,maxit)其中,A代表线性方程组的系数矩阵,b代表右端向量,w代表松弛因子,tol代表迭代的精度要求,maxit代表最大迭代次数,X代表迭代求解得到的解向量,flag代表迭代的结果标志,relres代表相对残差的大小,iter代表迭代次数,resvec代表迭代过程中的残差向量。

以下是一个使用sor函数求解线性方程组的示例:A = [4 -1 0 -1 0 0; -1 4 -1 0 -1 0; 0 -1 4 0 0 -1; -1 0 0 4 -1 0; 0 -1 0 -1 4 -1; 0 0 -1 0 -1 4];b = [1; 0; -1; 0; 1; 0];w = 1.25;tol = 1e-6;maxit = 100;[X,flag,relres,iter,resvec] = sor(A,b,w,tol,maxit);通过调用sor函数,可以得到方程组的解向量X,迭代的结果标志flag,相对残余resrel和迭代次数iter。

松弛迭代法

松弛迭代法

松弛迭代法松弛迭代法是一种解决复杂优化问题的新方法,其主要思想是采用迭代松弛的方式来求解数学优化问题。

它可以用来解决各种非线性最优化问题,如:单纯形、线性规划、最小二乘法和二次规划等。

以下是松弛迭代法的相关算法介绍。

1.法介绍松弛迭代法是一种基于迭代松弛的数学优化方法,算法的基本步骤如下:(1)确定一个初始松弛参数,其形式为σ>0;(2)计算一个初始解Xo;(3)根据此初始解Xo,算对应的步长和梯度,令X1=Xo-*Grad(Xo);(4)重复步骤3,不断迭代,直至解变得满足优化算法的收敛条件为止;(5)输出最终的解X。

2. 优缺点松弛迭代法的优点是其高效收敛,算法简单易行,可以用来解决复杂优化问题,并且可以求得全局最优解。

另外,松弛迭代法的步长的选取简单,受到限制的条件较少,只需要给定一个初始松弛参数即可。

但是,松弛迭代法也有一定的缺点,比如:(1)算法只能求出局部最优解,不能保证全局最优解;(2)在求解复杂优化问题时,松弛参数的选取可能会影响算法的收敛性;(3)算法容易陷入局部最优解中,不能跳出局部最优解。

3.用实例松弛迭代法主要应用于复杂优化问题的求解,例如:(1)线性规划问题的求解:对于最简单的线性规划问题,给定n个未知变量,其目标函数可以表达为:min f(x)=cTx,松弛迭代法可以用来求解该问题;(2)最小二乘优化问题的求解:给定一组样本数据,其拟合模型可以表达为:min f(x)=∑||y-x||2,松弛迭代法可以用来求解该问题;(3)凸优化问题的求解:给定凸函数f(x),求解min f(x),松弛迭代法可以用来求解该问题。

4.论松弛迭代法是一种求解复杂优化问题的有效方法。

它的优点是算法简单易行,可以求得局部最优解,而且只需要给定一个初始松弛参数即可。

但它也有一定的缺点,比如不能保证全局最优解,受到步长选取影响,容易陷入局部最优解中,等等。

不过,由于松弛迭代法具有高效收敛性,可以用来求解线性规划、最小二乘法和二次规划等优化问题,它仍是一种有效的求解复杂优化问题的算法。

超松弛迭代法及其松弛因子的选取

超松弛迭代法及其松弛因子的选取

电子科技大学数值分析实验报告题目:超松弛迭代法及其松弛因子的选取学生姓名:学号:日期:年月日超松弛迭代法及其松弛因子的选取问题提出:在Gauss-Seidel 迭代法基础上,人们发现通过迭代-松弛—再迭代的方法,能更加减少计算步骤,极大的缩短计算时间,在此基础上,超松弛迭代法被学者们研究出来。

在求解大型稀疏线性方程组中超松弛迭代法得到广泛应用.而SOR 迭代方法中松弛因子ω的取值直接影响到算法的收敛性及收敛速度,是应用超松弛迭代法的关键.选择得当,可以加快收敛速度,甚至可以使发散的迭代变成收敛。

因此, 超松弛因子的选取是学者们又一个研究目标.通过一些被验证的定理,我们知道为了保证迭代过程的收敛,必须要求1<ω<2,而且松弛因子和迭代矩阵谱半径之间有着密切的联系,现今学者们已经研究出部分特殊矩阵的最优松弛因子的计算公式.对于一般的矩阵,我们也可以从松弛因子和谱半径的关系着手研究最优松弛因子的选取。

问题分析:1.超松弛迭代基本知识1.1 超松弛迭代法定义[1]超松弛(Successive Over Relaxation)迭代法,简称SOR 迭代法,它是在Gauss-Seidel 法基础上为提高收敛速度,采用加权平均而得到的新算法.设解方程组的Gauss-Seidel 法记为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 na -++==+=--=∑∑ (1)再由()k i x 与(1)k i x +加权平均得(1)(1)(1)()()()(1)(),1,2,,k k k k k k i i i ii x x xx x x i nωωω+++=-+=+-=这里ω>0称为松弛参数,将(1)代入则得1(1)()(1)()11(1)(),1,2,,i nk k k k iii ij jijjj j i iix x b a x a xi na ωω-++==+=-+--=∑∑ (2)称为SOR 迭代法,ω>0称为松弛因子,当ω=1时(2)即为Gauss-Seidel 法,将(2)写成矩阵形式,则得(1)()(1)()(1)()k k k k Dx Dx b Lx Ux ωω++=-+++于是得SOR 迭代的矩阵表示[3](1)()k k i x G x f ωω+=+ (3)其中1()[(1)]G D L D U ωωωω-=--+1()f D L b ωωω-=-1.2 收敛性判别条件根据迭代法收敛性定理[2],SOR 法收敛的充分必要条件为()1G ωρ<,但要计算()G ωρ比较复杂,通常都不用此结论,而直接根据方程组的系数矩阵A 判断SOR 迭代收敛性,下面先给出收敛必要条件. 定理1]4[ 设(),0(1,2,...,)n nij ii A a Ra i n ⨯=∈≠=,则解方程Ax b =的SOR 迭代法收敛的必要条件是0<ω<2. 定理2]5[ 若n nA R⨯∈对称正定,且0<ω<2,则解Ax=b 的SOR 迭代法(3)对nx R ∀∈迭代收敛.对于SOR 迭代法,松弛因子的选择对收敛速度影响较大,关于最优松弛因子研究较为复杂,且已有不少理论结果.下面只给出一种简单且便于使用的结论. 1.3 收敛速度的估计SOR 迭代法的迭代矩阵G ω与ω有关,当选取不同的ω时,其迭代速度也有所不同.因此,需要找到最优的松弛因子b ω,使对应b ω的SOR 方法收敛最快. 定理3]7[ 设n A Rn⨯∈,如果存在排列矩阵P ,使1122T D M PAP M D =其中,1D ,2D 为对角矩阵,则称A 是2-循环的.此外,若当0α≠时,矩阵11-1D U D L αα--+的特征值都和α无关,则称A 是相容次序矩阵.定理4]7[ 设n A Rn⨯∈,A 有非零的对角元,且是2-循环和相容次序的矩阵.又设1(U)J B D L -=+是方程组A x b =的Jacobi 法迭代的迭代矩阵,且2B 的所有特征值均在(0,1)上,若()1J B ρ<,记()J B μρ=,则SOR 法的最优松弛因子b ω为2211b ωμ=+-且222[4(1)],0()41,2bb G ωωμωμωωωρωωω⎧+--⎪<<=⎨⎪-<<⎩02()min ()bb G G ωωωρρ≤≤=图12 松弛因子选取方法方法思想]8[:(1)给出ω的范围,当取不同的ω值时,进行迭代,在符合同一个精度要求下依次求出谱半径的值,比较出最小的谱半径,那么这个最小的谱半径所对应的的ω,即为所求最佳松弛因子.(2)给出ω的范围,当取不同的ω值时,进行迭代,看它们在相同精度范围内的迭代次数,找到迭代次数最少的那一个,其所对应的ω即为最佳松弛因子.”2.1 逐步搜索法 算法:Step 1:读入线性方程组的系数矩阵,常数向量,初值,精度,给出ω的取值范围,以及其变化步长;Step 2:按照如下公式迭代(1)()k k i x G x f ωω+=+找出符合精度要求ε的迭代次数及谱半径;Step 3:循环迭代,最后找到最优松弛因子Step 4: 改变ω的取值范围,重新设定变化步长,重复Step2. 2.2 黄金分割法从定理4我们可以看到,最优松弛因子对应的谱半径最小,而黄金分割法对于数值求解单调函数的极小和极大值是非常方便和有效的]9[,因此,我们可以把黄金分割法应用在求最优松弛因子上,其算法与主要思想是: Step1:利用优选法思想,在)2,1(之间选取四个点,12441314141,0.618(),0.618(),2p p p p p p p p p p ==--=+-=Step 2: 分别取2p 与3p 作为松弛因子代入迭代程序,比较出最少的迭代次数,如果对2p 应的迭代次数少,则选取),(31p p 作为收敛区间,如果是对应的3p 迭代次数少,则选取),(42p p 作为收敛区间.Step 3: 在所选取的收敛区间里循环进行上述的两个步骤,直到选取出满足精度要求且2p ,3p 所对应的迭代次数差不超过某个数∆时选3p 为最优松弛因子.3 数值算例例1: 矩阵3101130000311013A -⎡⎤⎢⎥-⎢⎥=⎢⎥-⎢⎥-⎣⎦(1,2,2,1)T b =----,精度为161.0*10k k x x ---≤解法1:黄金分割法令05.0=∆,程序结果如下:由上可以看出我们只需作几次0.618法就可以找到最优松弛因子,本例中最优松弛因子0901.1=ω,迭代次数为8次.解法2:逐步搜索法,步长为0.1,21<≤ω程序结果如下:图3图3中,其横坐标表示松弛因子,纵坐标表示谱半径.也可以求出最优松弛因子为1.1,迭代次数为8.然后我们改变松弛因子区间,令1.11≤≤ω以步长为0.01来继续求更精确的松弛因子.程序结果如下:图4图4中,其横坐标表示松弛因子,纵坐标表示谱半径.这样继续缩小松弛因子范围,以更小的步长求得的最优松弛因子为1.0900,更加精确. 例2 方程组A x b =,⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡=40001-1-1-0004001-01-1-0004001-1-01-0004001-1-1-1-1-00400001-01-00400001-1-1-0040001-01-00040001-1-00004AT (2,2,0,2,2,1,1,1,1)b =.精度为161.0*10k k x x ---≤.初始迭代值为0(0,0,0,0,0,0,0,0,0)T x =.求最优松弛因子.解法1 黄金分割法令001.0=∆,程序结果如下:求得最优松弛因子为1.1772. 解法2 逐步搜索法首先以21<≤ω,步长为0.1搜索求得的最优松弛因子为1.2000,然后重新设定范围,以步长为0.01运行程序在改变范围,以步长为0.001运行,程序结果如下:求得的最优松弛因子为1.1780.由这两个例子可以看出利用黄金分割法求最优松弛因子比用逐步搜索法更加简便快速,但是用逐步搜索法步长取的很小时求得的松弛因子比黄金分割法更加精确。

(完整版)超松弛迭代法

(完整版)超松弛迭代法

7.3 逐次超松弛迭代法7.3.1 SOR 迭代公式逐次超松弛(Successive Over Relaxation)迭代法,简称SOR 迭代法,它是在GS 法基础上为提高收敛速度,采用加权平均而得到的新算法,设解方程(7.1.3)的GS 法记为(7.3.1)再由与加权平均得这里ω>0 称为松弛参数,将(7.3.1)代入则得(7.3.2)称为SOR迭代法,[WTBX]ω>0称为松弛因子,当ω=1时(7.3.2)即为GS 法,将(7.3.2)写成矩阵形式,则得即于是得SOR 迭代的矩阵表示(7.3.3)其中(7.3.4)按(7.1.7)分解,有例7.7 给定方程组解用SOR 迭代公式(7.3.2) 可得精确解,用SOR 法求解,分别取ω=1 及ω=125.取,迭代7 次后分别为若要精确到小数后7位,对ω=1(即GS法)需迭代34次,而对ω=1.25的SOR法,只需迭代14次.它表明松弛因子ω选择的好坏,对收敛速度影响很大.7.3.2 SOR 迭代法收敛性根据迭代法收敛性定理,SOR 法收敛的充分必要条件为,收敛的充分条件为,但要计算比较复杂,通常都不用此结论,而直接根据方程组的系数矩阵 A 判断SOR 迭代收敛性,下面先给出收敛必要条件.定理3.1 设,则解方程的SOR 迭代法收敛的必要条件是0< ω<2.证明由SOR 迭代矩阵的表达式(7.3.4)于是另一方面,设的特征值为,由特征根性质,有若SOR 法收敛,则,由,则得0<ω<2.证毕.定理 3.2 若对称正定, 且 0<ω<2,则解 Ax=b 的 SOR 迭代法 (7.3.3)对 迭代收敛. 证明 设 的特征值为 (可能是复数 ),对应特征向量 x ≠0,由(7.3.4) 得因 为实对称矩阵,故 , 上式两边与 x 作内积,得(7.3.5)因A 正定,故 D 也正定,记 .又记 , ,由复内积性质得于是由 (7.3.5) 有由于 A 正定及 0< ω<2,故于是注:当 ω=1时 SOR 法即为 GS 法,故 GS 法也收敛,此即为定理 2.5(1)的结论 .对于 SOR 迭代法,松弛因子的选择对收敛速度影响较大,关于最优松弛因子研究较为复杂,且已有不少理论结果 .下面只给出一种简单且便于使用的结论 定理 3.3 设 为对称正定的三对角矩阵, 是解方程 (7.1.3)的 J 法迭代矩阵,若,记 ,则 SOR 法的最优松弛因子 为(7.3.7),如图 7-1 所示 .由(7.3.7)可知,当 ω=1,时,收敛速度为(7.3.6)根据定理,说明 GS 法比 J 法快一倍 .例 7.8 对例 7.7 中的方程组,用 SOR 迭代法求最优松弛因子 ,并研究其收敛速度 解 由于是对称正定的三对角矩阵, SOR 迭代收敛 .故,而 SOR 最优松弛因子,故它收敛很快,实际计算时迭代 14 次可达到小数后 7 位精度.故 .若要使误差,由,取 k=12 即可 .例 7.7 中取 ω=1.25 已近似对ω=1的GS 法,由达到与SOR 法的同样精度迭代次数故k≈34与实际计算结果相符讲解:SOR 迭代法只是GS法与归值的加权平均,计算公式为(7.3.2),迭代矩阵为(7.3.4),通常只是对A 对称正定的方程组使用SOR 法,而松弛因子ω选择较困难,一般选择对于A 为对称正定的三对角阵则最好最有因子为,其中为J 法的迭代矩阵。

五迭代法的迭代速度及松弛因子的确定

五迭代法的迭代速度及松弛因子的确定

数值计算方法




实验序号:实验三
实验名称:用幂法(逆幂法)的实现
求矩阵所有的特征值
实验人:
专业班级:06信息与计算科学
学号:
实验时间:2009.03.20
江西财经大学信息管理学院
1
实验三 用幂法(逆幂法)的实现求矩阵所有的特征值
一、实验目的
利用幂法(逆幂法)和位移技术探讨求矩阵A 的所有特征值。

二、实验要求
1、幂法的实现
求出矩阵A 的模最大的特征值1λ。

2、逆幂法的实现
求出的是逆矩阵1-A 的模最大的特征值1-
n λ,1-n λ的倒数即为矩阵A 的模最小
的特征值n λ。

3、位移技术的原理
若矩阵A 的特征值为λ,则I A μ-的特征值为μλ-。

(1)如果求出I A μ-的模最大的特征值σ,则σμλ+=就是A 的离μ距离最大的特征值,方法:幂法。

(2)如果求出I A μ-的模最小的特征值σ,则σμλ+=就是A 的离μ距离最小的特征值,方法:逆幂法。

4、位移逆幂法的实现
(1)使用幂法求出A 的模最大的特征值1λ,则A 的全部特征值均在区间[-1λ,1λ]上,取μ∈[-1λ,1λ],
用逆幂法求出 1)(--I A μ的模最大的特征值1-σ,即I A μ-的模最小的特征值为σ,σμλ+=就是A 的离μ距离最小的特征值。

(2)对μ∈[-1λ,1λ]进行密度较高的搜索,即可得到A 的更多的特征值。

数值分析课程设计 雅克比迭代、高斯赛德尔迭代、超松弛迭代

数值分析课程设计 雅克比迭代、高斯赛德尔迭代、超松弛迭代

数值分析课程设计雅克比迭代、高斯赛德尔迭代、超松弛迭代求解线性方程组的雅克比迭代法、高斯-赛德尔迭代法和超松弛迭代法的算法实现学院:数学科学学院学号: 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语言程序设计算法编写,对这几种迭代方法有了更好的理解,并能通过编程和调试实现算法,完成了实验内容,收获颇丰。

数值分析大作业

数值分析大作业

数值分析大作业数值分析大作业学号:*********专业:机械工程学生姓名:***2014年10月摘要:在自然科学与工程技术中,很多问题的解决常常归结为求解线性方程组Ax=b 。

随着计算机的发展,利用计算机这个强有力的计算工具去求解线性方程组是一个非常实用的问题。

在求解大型线性方程组时,直接法在多次消元,回代的过程中,四则运算的误差累计与传播无法控制,致使计算结果的精度就无法保证,特别是求解大型稀松矩阵时,还要对系数矩阵进行分解。

而迭代法相对于直接法而言,具有保持迭代矩阵不变的特点,计算程序一般也比较简单,且对于许多问题收敛速度比较快。

比较常用的迭代法有雅克比迭代法、高斯一塞德尔迭代法和逐次超松弛迭代法等,本次研究目的是通过求解一个线性方程组来比较它们的迭代效果,验证一些已有的结论。

1.数学原理1.1雅可比迭代法将线性方程组的系数矩n n ij R a A ?∈=)(分解为A=D+L+U ,其中D 是由A 的主对角元素构成的对角矩阵,L 是由A 的严格下三角部分构成的严格下三角矩阵, U 是由A 的严格上三角部分构成的严格上三角矩阵,即,2211=nn a a a D.0000,0000,1223113121,21323121==--n n n n n n n n a a a a a a U a a a a a a L若系数矩阵A 的对角元素),,2,1(0n i a ii =≠,则矩阵D 非奇异,取M=D ,N=-(L+U),则J J g x G b D x U L D x +=++-=--11)(,因而,构造的迭代法为:.),(,11)()1(b D g U L D G g x G x J J J k J k --+=+-=+=1.2高斯-赛得尔迭代法将线性方程组的系数矩n n ij R a A ?∈=)(分解为A=D+L+U 。

若系数矩阵A 的对角元素不等于0,则矩阵D 非奇异,取M=L+D ,N=-U ,则()()G G g x G b D L Ux D L x +=+++-=--11因而,构造的迭代法为:()().,,11)()1(b D L g U D L G g x G x G G G k G k --++=+-=+=1.3逐次超松弛迭代法线性方程组的系数矩n n ij R a A ?∈=)(分解为A=D+L+U 。

数值分析课程实验报告-雅可比和逐次超松弛迭代法

数值分析课程实验报告-雅可比和逐次超松弛迭代法

数值分析课程实验报告-雅可比和逐次超松弛迭代法《数值分析》课程实验报告用雅可比和逐次超松弛迭代法求解方程组算法名称用雅可比和逐次超松弛迭代法求解方程组学科专业机械工程作者姓名程习康作者学号 153711006作者班级机电院研究生15级C2班中南大学二〇一五年十二月《数值分析》课程实验报告《数值分析》课程实验报告用雅可比和逐次超松弛迭代法求解方程组实验名称成绩一、问题背景在自然科学和工程技术中有很多问题的解决常常归结为解线性方程组,例如电学中的网络问题,化学中的配平方程式模型问题,船体数学放样中建立三次样条函数问题,用最小二乘法求实验数据的曲线拟合问题,非线性方程组求解问题,用差分法或者有限元法解常微分方程、偏微分方程边值问题等都导致求解线性方程组。

在实践中,通常采用数值方法来讨论线性方程组Ax=b的解,其中迭代法是一种重要方法。

二、数学模型1.用雅可比迭代法解方程组x43024,,,,,,1,,,,,,35,1x,30 2,,,,,,,,,0,14,,,24,x3,,,,,,2.用逐次超松弛迭代法解方程组(取ω=0.7,ep=1e-5,it_max=200),3x,2x,x,,12,,123,,x,4x,x,10,,123,2x,3x,8x,3.123,精确到小数点后四位。

三、算法描述1.雅可比迭代法:首先将方程组中的系数矩阵A分解成三部分,即:A = L+D+U,如图1所示,其中D为对角阵,L为下三角矩阵,U为上三角矩阵。

之后确定迭代格式,X^(k+1) = B*X^(k)+f ,(这里^表示的是上标,括号内数字即迭代次数),如图2所示,其中B称为迭代矩阵,雅克比迭代法中一般记为J。

(k =0,1,......),再选取初始迭代向量X^(0),开始逐次迭代。

设Ax= b,其中A=D+L+U为非奇异矩阵,且对角阵D也非奇异,则当迭代矩阵J的谱半径ρ(J)<1时,雅克比迭代法收敛。

2.逐次超松弛迭代法:逐次超松弛(Successive Over Relaxation)迭代法,简称SOR迭代法,它是在GS法基础上为提高收敛速度,采用加权平均而得到的新算法,设解方程的GS法记为(1) 再由与加权平均得《数值分析》课程实验报告这里ω,0称为松弛参数,将(1)代入则得(2)该法称为SOR迭代法,ω,0称为松弛因子,当ω=1时(2)式即为高斯-赛德尔迭代法,简记GS法,将(2)写成矩阵形式,则得即于是得SOR迭代的矩阵表示(3) 其中(4)分解后,有。

CFD松弛因子的解释

CFD松弛因子的解释

1、FLUENT 中关于松弛因子的解释之五兆芳芳创作由于流体力学中要求解非线性的方程,在求解进程中,控制变量的变更是很需要的,这就通过松弛因子来实现的.它控制变量在每次迭代中的变更.也就是说,变量的新值为原值加上变更量乘以松弛因子.如:A1=A0+B*DETAA1 新值A0 原值B 松弛因子DETA 变更量松弛因子可控制收敛的速度和改良收敛的状况为1,相当于不必松弛因子大于1,为超松弛因子,放慢收敛速度小于1,欠松弛因子,改良收敛的条件一般来讲,大家都是在收敛欠好的时候,采取一个较小的欠松弛因子.Fluent里面用的是欠松弛,主要避免两次迭代值相差太大引起发散.松弛因子的值在0~1之间,越小暗示两次迭代值之间变更越小,也就越稳定,但收敛也就越慢.这个1e-3或1e-4的收敛尺度是相对而言的.在FLUENT 中残差是以开始5步的平均值为基准进行比较的.如果初值取得好,迭代会很快收敛,但是残差却依然很高;但是当你改动初场到与基准相差很大的值时,残差开始会很大,但随后却可以很快下降到很低的水平.其实两种情况下流场是基底细同的.2、FLUENT 收敛判断由此来看,判断是否收敛其实不是严格按照残差的走向而定的.可以选定流场中具有特征意义的点,监测其速度,压力,温度等的变更情况.如果变更很小,适合你的要求,便可认为是收敛了.一般来说,压力的收敛相对比较慢一些的.是否收敛不克不及复杂看残差图,还有许多其他的重要尺度,比方进出口流量差、压力系数动摇等等.尽管残差仍然维持在较高数值,但凭其他监测也可判断是否收敛.最重要的就是是否适合物理事实或试验结论.残差曲线是否满足只是一个概略的现象,还要看进口和出口总量差不得大于1%,并且即便这样子,收敛解也不一定准确,它和网格划分/离散化误差,以及物理模型的准确性都有关系.所以需要试验数据来验证.残差的大小不克不及决定是否收敛,用FLUENT计较时,一般多采取监测一个面的速度(或是压力、紊动能等参数)根本上不随着计较时间的推移而变更,就认为根本达到收敛据质量守恒,收敛时进、出口的流量数值应大致相等(一般认为进出口质量差值比上入口质量的相对值小于%时收敛,但是对特殊情况可能不合),但符号相反,一般出口流量是负值.一般在Fluent里可以添加进出口流量监控(print or plot),当残差收敛到一定程度后,还要看进出口流量是否达到稳定平衡,才可以确认收敛与否.残差在较高位震荡,需要查抄鸿沟条件是否公道,其次查抄初始条件是否适合,比方在有激波的流场,初始条件不适合,会带来流场的震荡.有时流场可能有别离或回流,这自己是非定常现象.计较时残差会在一定程度上产生震荡,这时如果进出口流量是否达到稳定平衡,也可以认为流场收敛了(前提是要消除其他不公道因数).另外Fluent缺损地采取多重网格,在计较前期,将多重网格设置为零可以避免一些波长的残差在细网格上产生震荡.初始条件要仔细选择.如果不收敛,还应试验不合的初始条件,甚至逐次改动鸿沟条件最后达到所要求的条件.3、亚松弛因子的运用在FLUENT中,所有变量的默认亚松驰因子都是对大多数问题的最优值.这个值适合于良多问题,但是对于一些特殊的非线性问题(如:某些湍流或高Rayleigh数自然对流问题),在计较开始时要慎重减小亚松驰因子.使用默认的亚松驰因子开始计较是很好的习惯.如果经过4到5步的迭代残差仍然增长,你就需要减小亚松驰因子.有时候,如果发明残差开始增加,可以改动亚松驰因子重新计较.在亚松驰因子过大时通常会出现这种情况.最为平安的办法就是在对亚松驰因子做任何修改之前先保管数据文件,并对解的算法做几步迭代以调节到新的参数.最典型的情况是,亚松驰因子的增加会使残差有少量的增加,但是随着解的进行残差的增加又消失了.如果残差变更有几个量级你就需要考虑停止计较并回到最后保管的较好的数据文件.注意:粘性和密度的亚松驰是在每一次迭代之间的.并且,如果直接解焓方程而不是温度方程(即:对PDF计较),基于焓的温度的更新是要进行亚松驰的.要查抄默认的亚松弛因子的值,你可以在解控制面板点击默认按钮.4、在进行稳态计较时候,开始残差线是一直下降的,可是到后来各类残差线都显示为波形动摇,是不是不收敛?有些庞杂或流动情况卑劣情形下确实很难收敛.计较的精度(2阶),网格太疏,网格质量太差,等都会使残差动摇.经常遇到,一开始下降,然后出现动摇,可以下降松弛系数,我的问题就能收敛,但如果网格质量欠好,是很难的.通常,计较非结构网格,如果问题比较庞杂,会出现这种情况,建议作网格时多下些工夫 .理论上说,残差的震荡是数值迭代在计较域内传递遭遇障碍物反射形成周期震荡导致的结果,与网格亚尺度雷诺数有关.例如,通常压力鸿沟是主要的反射源,换成OUTFLOW鸿沟会好些.这主要按照经验判断.网格和鸿沟条件是主要因素.5、怎样判断计较结果是否收敛1)不雅察点处的值不再随计较步调的增加而变更;2)各个参数的残差随计较步数的增加而下降,最后趋于平缓;3)要满足质量守恒(计较中不牵涉到能量)或是质量与能量守恒(计较中牵涉到能量).特别要指出的是,即便前两个判据都已经满足了,也其实不暗示已经得到公道的收敛解了,因为,如果松弛因子设置得太紧,各参数在每步计较的变更都不是太大,也会使前两个判据得到满足.此时就要再看第三个判据了.还需要说明的就是,一般我们都希望在收敛的情况下,残差越小越好,但是残差曲线是全场求平均的结果,有时其大小其实不一定代表计较结果的黑白,有时即便计较的残差很大,但结果也许是好的,关头是要看计较结果是否适合物理事实,即残差的大小与模拟的物理现象自己的庞杂性有关,必须从实际物理现象上看计较结果.比方说最近在算的一个全机模型,在大攻角情况下,解震荡得很是厉害,并且残差的量级也总下不去,但这仍然是正确的,是因为大攻角下实际流动情形就是这样的,不竭有涡的周期性脱落,流场自己就是非定常的,所以解也是动摇的,处理的时候取平均就可以.。

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

超松弛迭代法如何选取最佳松弛因子
船建学院B1301095 wj
一、课题背景
逐次超松弛迭代法是Gauss-Seidel方法的一种加速方法,是解大型稀疏矩阵方程组的有效方法之一,它具有计算公式简单,程序设计容易,占用计算机内存较少等优点,但需要选择好的加速因子(即最佳松弛因子)。

最佳松弛因子ω的确定是数值代数中的一个理论难题,对于不同的矩阵,其最佳松弛因子往往相差很大,没有统一的计算公式来确定ω。

由于对称正定矩阵sor方法收敛的充分必要条件为w在0到2之间,故利用对称正定矩阵一定收敛的性质,本文提供一种针对于系数矩阵为对称正定矩阵时,如何选取合适的最佳松弛因子的方法。

二、课题研究流程图
三、SOR迭代公式
逐次超松弛(Successive Over Relaxation)迭代法,简称SOR迭代法,它是在GS法基础上为提高收敛速度,采用加权平均而得到的新算法,设解方程的GS法记为
(1)
再由与加权平均得
这里ω>0称为松弛参数,将(1)式代入则得
(2)
称为SOR迭代法,[WTBX]ω>0称为松弛因子,当ω=1时(2)式即为GS法,将(2)式写成矩阵形式,则得

于是得SOR迭代的矩阵表示
(3)
四、Matlab程序
%sor法确定对称正定矩阵的最佳松弛因子w%
clc;clear;
n=100;
%矩阵的阶数%
for num=1:100
X=diag(rand(n,1));
U=orth(rand(n,n)-0.5);
a=U'*X*U;
%以上是利用随机对角矩阵和随机正交矩阵,产生随机的对称正定矩阵,正交变化不改变特征值%
L=zeros(n,n);
U=zeros(n,n);
%分配L和U的内存空间%
step=0.02;
%定义w的计算精度%
for k=1:(2/step) %由于对称正定矩阵sor方法收敛的充分必要条件为w在0到2之间%
w=(k-1)*step;
for i=1:n %一个总的for循环给三个矩阵赋值D-L-U=A,%
for j=1:i-1
L(i,j)=-a(i,j);%L矩阵的赋值%
end
for j=i+1:n
U(i,j)=-a(i,j);%U矩阵的赋值%
end
D(i,i)=a(i,i);%D矩阵的赋值%
end
H=inv(D-w*L)*((1-w)*D+w*U);%sor方法的核心,H矩阵为迭代矩阵%
p(k)=max(abs(eig(H)));%利用此函数求矩阵的谱半径%
end
k_min=find(p==min(p));%find函数寻找不同的w中谱半径的最小值,即寻找收敛最快的w%
w_min(num)=(k_min-1)*step;%由最小值的序号得到最优的w%
end
hist(w_min,100)%对数量足够多的随机对称正定矩阵做频率统计,w划分100份,做出统计图%
mean(w_min)%对不同矩阵的最小谱半径所对应的w对平均统计%
五、结果
对于不同阶数,计算得到的最佳收敛因子w不同,大致是随阶数增大而增大。

对不同阶数对最佳收敛因子w的平均值统计,做出的表格,如下表所示:
n阶数3阶4阶5阶6阶7阶8阶9阶10阶最佳收敛因子w 1.10 1.17 1.20 1.23 1.26 1.28 1.31 1.32
n阶数15阶20阶25阶50阶75阶100阶
最佳收敛因子w 1.39 1.43 1.47 1.62 1.65 1.68
(注:由于本人电脑运行速度有限以及学习能力和精力有限,只能算到100阶,而且在25阶以后都采用计算100个矩阵,误差会比较大。


图1、不同阶数下的最佳收敛因子w的取值图
分析:(1)最佳收敛因子w随着n阶数增大而增加;
(2)、当n比较小时最佳收敛因子w在1附近,而且增加很快;当n很大时,最佳收敛因子向2的方向发展,并逐渐收敛。

图2、N=4时最佳松弛因子的频率统计图
图3、N=5时最佳松弛因子的频率统计图
图4、N=10时最佳松弛因子的频率统计图
图5、N=25时最佳松弛因子的频率统计图
图6、N=50时最佳松弛因子的频率统计图
图7、N=100时最佳松弛因子的频率统计图
六、总结与展望
本文从研究如何确定对称正定矩阵sor迭代法的最佳松弛因子入手,由matlab构造函数产生随机对称正定矩阵,取n从3到100,计算出各个最佳松弛因子的平均值,然后做出统计表格和发展趋势曲线,由分析可得n越大最佳松弛因子也越大,但增长速度也变慢,最后会收敛到一个数。

可以对其他特殊的矩阵进行确定sor方法最佳松弛因子的研究工作,对工程上快速迭代出计算结果有重要研究价值,同时对n阶数很大的矩阵进一步计算确定其最佳松弛因子,观察其收敛性。

本文为非数学系研究僧撰写,数学系路过的大神请轻喷!(wujun)。

相关文档
最新文档