
隐式求解和显式求解的区别涉及较深的理论知识,但作为一名工程师,了解学习这些理论是非常有必要的。
以力学仿真分析中数值求解为例,仿真软件中显示算法和隐式算法本质上是关于微分方程的数值积分方法。计算方法本质上不是力学,而是数学。
就拿结构动力学来说,动力学方程一般是二阶常系数非齐次常微分方程,如下所示:
以上便是求解此类方程的通用理论解法。这种分类和求解方法不仅逻辑清晰,而且避免了不必要的复杂性,使得求解过程更为系统和易于理解。

动力学中的隐式和显示算法
① 显式算法
如果递推公式当前状态的值,仅由之前的状态确定,那就是显式算法,典型代表就是中心差分算法。
如软件lsdyna就是采用显示算法。显示算法的好处就是不需要迭代计算,且没有迭代的收敛性问题,但误差会累计,所以精度差一些,需要重视计算的精度问题。
举一个例子,假设一个常微分方程为:

根据上面所述,在显式算法中,把微分用有限差商代替(此处为一阶向前差商)如下:

可以得出如下递推公式:

从方程中可以看出来,每个时刻的值由上一时刻所确定,所以一步一步进行下去即可。但当时间步取得较大时,就会偏离真实值,如下图所示:
显式算法的计算过程
② 隐式算法

可以得出如下递推公式:

求解得:

所以很明显,在隐式算法中,T(k+1)时刻的值不光由T(k)时刻决定,还由当前时刻T(k+1)决定。也就是说,当前时刻的值由上一时刻和当前时刻的值共同决定。此外,隐式算法中需要求解隐式方程(就是方程的显示化)。对应此处就需要求解二次方程的根。
② 微分方程中被积函数f(x)的解析表达式结构十分复杂,更别说找原函数了,怎么办?
③ 微分方程中被积函数f(x)没有表达式,而是由测量数据或数值计算给出的数据,怎么办?
对于被积函数f(x)的表达式复杂,或函数以数据表格形式给出,可以利用数值方法求其导数,称为数值微分。即给定函数表 (xi,yi),i=0,1,2...n ,求出函数在节点 xi 处的微分或导数值。这就需要用到差分和差商的概念了。
差分(difference)又名差分函数或差分运算,差分的结果反映了离散量之间的一种变化,是研究离散数学的一种工具。它将原函数f(x) 映射到f(x+a)-f(x+b) 。差分运算,相应于微分运算,是微积分中重要的一个概念。
则称Δf(x)在每个小区间上的增量y(k+1)-y(k)k为f(x)的一阶向前差分。
同理,对于函数f(x),一阶向后差分为:
对于函数f(x),一阶中心差分为:

② 函数f(x)的差商
差商即均差,一阶差商是一阶导数的近似值。对等步长(h)的离散函数f(x),其n阶差商就是它的n阶差分与其步长的n次幂的比值。
差商的定义如下:
由前述可知,如k阶差商的k=1时,若差分取向前的或向后的,所得一阶差商就是函数的导数的一阶近似;若差分取中心的,则所得一阶差商是导数的二阶近似。
我们知道,导数的定义为:
因此,当h充分小时,就可用差商近似导数,并由泰勒公式(如下)得到余项,估算误差 :
①向前差商公式:
通过差商我们可以得到函数f(x)微分的近似表达:
其余项为(通过拉格朗日中值定理求得):
上述微分的差商近似表达为向前差商公式。
此外,差商表达式也可写成如下形式:
②向后差商:
③中心差商:
由泰勒公式得到差商公式的余项公式可以看出,用差商近似导数,其精确度与步长 h有关,h 越小近似程度越高。
中心差商公式的精确度最高。实际计算时,如果h取得过小,又会因有效数字损失(关于有效数值的问题可以查阅教材《数值计算》)而导致误差增大。
在显式求解过程中,每个增量步内不需要进行迭代求解(因为递推公式当前状态的值,仅由之前的状态确定),且无需形成切线刚度矩阵,故每个增量步内计算量相对于隐式求解方法消耗较小,一般与单元规模成正比。但增量步长也不能过大,一般不超过模型最小自由振荡周期的1/10,否则容易导致计算结果发散。
在隐式求解过程中,每个增量步都需要进行平衡迭代,需要形成切线刚度矩阵,计算量相对较大,一般与单元规模和迭代收敛速度相关。隐式求解的收敛速度和稳定性根据选择迭代方法的不同而不同。因此,需要针对模型特性选择合适的增量步长,保证计算结果的收敛。
综上,无论是显式求解还是隐式求解,都需要根据模型和求解问题合理设置分析步的增量步长和求解方法,保证分析的精度和质量。
前向欧拉:


现在以如下一个微分方程算例为例,通过向前欧拉法和向后欧拉法计算,以表明隐式算法与显示算法的区别:

① 前向欧拉法
使用前向欧拉法,根据上述微分可得:



② 向后欧拉法
使用向后欧拉法,依据上述微分可得:

③ 结果比较
假设n=30
(1)当h = 1.9时,计算结果如下图所示,显式和隐式都和理论接近:


~结语~