提高非线性稳态模型的收敛性
非线性可能是由控制方程,或将材料属性、载荷、边界条件定义为与解有关的变量等方法引入到模型中。多物理场问题往往都具有非线性,一般具有非线性的稳态(非时变)模型的收敛速度可能会非常缓慢。这篇文章,我们将概述一些可用于在求解非线性稳态模型时提高收敛性的方法。
提高收敛性的方法
本文提供的指导特定用于使用迭代方法进行求解的情况,即采用牛顿法的求解算法。简单地说,在求解时软件会从用户指定的初始值(可在初始值节点中找到)开始计算所有与解相关的项,得到一个初始解,然后在此基础上反复迭代计算,并考虑这些中间解对非线性的影响。
当连续迭代计算出的解之间的差异足够小或残差足够小时,就可以认为在指定的容差范围内达到收敛。对于一个适定的问题,有可能会遇到初始值较差、非线性求解器无法通过反复迭代近似求解,或者网格不够精细以至于无法正确得到解在空间上的变化和分布等问题,求解器可能会收敛得很慢(或者根本收敛不了)。下面的讨论就是一些针对这种情况可以采用的措施。
指定初始值
大多数物理场接口中因变量的默认初始值为零,传热接口是一个例外,其温度场的默认初始值为 293.15 K, 或 20°C。
当初始值不能为前面描述的迭代方法提供一个良好的起点时,收敛性可能会很差。如果对物理场的解有比较好的估计值,可将其作为表达式输入初始值编辑框。不过,除了一些热学问题,通常很难估算解,因此仍需要采用其他方法。
载荷递增
一般来说,如果非线性系统的载荷为零,那么系统将处于静止状态,解也将为零。如果施加的载荷很小,初始值为零几乎总是合理的。从零值初始条件开始,如果施加的载荷足够小,非线性求解器很可能会收敛。因此我们可以通过一种称为载荷递增的求解策略来利用这一点,即逐步增加非线性系统的载荷,并重新计算模型,直到达到总载荷为止。这种载荷递增法也被称为连续加载法。
要实现这一点,可以先求解一个载荷较小但不为零的模型。在此基础上,如果再施加一个小的载荷增量,之前计算出的解就是一个合理的初始条件。根据此逻辑进行扩展,如果求解非线性系统(如多物理场模型)上的任意载荷,就可以求解一系列载荷值逐渐增大的中间问题,然后将前一步的解作为后一步的初始条件。这种算法被称为含常数预测器的连续法(稍后将对此进行详述)。如下图所示,在使用辅助扫描研究扩展时,默认情况下会启用连续法。

辅助扫描可用于对任意参数执行单调扫描。
通过在参数列表的全局定义节点下进行定义,将一个全局参数(如上图所示,参数P)引入模型。然后,该参数将从几乎为零的值上升到 1,通过乘上这个参数,就可以在物理场接口中控制载荷的逐步加载。

另一个版本的在金属冷却和凝固教程模型中使用的逐步递增升温的加载参数 dT。

参数dT用于流体传热接口的物理场设置。

在第一个稳态研究步骤中进行辅助扫描,通过单调加载参数dT将从 300 K 逐渐降到 75 K。
预测器控制如何确定下一个参数值的初始值,通常有三个选项:常数、线性和自动。常数预测器会将迭代中的解作为
迭代的初始值,因此使用当前参数值的解作为初始猜测,即:
也可以计算解关于连续参数的导数(在迭代处求解的),并使用它来计算新的初始值,
式中,是连续参数的步长。因此,初始猜测是根据当前参数值的解曲线的正切值计算得出的,这种方法称为线性预测器的连续法,由参数节点中的求解器配置节点控制。

进行辅助扫描时可供选择的预测器类型列表。默认设置为自动预测器。
默认的自动预测器的设置将在使用分离求解方法时使用常数预测器,而在使用全耦合方法时将使用线性预测器。关于全耦合方法和分离方法的进一步讨论请参阅这篇文章。
连续法有两个优点。首先,它在物理上很直观,通常与人们进行实验的方式相吻合。其次,如果找不到解,连续法会自动采用较小的载荷增量。举例来说,在 0.2、0.4、0.6、0.8 和 1.0 的值上递增P的过程中,非线性求解器可能无法收敛到 0.8 的值,在这种情况下,连续法将自动返回并求解 0.6-0.8 范围内的中间值。这非常有用,因为软件会返回求解器能够收敛的最大可能载荷的估计值。
操作过程
总之,为稳态非线性模型实施载荷递增的操作步骤是
- 定义一个连续参数。
- 将一个、部分或全部施加载荷乘以连续参数。
- 在稳态研究步骤中增加对连续参数的辅助扫描。
非线性递增
载荷递增技术并不总是适用于所有问题。在这种情况下,可以使用相同的连续方法对模型中的非线性因素进行递增处理。这些非线性因素可能是控制方程的结果、材料非线性表达式或物理场之间的耦合项。为了实现这种递增处理,您可以再次引入一个全局参数,并将其从 0 逐渐增加到 1,然后使用该参数修改模型中的非线性表达式。例如,假设有一个随温度变化的材料属性,如
k(T) = 10[W/m/K]*exp(-(T-293[K])/100[K]),
可以替换为表达式
k(T,P) = 10[W/m/K]*((1-P)+P*exp(-(T-293[K])/100[K])).
当P=0时,这是一个线性表达式。当P=1时,即等于原始的非线性表达式。在P值逐渐增大的过程中,连续法会使用之前的解来计算更多非线性情况的初始条件。如果定义这种非线性递增,初始情况(P=0)则为一个纯线性问题,那么就能保证在递增的第一步得到一个解。

与温度相关的材料数性k(T,P)的曲线图,表达式中包含一个递增参数P。您可以观察到材料属性的非线性如何从 0.2 逐步上升到 1.0。本文随附了该模型文件。
如果模型中存在跳变的非线性项,非线性递增是一种特别有用的技术。一个极端情况下的非线性例子是,如果您需要模拟材料属性的瞬时变化,例如
k(T) = 10[W/m/K]+10[W/m/K]*(T>400[K]).
也就是说,在温度值为400K时,材料属性会瞬间从10W/m/K变为20W/m/K。

随温度变化的材料特性k(T)图。400 K 时的瞬时变化导致该属性高度非线性。
这种情况一般很难或不可能求解,因为材料属性并不平滑。这种情况下,您可以使用非线性材料属性表达式,从一个非常平滑的函数递增到一个几乎不连续的函数。连续法将再次返回并求解递增参数的中间值,为您提供最接近突然过渡处的近似值。
我们可以使用阶跃函数在 400 K 的非线性处创建一个平滑的阶跃过渡:
材料属性中的非线性因素通过多个阶跃函数得到平滑处理。
我们还可以使用包含平滑的函数,例如分段函数:
材料属性 k(T) 的非线性是通过一个分段函数平滑出来的。该函数和用于实现平滑的阶跃函数均可在本文随附的模型文件中找到。
载荷递增和非线性递增方法可以结合使用,但开始时只对一个或几个载荷或非线性进行递增。检查求解器日志,查看连续方法是否存在返回。如果是,则可以在该范围内使用更小的增量。
操作过程
总之,在稳态非线性模型中实施非线性递增的操作步骤有:
- 定义递增参数或平滑函数。
- 将非线性系数乘以递增参数或平滑函数。
- 在稳态研究步骤中添加递增参数的辅助扫描。
或者,也可以使用函数对非线性实施平滑处理,具体步骤如下:
- 定义平滑函数
- 用平滑函数乘以非线性。
网格细化
如果载荷递增和非线性递增仍然导致收敛缓慢,另一种改善收敛的方法是细化网格。有限元网格必须足够精细,以解析目标解的空间变化。理想的情况是,在解的空间变化较快的区域使用较小的单元,而在其他区域使用较大的单元。然而,通常无法提前知道这些区域的位置。因此,建议使用自适应网格细化操作,它将仅在需要细化的区域自动细化网格,而在其他区域粗化网格。也可以手动细化网格。更多详情,请参阅执行网格细化研究.
网格细化通常需要与载荷或非线性递增相结合,可能需要进行一系列的研究。首先,从相对粗糙的网格开始进行非线性递增,然后细化网格,并在细化网格上进一步递增。本文前面重点介绍的金属冷却和凝固教程模型就是一个将非线性递增和自适应网格细化技术与多个研究步骤相结合的示例模型。
求解方法
在对非线性方程组进行迭代求解时,可以使用两种方法,即全耦合法或分离法。 全耦合法一次性求解问题中的所有未知数,而分离法则分别求解各组未知数。因此,全耦合法一般能提供最稳健的收敛性,而分离方法需要多物理场模型中的物理场之间不存在强耦合,才能稳健收敛。如果遇到收敛性问题,最佳的方法可能是切换用于求解模型方程的方法。不过请注意,这条规则偶尔也有例外。例如,k-epsilon 湍流采用分离方法求解更稳健。
要在这些求解器类型之间进行切换,请转到研究节点下的稳态求解器节点,在该节点下总是会有一个分离或全耦合功能。右键单击稳态求解器节点,添加分离或全耦合功能。

稳态求解器节点,在这里可以切换使用全耦合法和分离法。
在上述任一功能中,启用求解时显示结果选项(如下图所示)也很有帮助,可以直观地显示求解过程中的迭代情况。

求解时显示结果部分的设置。
模型检查的常规方法
如果不清楚上述任何一个策略是否有效,则应采取更常规的方法来验证模型的一般有效性,包括系统地降低模型的复杂性。这样做的目的是将模型简化到可以求解的状态,但需要线性近似值。在此基础上,在重新计算模型时,逐步重新引入模型的非线性因素,以确定导致模型求解时出现收敛问题的原因。
检查模型,找出所有引入非线性的项,如多物理场耦合、非线性材料关系和非线性边界条件。对于任何非线性因素,用合理的线性化项来替代。对模型中的每一个非线性因素重复上述步骤。关于多物理场耦合,与其使用全耦合法(默认)求解问题,不如按顺序一个物理场接着一个物理场求解问题。您也可以使用预定义耦合的手动方法来简化多物理场模型,并将其分解为多个独立的问题进行分析。这样做的目的是将模型简化到可以用线性近似方法求解的状态。如果该简化模型无法收敛,您可以参考以下学习资源:如何解决线性稳态模型不能求解的问题。
找到模型的简化可求解版本后,再逐步增加模型的复杂性,重新引入非线性和多物理场耦合。系统地使用这种技术以及前面介绍的方法,通常可以找出模型中导致问题的非线性因素,并且还可能揭示出模型本身在某些方面存在的问题。有时,降低模型的复杂度是一项相当大的挑战,最好从尽可能简单的情况开始,然后逐步提高复杂度。
切换为瞬态公式
如果您已经尝试了文中介绍的方法,并确定求解的不是一个病态的物理问题,那么您应该考虑到,非线性问题实际上可能没有稳态(时变)解。一个典型例子是流体以较高但恒定的流速在圆柱体周围流动。在流速较低时,流动解是非时变的,但在流速较高时,就会出现涡流脱落,即圆柱体后方流场时随时间变化。这类问题可以在时域中通过瞬态研究来求解。
在这种情况下,从一致的初始值逐步增加载荷将特别有帮助。随着时间逐渐增加,非线性程度并没有剧烈地加剧,但非线性的阶跃变化应该在整个仿真过程中得到平滑处理。您可以在整个仿真域中使用非常精细的网格,或者使用自适应网格细化。
拓展学习
- 载荷递增
- 博客:非线性问题的载荷递增
- 非线性递增
- 博客:如何求解经典的 CFD 基准问题:顶盖驱动空腔
- 博客:通过非线性递增改进非线性问题的收敛性
- 博客:黏度递增方法帮助提升 CFD 模型的收敛性
- 文档:COMSOL Multiphysics Reference Manual中的Specifying Discontinuous Functions章节
请提交与此页面相关的反馈,或点击此处联系技术支持。




