首页/文章/ 详情

攻城狮的自我修养,如何理解隐式和显式计算方法?

7月前浏览609


隐式?OR显式?怎么来的?


隐式求解和显式求解的区别涉及较深的理论知识,但作为一名工程师,了解学习这些理论是非常有必要的。


以力学仿真分析中数值求解为例,仿真软件中显示算法和隐式算法本质上是关于微分方程的数值积分方法计算方法本质上不是力学,而是数学。


就拿结构动力学来说,动力学方程一般是二阶常系数非齐次常微分方程,如下所示:



以上便是求解此类方程的通用理论解法。这种分类和求解方法不仅逻辑清晰,而且避免了不必要的复杂性,使得求解过程更为系统和易于理解。


但对于工程问题的计算求解而言,理论求解是复杂且困难的,因为大多时候没法得到理论的解析解。因此,工程中有限元计算对微分方程组的求解采取了离散化的方法,即数值解法。常用的方法包括:平衡迭代法和差分法。

在进行数值解求解时,一般把微分用有限差分代替,把导数用有限差商代替从而把数学表达的物理方程和边界条件(一般均为微分方程)近似的改用差分方程(代数方程)来表示,把求解微分方程的问题改换成为求解代数方程的问题。不同的差分或差商形式会得到不同的递推公式,从而形成不同的算法

动力学中的隐式和显示算法


① 显式算法


如果递推公式当前状态的值,仅由之前的状态确定,那就是显式算法,典型代表就是中心差分算法。


如软件lsdyna就是采用显示算法。显示算法的好处就是不需要迭代计算,且没有迭代的收敛性问题,但误差会累计,所以精度差一些,需要重视计算的精度问题。


举一个例子,假设一个常微分方程为:

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

可以得出如下递推公式:

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

显式算法的计算过程


② 隐式算法


如果递推公式是当前状态的值,同时由当前状态以及之前状态确定,那么就是隐式分析,需要求解隐式方程(就是方程的显示化)。

隐式求解过程需要迭代计算,也要进行修正误差,因此隐式算法精度较高,隐式方程最经典的就是纽马克算法,典型的有限元软件ansys,abaqus都有采用隐式算法。


同样以上面的微分方程为例,在隐式算法中,把微分用有限差商代替(此处为一阶向前差商)如下:

可以得出如下递推公式:

求解得:

所以很明显,在隐式算法中,T(k+1)时刻的值不光由T(k)时刻决定,还由当前时刻T(k+1)决定。也就是说,当前时刻的值由上一时刻和当前时刻的值共同决定。此外,隐式算法中需要求解隐式方程(就是方程的显示化)。对应此处就需要求解二次方程的根。


隐式算法是无条件收敛的,在隐式算法中,在求解二次方程的同时,一般需通过Newton–Raphson method算法对每一步进行迭代收敛的误差修整,直至收敛到指定的偏差。如下图所示:
 
隐式算法的计算过程

从以上解释可以看出,隐式和显示的根本区别在于数值计算采用的差分或差商代替微分或导数的形式不同。
那么什么是差分、差商呢?为什么要用差分、差商代替微分和导数呢?

 

差分?差商?是什么?


要回答上面的问题,这就要回到实际问题在通过数学求解时,理论求解遇到的三类问题:
① 找不到微分方程中被积函数f (x) 的原函数 F(x),怎么办?

② 微分方程中被积函数f(x)的解析表达式结构十分复杂,更别说找原函数了,怎么办?
③ 微分方程中被积函数f(x)没有表达式,而是由测量数据或数值计算给出的数据,怎么办?


要解决上述这些情况,都要求建立微分方程积分的数值近似计算方法,即建立数值积分公式

数值积分的方法或公式有:牛顿-科茨公式(梯形法则、辛普森法则、中点法则)、高斯积分、龙贝格积分、蒙特卡洛积分等。

例如基于梯形或矩形公式的机械求积公式如下:
   

   
上式中,右端公式称为左端定积分的某个数值积分公式,其中 Xk称为积分节点, Ak 为求积系数(权), 也称之为伴随节点Xk的权。Ak与Xk关而与        无关,这类数值积分方法称为机械求积。可见这种数值求积方法不需要求出原函数。    

   
上述数值积分中,它是用被积函数 f(x) 在 [a,b] 区间上的一些节点 Xk处的函数值 f(Xk)的线性组合作为定积分的近似值。    


对于被积函数f(x)的表达式复杂,或函数以数据表格形式给出,可以利用数值方法求其导数,称为数值微分。即给定函数表 (xi,yi),i=0,1,2...n ,求出函数在节点 xi 处的微分或导数值。这就需要用到差分和差商的概念了。


① 函数f(x)的差分


差分(difference)又名差分函数或差分运算,差分的结果反映了离散量之间的一种变化,是研究离散数学的一种工具。它将原函数f(x) 映射到f(x+a)-f(x+b) 。差分运算,相应于微分运算,是微积分中重要的一个概念。


我们知道,等差数列:a1 a2 a3……an……,其中an+1= an + d( n = 1,2,…n )d为常数,称为公差, 即 d = an+1 -an , 这就是一个差分, 通常用D(an) = an+1- an来表示,于是有D(an)= d , 这是一个最简单形式的差分方程。

因此,差分的定义为:设变量y依赖于自变量t,当t变到t+1时,因变量y=y(t)的改变量:Dy(t)=y(t+1)-y(t),称为函数y(t)在点t处步长为1的(一阶)差分,记作Dy1=yt+1-yt,简称为函数y(t)的(一阶)差分,并称D为差分算子。

一般函数的差分可根据形式分为:向前差分、向后差分和中心差分。

函数的前向差分通常简称为函数的差分。对于函数f(x),如果在等距节点:
 
   

则称Δ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,否则容易导致计算结果发散。


隐式求解过程中,每个增量步都需要进行平衡迭代,需要形成切线刚度矩阵,计算量相对较大,一般与单元规模和迭代收敛速度相关。隐式求解的收敛速度和稳定性根据选择迭代方法的不同而不同。因此,需要针对模型特性选择合适的增量步长,保证计算结果的收敛。


综上,无论是显式求解还是隐式求解,都需要根据模型和求解问题合理设置分析步的增量步长和求解方法,保证分析的精度和质量。

 
 
隐式和显示求解算例


向欧拉和后向欧拉分别是显式和隐式的一个典型计算方法。本文将引用这两个方法来尽量直观地展现显式求解和隐式求解的区别。

前向欧拉:

后向欧拉:


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



① 前向欧拉法

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


显然,这个式子不需要做任何额外运算就能从yn得出yn+1,因此每步计算量小。但h存在一个最大限制,具体见下面的推导过程:

可得:

可见,当|1-h|>=1时,方程将发散;需保证h<2时,整个方程才收敛。


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



这个式子不能直接得出yn+1, 必须做进一步计算得到:
   
   


当h>0时,y无条件收敛。


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

(2)当h = 2.1时,计算结果如下图所示,显式求解发散了:

~结语~


来源:薛定谔的Cube
Abaqus通用理论ANSYS有限差分
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2025-12-31
最近编辑:7月前
巴郡撸猫人
硕士 签名征集中
获赞 15粉丝 25文章 73课程 0
点赞
收藏
作者推荐

接触间隙如何处理?一个经典案例带你了解ANSYS workbench中的接触间隙处理策略

接触分析时,一个关键的前置步骤就是处理好接触的穿透和间隙。在前几期涉及案例的文章中我们主要讲了接触穿透的处理问题(详见文末推荐阅读),也在《接触仿真知多少?来看看初始接触间隙、初始穿透会造成哪些求解问题!》一文中对初始穿透和初始间隙造成的影响做了表述。本文我们来看看接触间隙的处理问题。本文中的案例源自于官方案例视频,相关文字为笔者学习时个人总结,如有不当还请指正~--01--初始接触状态和处理要求我们知道,如果初始接触间隙存在,在外载作用下可能导致模型的刚体运动。在动态分析中,刚体运动一般不会引起问题。原因在于:在结构动力学中,动力学方程在描述系统动态响应时包含了描述运动的选项。瞬态动力学方程如下:然而在静力分析中,静力学平衡方程(F=K·U)中并未包含描述运动的选项,当物体没有足够的约束时,产生刚体运动会造成刚度矩阵奇异等问题,导致计算不收敛和结果不正确。在静力学分析中,软件的“Zeroornegativepivot”零或负主元警告信息、计算结果出现不切实际的过大位移等表明有未约束的运动。因此,一般在静力学分析时,我们需要检查初始接触状态,并根据初始接触状态调整接触设置选项。ANSYSworkbench中的初始接触状态检查方法如下图所示:图1初始接触状态检查在静力学仿真中,为避免接触间隙导致刚体运动,物体仅仅由接触来约束时,必须保证接触对在初始几何中是接触的。换句话说,要建立的模型的接触对是“刚好接触(adjusttotouch)”的。这种设置是我们在处理接触时的常用做法如下图所示:图2接触表面处理选项Adjusttotouch选项表示将接触调整为刚好发生接触,这种调整不是对物理模型的调整,而是对内部的数值计算模型的调整,忽略了间隙或穿透的存在。其对应了经典版本中的KEYOPT(9)=1和KEYOPT(5)=1,如下图所示:图3KEYOPT(9)和KEYOPT(5)释义然而上述这样做也可能遇到如下一些问题:①接触体的外形常常是复杂的,很难决定第一个接触点发生在哪儿(详见后续案例,第一个接触点会影响结果);②既使实体模型是在初始接触状态,在网格划分后由于数值截断误差:两个面的单元网格之间也可能会产生小的缝隙;③接触单元和目标单元的积分点之间可能有小的缝隙。那我们如何去合理处理接触间隙呢?从前述静力学和动力学分析方程的不同可知,在处理接触间隙时,静力学分析和动力学分析的要求是不一样的,如下图所示:图4接触间隙和穿透的处理要求可以看到,在静力学分析中ANSYSworkbench软件推荐采用接触阻尼处理初始接触间隙。接下来我们就以一个官方学习案例对此进行分析。--02--销孔间隙接触分析案例一、案例概况及手动插入接触本案例中所有部件的材料都为结构钢,销子和销孔的摩擦系数为0.2。模型完全固定底座底面,在轴的中间部位施加向下1.5kN的力,如下图5所示。图5案例概况很显然,该问题为一个静力学问题,我们采用静力学模块分析。如下图所示:图6静力学分析模块材料均采用结构钢,因此此处不用修改,采用默认即可。导入模型后,双击model进入分析系统,发现二者间隙过大,软件并未侦测到接触对。图7销孔间隙遇到这种情况,我们可以手动插入接触,如下图8,采用软件自动侦测的方式创建接触对。图8手动插入接触侦测前,将“Contact”的设置选项中的“&#39;&#39;ToleranceType”改为改为输入值(Value)的方式,并输入一个较大的值(大于间隙值),如0.1,然后右键即可自动创建接触,如下图所示。图9接触侦测设置及创建接触侦测和创建成功后,我们就可以进行接触的设置了。二、接触设置及接触状态检查根据条件,将接触由绑定改为摩擦接触行为,摩擦系数0.2,设置如下:图10摩擦接触设置接下来检查接触状态,如下图所示,可以看到初始接触状态为间隙接触,接触间隙在球形区域(pinball)内部(近场接触),接触间隙约为2mm。图11接触状态检查我们间隙接触必须消除,如果我们不消除,会如何呢?三、接触间隙不消除的计算问题分析为了理解接触间隙存在造成的求解问题,此处我们按照图5所示设置约束边界条件和荷载边界条件,并划分网格(相对简单,不在具体阐述)。分析设置中我们关闭弱弹簧,打开大变形,直接求解,会出现如下图所示的病态矩阵错误提示。图12病态矩阵错误提示可以看到间隙不消除,会造成计算不收敛。具体原因笔者在《接触仿真知多少?来看看初始接触间隙、初始穿透会造成哪些求解问题!》一文已做了解释,此处不再赘述。上面分析时,我们关闭了弱弹簧,如果我们打开弱弹簧,会发生什么呢?我们将弱弹簧打开,并设置为弹簧刚度值为20N/m,如下图所示:图13弱弹簧设置再次计算,就会发现虽然收敛了,但销轴完全穿过了模型,两者没有接触上,如下图所示。圆杆与弱弹簧达成了平衡(弱弹簧已经不弱了)。求解完全是不合理的,不可接受的!图14销轴完全穿过了模型从以上不消除间隙的试算,我们可以明白消除初始接触间隙的意义,那我们如何调整呢?三、消除接触间隙的计算分析①方法一:“adjusttotouch”接触设置的分析将接触的“&#39;InterfaceTreatment”设置为“adjusttotouch”,并更新重新检查初始接触状态,如下图所示。图15adjusttotouch设置及接触状态检查可以看到,经过上述设置后,Gap值现实为零,表明初始间隙已被消除。但GeometricGap为1.9986E-3,表明初始间隙在模型上仍然是存在的。这是因为这种方式仅仅是在计算求解中从计算的内部进行的接触间隙的闭合。其计算结果如下图所示:图16计算结果可以看到,“adjusttotouch”设置实现了力的传递,得到了计算结果。但从图中圆孔处的应力云图发现(图17),此处的应力云图结果形式并不正确。其原因在于上述方式虽然在计算上强行闭合了接触,但并不是修改模型尺寸,模型仍然存在间隙,这种方式是强行将接触绑在一起传递力(类似一周圈的弹簧绑定),如下图所示,但是这种计算方式有时是不够准确的,甚至是错误的(下图应力云图不符合实际情况)。图17局部计算结果此外从上面的结果可以看到,接触并没有实现接触间隙在模型上的闭合。那么如果我们要在静力学模块中得到更准确的结果,并展示真实的间隙闭合过程,该如何做呢?②方法二:稳定阻尼系数接触设置的分析如果我们要在静力学模块中得到更准确的结果,并展示真实的间隙闭合过程,我们可以通过稳定阻尼系数去调整初始接触间隙(软件推荐方法)。本文前面已经提到,计算接触分析产生的刚体位移可能是由接触对两侧的单元网格数值舍入误差引入了小间隙或接触单元和目标单元的积分点之间存在小间隙引起。这种间隙很难通过方法一去调整。为了解决以上问题,ANSYS增加了接触阻尼功能。如下图所示:图18稳定阻尼系数选项对于标准接触KEYOPT(12)=0或粗糙接触(KEYOPT(12)=1,用户可以使用实常数FDMN和FDMT来定义沿着接触法向和切向的接触阻尼比例因子,如下图。Workbench中只给了法向的稳定阻尼系数,切向与法向存在一定关系,切向大概是法向的10%.图19稳定阻尼系数实常数ANSYS中,软件基于以下几个因素计算接触阻尼系数:①接触刚度②球形区域半径③间隙距离④子步数量⑤当前子步的时间尺度增量一般当其它初始接触调整技术没有效果或对特殊问题不合适时,可以使用稳定阻尼系数技术。对于张开接触(间隙),采用稳定阻尼系数的目的是衰减接触和目标面之间的相对运动。它提供了一定量的抗力来减少刚体运动的趋势。指定稳定阻尼系数应该足够大能防止刚体运动,但是也不能过大,必须保证能够完成求解,过大的稳态阻尼系数会影响求解精度。理想的值完全取决于具体问题,载荷步的时间和子步数量。ANSYS推荐采用稳定阻尼系数求解有初始间隙的接触问题,但稳态阻尼系数应尽量小,只要能帮助收敛即可,过大会造成接触部位接触压力降低,一般设置为0.005~0.01左右。此外,稳定阻尼系数相当于一个弹簧,因此采用稳定阻尼系数,建议把弱弹簧关闭掉。回到本例,我们采用稳定阻尼系数计算,设置如下:图20稳定阻尼系数设置重新计算后,可得到如下结果:图21稳定阻尼系数法计算结果可以看到,采用稳定阻尼系数计算圆杆与孔的间隙会发生自然的闭合,这符合实际物理现象,因此其计算也更加可信,结果也因此更准确。需要指出的是,ANSYS中接触间隙处理还有其他方法,如下图。图22初始未接触体接触分析方法各种分析方法均有其局限性,具体问题还需要结合实际情况分析采用何总方式更合适。本文中介绍的两种方法可以说是常用的,可以适应多数的需求。来源:薛定谔的Cube

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈