吾生有涯 学海无涯
析模有界 知识无界

小白学CFD|17 松弛迭代

小白:一张一弛,文武之道也。

小白在了解到线性方程组的迭代法求解后,课上老师又降到了松弛迭代。小白听得是云里雾里。不过小白听从牛师兄的建议,自己动手编制程序,一番折腾下来也算是小有心得。

1 松弛迭代法求解方程组

考虑线性方程组:

采用Gauss-Seidel迭代法将前面的方程组改写成迭代式:

程序代码可写成:

复制复制复制复制
复制
复制复制复制
复制
#seidel 迭代法求根def f(x1,x2,x3,count=1):     y1=0.1*x2+0.2*x3+7.2     y2=0.1*y1+0.2*x3+8.3     y3=0.2*y1+0.2*y2+8.4     if max(abs(y1-x1), abs(y2-x2), abs(y3-x3))<0.0001:           #设定精度为0.0001           print('最终结果:%.4f、%.4f和%.4f' %(y1,y2,y3))     else:           print('第%s次迭代:%.4f、%.4f和%.4f' %(count, y1,y2,y3))           x1,x2,x3,count=y1,y2,y3,count+1           return f(x1,x2,x3,count)f(3,5,5)

输出结果为:

1次迭代:8.700010.170012.1740

2次迭代:10.651811.800012.8904

3次迭代:10.958111.973912.9864

4次迭代:10.994711.996712.9983

5次迭代:10.999311.999612.9998

6次迭代:10.999911.999913.0000

最终结果:11.000012.000013.0000

可看出结果6次迭代计算收敛,得到解为(11,12,13)。

松弛迭代可以看成是高斯-赛德尔迭代的改进。一种简单的松弛迭代形式为:

小白:从松弛迭代形式可以看出,当计算收敛时,计算结果是不依赖于松弛因子w的取值的,因为当计算收敛时,括号中的值为零。

对应的程序代码:

复制复制
复制
#sor迭代法# -*- coding: utf-8 -*-#def f(x1, x2, x3, w=1, count=1):   y1 = x1-w*(x1-0.1*x2-0.2*x3-7.2)   y2 = x2-w*(-0.1*y1+x2-0.2*x3-8.3)   y3 = x3-w*(-0.2*y1 -0.2 *y2+x3-8.4)   if max(abs(y1-x1), abs(y2-x2), abs(y3-x3)) < 0.0001:       # 设定精度为0.0001       print('最终计算结果:%.4f、%.4f和%.4f' % (y1, y2, y3))   else:       print('第%s次迭代:%.4f、%.4f和%.4f' % (count, y1, y2, y3))       x1, x2, x3, count = y1, y2, y3, count+1       return f(x1, x2, x3, w, count)f(3,5,5,1) #设置松弛因子为1

运行后输出:

1次迭代:8.700010.170012.1740

2次迭代:10.651811.800012.8904

3次迭代:10.958111.973912.9864

4次迭代:10.994711.996712.9983

5次迭代:10.999311.999612.9998

6次迭代:10.999911.999913.0000

最终计算结果:11.000012.000013.0000

可看到输出结果与赛德尔迭代完全相同。

注:松弛迭代法中,当松弛因子w=1时,即为高斯-赛德尔迭代;w>1时为超松弛迭代;w<1时为亚松弛迭代。

下面改变松弛因子看看有什么不同,验证结果如下表所示。

松弛因子 
达到收敛时迭代次数
0.001
不收敛
0.01
952
0.1
124
0.5
23
0.75
13
1.0
6
1.25
9
1.518
1.75
41
2.0
不收敛

可以看到,不同的松弛因子会影响收敛的次数。

小白:在这个方程组中,松弛因子为1时收敛性表现最好。但要注意并非所有情况下都是松弛因子为1时收敛性最好。关于松弛因子与收敛性间的关系,可参阅任何一本数值分析教材。松弛因子并非越小越好,也并非越大越好,在实际计算过程中,需要根据收敛性来调整松弛因子的值。在一些方程组求解过程中,可能会出现迭代算法不稳定的情况,此时可以利用松弛因子控制方程的稳定性。

2 Fluent中的松弛因子

Fluent中采用的是亚松弛迭代。所有松弛因子取值范围为0~1

鼠标双击模型树节点Solution > Controls,即可在右侧面板中设置松弛因子。

关于Fluent中的亚松弛因子:

  • 取值范围0~1

  • 取值越大,收敛越快,计算稳定性越差;取值越小,收敛越慢,稳定性更好

  • 当残差震荡厉害时,可适当减小松弛因子;当残差曲线变化量很小且非常平缓时,可增大松弛因子

  • 只要计算收敛,松弛因子不会影响计算结果


小白系列往期列表:


小白学CFD16 代数方程组

小白学CFD15 迭代法

小白学CFD14 稳态与瞬态

小白学CFD13 空间维度

小白学CFD12 计算域

小白学CFD11 网格

小白学CFD10 编程

小白学CFD09 流程

小白学CFD08 境界

小白学CFD07 捷径

小白学CFD06 CFD

小白学CFD05 书单

小白学CFD04 路线

小白学CFD03 老蓝

小白学CFD02 开学

小白与CFD01 序章

本篇文章来源于微信公众号: CFD之道

赞(3) 打赏
版权声明:未经允许,请勿随意用于商业用途。
文章名称:《小白学CFD|17 松弛迭代》
文章链接:https://www.topcfd.cn/12810/
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
分享到

说两句 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者吧

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册