今天,我接着分享Matlab有限元编程专业技能。之前的课程我们学习了一维梁单元,二维平面单元,三维板壳单元的matlab有限元编程,本次案例主要讲解如何用matlab实现针对四面体单元划分的三维结构进行有限元编程,具体案例是一个悬臂梁受集中荷载的问题。图1为本案例Matlab编程计算得到的结果。主要内容涉及四面体单元的有限元基本理论的推导,主要是单元刚度矩阵的推导,此外还包括等参单元和Hammer数值积分以及三维问题的后处理计算。
一个完整的有限元程序基本组成部分包括前处理模块、分析主程序模块和后处理模块。在前处理模块中,实现节点坐标输入、单元节点编号、网络划分以及边界条件输入等工作;在分析主程序模块中,求解整体刚度方程;在后处理模块中,实现结果显示、数据输出等工作。
对应的有限元法的基本步骤:
(6)计算单元的其他物理量(应力应变)。
这几步中,最核心的内容是单元研究,具体包括:
(3)单元刚度方程(基于能量原理推导)。
需要说明的是后文的四面体单元有限元方程的推导过程是基于等参单元的基本理论从局部坐标(自然坐标、体积坐标)出发来推导四面体单元的刚度矩阵,因为这样做比较规范自然,推导过程也适用于其他类型单元。但是因为四面体单元相对简单也可以直接从直角坐标(全局坐标)进行推导,具体推导过程可参考清华大学曾攀老师的课程,直接从直角坐标(全局坐标)进行推导的过程省去了等参单元雅各比矩阵呀等坐标系映射的各种概念,理解起来相对容易。
公式(1)-(3)为弹性力学中三维空间弹性问题的完整描述,分别是空间问题的平衡方程、几何方程、物理方程,这是我们推导有限元方程的基础。这些公式会在后面的有限元方程推导过程中用到。
四面体单元的坐标描述涉及了等参单元的概念,在有限元方法中,若要离散边界为曲线或曲面的求解域,需要建立将形状规则的单元变换为边界为曲线或曲面的单元的方法,在有限元法中对应此问题所采用的变换方法是等参变换,即单元几何形状的变换和单元内场函数采用相同数目的节点及相同的插值函数进行变换。四面体单元的参数坐标就是体积坐标,体积坐标的定义如图2所示。
图2 四面体单元体积坐标的定义
参数坐标系下的形函数等于对应的体积坐标,四个节点对应四个形函数,如下式,
这样就实现了自然坐标系和物理坐标系下的坐标映射,如下式,
同样形函数也可以用于物理场的插值,公式(6)是位移场的插值表达式。
有了位移场插值的表达式就可以通过公式(2)-(3)的几何方程和物理方程推导应变场和应力场的有限元表达式,但是公式(2)的几何方程中存在对于xy也就是物理坐标系下的偏导数,代入公式(6)后也就是形函数对物理坐标的偏导数,因为我们的形函数是在自然坐标系下定义的,是关于ξ, η, ζ的函数,想要知道他对x,y的偏导,这里利用了链式求导法则,即可建立如下式(7)所示的形函数对自然坐标的物理坐标偏导数的映射关系。中间的这个矩阵就叫Jacob矩阵。
如何求Jacob矩阵呢?将公式(5)代入公式(7)可以得到如下式(8)所示的自然坐标偏导矩阵乘以一个坐标矩阵,
得到jacob矩阵后求逆,再乘以自然坐标偏导矩阵就可以得到形函数对物理坐标的导数。如下式(9),
上述形函数对物理坐标的导数的求解过程对应的matlab代码如下:
function [NDxyz,JacobiDET] = ShapeFunction(ElementNodeCoordinate)
%计算形函数及形函数对局部坐标ksi eta zeta的导数
NDL = [-1 1 0 0;-1 0 1 0;-1 0 0 1];%3*4 [N1Dksi N2Dksi N3Dksi N4Dksi;N1Deta N2Deta N3Deta N4Deta……]
Jacobi = NDL*ElementNodeCoordinate;%计算雅可比矩阵3*4 4*3
JacobiDET = det(Jacobi);%计算雅可比行列式3*3 [DxDksi DyDksi DzDksi;DxDeta……
JacobiINV=inv(Jacobi);%对雅可比行列式求逆3*3
NDxyz=JacobiINV*NDL;%利用雅可比行列式的逆计算形函数对结构坐标的导数[DN1Dx DN2Dx DN3Dx;DN1Dy DN2Dy DN3Dy;……]
end
其中,对应的B矩阵如下式所示:
单元刚度矩阵确定好之后,将其按照自由度索引组装到全局刚度矩阵中,组装的核心思想就是确定好每个单元中的每个节点中的每个自由度在整体刚度矩阵中的位置即可。
整体刚度矩阵确定之后,就是荷载向量p的定义,这个很简单,只要依次确定每个节点每个自由度的外力荷载即可。
刚度矩阵和荷载向量确定后接下来就是边界条件的施加,大家最熟悉的可能就是直接划行划列的方法,这个方法的弊端在于划去自由度为零的行列之后,整体单元刚度矩阵的编号以及自由度编号都会改变,对于大规模计算非常不方便,影响计算效率。为了解决这个问题出现了乘大数法和置一法,置一法只能解决零边界问题,乘大数法可以解决零边界和非零边界,应用非常广泛。边界条件的施加这里我们采用乘大数法。针对边界条件采用乘大数法施加边界的方式为:在自由度上乘以一个很大的数a,然后在相应的外力向量对应的自由度上乘以,具体如下式(22)所示
为了验证乘大数法的可靠性,将对应行列写成代数表达式的形式,如下式所示
考虑到远大于,所以公式(13)可以写成,
即可得到。可见乘大数法与实际边界条件是等价的。
施加了边界条件的刚度矩阵K与荷载矩阵p之后,可直接利用matlab中的高斯消去法 计算符“\”,完成位移的求解,即u=K\p。
求出节点位移之后通常我们做受力分析时还会需要知道应力应变的分布情况,具体通过下述公式求解:
对应的提取应力和应变的后处理代码如下:
计算形函数导数
~] = ShapeFunction(ElementNodeCoordinate);%[DN1Dx DN2Dx DN3Dx;DN1Dy DN2Dy DN3Dy;……]
ElementNodeDisplacement=U(ElementNodeDOF);%12*1 节点位移列阵
ElementNodeDisplacement=reshape(ElementNodeDisplacement,Dof,4);%3*4
计算单元应变 Strain3_3 3*3的应变矩阵
Strain3_3=ElementNodeDisplacement*NDxyz';%高斯积分点处应变 3*4 4*3
%把单元应变矩阵改写成6*1
Strain=[Strain3_3(1,1) Strain3_3(2,2) Strain3_3(3,3) ...
Strain3_3(1,2) Strain3_3(2,1)....
Strain3_3(1,3) Strain3_3(3,1)]';
6,1) = D*Strain;%高斯积分点处应变 :
图4 位移云图
此外,为帮助大家更好的入门学习Matlab有限元编程分析能力,欢迎大家在文章末尾评论,在附件下载以下资料。
我的Matlab有限元编程精品课
本课程为matlab有限元编程专题课,课程主要以案例的形式进行讲解,中间会穿插案例中所涉及到的有限元基本理论,案例不局限于力学问题的有限元求解,还会涉及传热学、电学等问题的有限元求解。
因为固体力学领域我最熟悉,所以我们从固体力学开始,所涉及的单元有杆单元,梁单元,平面三角形单元,薄板单元,厚板单元,四面体实体单元等等,力学问题有静力学问题,也有动力学问题,后期还会涉及材料非线性、几何非线性、接触非线性等非线性问题,内容丰富,不断更新完善。
此外,笔者为所有订阅用户提供知识圈答疑服务和VIP用户交流群。并附赠课程相关资料等(平台支持自行开具电子发票)。
为订阅用户提供知识圈答疑服务,并建立VIP用户交流群,后续可根据订阅用户需求进行加餐直播。此外还提供课程对应的学习资料模型一份。
理工科院校学生和教师;
学习型仿真设计工程师;
Matlab有限元编程兴趣爱好者和应用者。