知道了程序如何侦测接触的发生,现在就是要让程序形成离散化的接触力学控制方程,所以这里我们来看控制方程的组成。为了简单起见,我们只考虑没有摩擦和粘连的情况。
上次已经说了,接触问题是一个对人类很直观但是对机器很繁琐的问题,其控制方程也不例外。我们知道固体力学基于位移的控制方程无非是下面几坨:
力平衡方程;
位移-应变方程;
本构方程;
边界条件。
在接触问题上,因为在接触面位移和力边界条件都是未知,所以以上方程我们要稍作修改。以力平衡弱形式为例,考虑接触面之后可以写成:
从左到右各项分别描述了内力,接触应力,边界条件,和体力对力平衡的贡献。因为只考虑无摩擦的情况,接触应力项只包括垂直于接触面的柯西应力分量和垂直于接触面的接触体距离的变分。这是平衡方程中唯一因为接触而添加的项。
针对接触面上的两个新的未知量,数学上有两种途径来应对:
为新的未知量添加新的约束条件。
去掉新的未知量,转而改写以上控制方程的形式。
先来看1。新的约束条件应该只施加于将会(未激活)和已经(已激活)的接触位置上。直观地看,它们大概应该是:
接触体之间的距离不为负数(没有穿透),距离为零表示接触激活;
接触体之间的接触压力不为负数(没有拉扯),压力为零表示接触未激活;
同一个位置,要么接触压力为零(接触没有激活),要么接触距离为零(接触激活)。
这些直观的条件,上个世纪初被人发现是接触问题求解的必要条件。今天通常称为Signorini条件。虽然看似浅显,实际上因为接触问题可以翻译为加上了接触面约束的对内能求变分的约束优化问题,所以Signorini条件等价于优化理论上的KKT条件,身价一下就高大上了。下次你和人家说你知道接触原理,不说你知道Signorini条件都不好打招呼。
根据以上三个约束条件,我们可以得出控制方程中第二项(接触项)恒不为正。把这个结论引入控制方程,我们就实现了上文说的途径2:把控制方程的形式从等式变为了不等式:
所以,我们得到了接触问题的两种表达方式:变分等式方程+Signorini不等式约束,和变分不等式方程。虽然两种描述是等效的,但是因为应用到数值求解还是等式形式更方便,变分不等式除了在理论和定性分析上然并卵。
求解加上了不等式约束的弱形式,优化理论的很多办法都用得上。最流行的是三种:罚函数,拉格朗日乘数,和增强拉格朗日乘数。今天最后就说说罚函数。
罚函数本质上是通过对接触压力形式的规定对Signorini条件提供一种近似。这种近似假设接触面的压力是这么一种函数形式,这个函数满足:
接触体距离大于零的时候函数值为0;
接触发生后,函数值随接触穿透距离而单调增加。
对比一下上文的三个条件,可以发现这样的压力函数和接触体距离关系除了违反“没有穿透”的条件,其他的都满足。为了补偿穿透的条件,罚函数本质上给接触面安了(多)个弹簧,来尽量实现接触体的分离。弹簧的弹性模量由压力函数决定,所以罚函数法的性能直接决定于这个函数的形式。罚函数法是最早应用于接触问题的算法,所以现今所有通用有限元程序都应用了它。所以,下次答辩或者面试,有人问你接触方程罚函数法的原理,请稳稳道出两个词:“Signorini”和"弹簧"。
本文转自【有限元科技】