完成时间:2021.12.28
感谢 江南大学胡清元 老师的讲解
参考:
前言
本人是信息与计算科学专业的大四学生,因工作和毕业论文需要,所以学习有限元,本人除了高中物理以外没有任何其他力学基础,所以这是一篇纯数学和程序员向的有限元笔记,与网上其他教程不同,除去了有限元中繁冗复杂的力学方程和物理条件,只剩下数学推导和少部分的物理方程,不妥之处可以发送内容到邮箱:hi@qiql.net, 阅读本文需要你有以下学科知识:微积分、线代、数值分析 或了解以下知识点:求导、微分、链式法则、矩阵乘法、求逆、插值、二维积分、雅可比矩阵、数值积分(高斯积分)。
假如读者与我一样,无力学背景,建议读者在掌握了上述前两个知识点的情况下,先看 有限元分析:ANSYS理论与应用 第四版 这本书中的绪论部分中的第一个例子(必须能完全理解该例子,物理过程不难,有初中物理基础即可),了解一下有限元的基本思想;然后阅读《有限单元法》-- 王勖成 书中的第一章和第二章,这本书若无力学基础,读来十分晦涩,可连滚带爬往前阅读,无需过多在意其中复杂的物理方程;然后带着无尽的疑惑阅读四节点矩形单元有限元分析过程,该文为PPT,可能读者访问时链接已失效,可以向我邮件求助,该PPT讲的十分清晰,但其中的雅克比变换有些不符合常规;理清思路后,结合本文和平面四边形单元有限元实现——有限元实践笔记(6) 一起阅读,慢慢理解,注意:本文与后者中的符号有些许不同,十分容易造成阅读混乱,逻辑不清晰,读者需要仔细认真推导其中方程,不断搜索与查找,不能只看不写,哪怕抄一抄也是极好的,且后者中的雅克比矩阵部分有一些错误,推导时注意规避。
一、设位移函数
考虑如图 1 的Cook短斜梁问题:
图1 Cook 短斜梁
对其进行离散化,假如划分后的网格中的某单元如图 2 所示:
假如单元节点序号如图2所示:
图2 Cook 短斜梁中的一个单元
对于平面上的四节点单元,每个结点有两个自由度
ai=(uivi)(1.0)
即一共有 8 个结点位移
ae=⎝⎜⎜⎜⎛aiajaman⎠⎟⎟⎟⎞=[uiviujvjumvmunvn]T
设位移函数为:
{u=β1+β2⋅x+β3⋅y+β4⋅x⋅yv=β5+β6⋅x+β7⋅y+β8⋅x⋅y
或者,写为:
{δ(x,y)}=[f(x,y)]⋅{β}
整理,得到:
⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡uiviujvjumvmunvn⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤=设为A(8∗8)⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡10101010xi0xj0xm0xn0yi0yj0ym0yn0xi⋅yi0xj⋅yj0xm⋅ym0xn⋅yn0010101010xi0xj0xm0xn0yi0yj0ym0yn0xi⋅yi0xj⋅yj0xm⋅ym0xn⋅yn⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤⋅⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡β1β2β3β4β5β6β7β8⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
二、求解位移函数中的未知量
得到了 ae=A⋅β 后解之,得
{β}=A−1⋅ae(6)
将(6)式代入(4)中,得到:
{δ(x,y)}=[f(x,y)]⋅{β}=[f(x,y)]{β}⋅A−1⋅ae=[N(x,y)]⋅ae(7)
整理,得到:
{δ(x,y)}=[uv]=[Ni00NiNj00NjNm00NmNn00Nn]⋅⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡uiviujvjumvmunvn⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
其中,N(x,y)
就是 形函数,或称之为 插值函数
三、形函数的性质
N(xi,yi)=δij={10,j=i,j=i
i∑Ni(x,y)=Ni(x,y)+Nj(x,y)+Nm(x,y)+Nn(x,y)=1
即,在单元内的任意一个位置,形函数的和均为 1
在本文中,因为单元是四个结点
假如,四个结点的坐标为:
结点序号 |
x坐标 |
y坐标 |
i |
−a |
−b |
j |
a |
−b |
m |
c |
d |
n |
−c |
d |
表1,四节点单元的坐标
那么,形函数为:
⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧Ni(x,y)Nj(x,y)Nm(x,y)Nn(x,y)=41⋅(1−ax)⋅(1−by)=41⋅(1+ax)⋅(1−by)=41⋅(1+cx)⋅(1+dy)=41⋅(1−cx)⋅(1+dy)
至此,整理,得到:
u=Ni(x,y)⋅ui+Nj(x,y)⋅uj+Nm(x,y)⋅um+Nn(x,y)⋅unv=Ni(x,y)⋅vi+Nj(x,y)⋅vj+Nm(x,y)⋅vm+Nn(x,y)⋅vn
因为式中的 ui,vi(i,j,m,n) 是常数,所以位移函数是完全由形函数来决定的
对得到的形函数,验证形函数的性质(1)和性质(2)
- 验证性质(1): N(xi,yi)=δij={10,j=i,j=i
⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧Ni(xi,yi)Ni(xj,yj)Ni(xm,ym)Ni(xn,yn)=41⋅(1−a−a)⋅(1−b−b)=1=41⋅(1−aa)⋅(1−b−b)=0=41⋅(1−a−c)⋅(1−dd)=0=41⋅(1−ac)⋅(1−dd)=0
对于结点 j,m,n 同理
- 验证性质(2): ∑iNi(x,y)=Ni+Nj(x,y)+Nm(x,y)+Nn(x,y)=1
i∑Ni(x,y)=Ni+Nj(x,y)+Nm(x,y)+Nn(x,y)=41⋅(1−ax)⋅(1−by)+41⋅(1+ax)⋅(1−by)+41⋅(1+cx)⋅(1+by)+41⋅(1−cx)⋅(1+by)=41⋅[(1−by)(1−ax+1+ax)+(1−by)(1+cx+1−cx)]=41⋅[(1−by)⋅2+(1+by⋅2)=1
为方便后文叙述,以及符号规范,令 u=[uv] 即:用 u 表示位移
综上,得到:
u=N⋅ae
其中:
N=[Ni(x,y)00Ni(x,y)Nj(x,y)00Nj(x,y)Nm(x,y)00Nm(x,y)Nn(x,y)00Nn(x,y)]
四、根据几何方程求应变矩阵
几何方程的矩阵形式为:
ϵ=Lu
其中, L 为微分算子, u 为位移,在二维条件下,其值为:
L=⎣⎢⎡∂x∂0∂x∂0∂y∂∂y∂⎦⎥⎤=AT
若是在三维条件下,其值为:
L=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡∂x∂00∂y∂0∂z∂0∂y∂0∂x∂∂z∂000∂z∂0∂y∂∂x∂⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤=AT
根据(11)式、(13)式、(14)式,本文所研究问题(二维平面应力问题)的几何方程为:
{ϵ}=⎝⎛ϵxϵyγxy⎠⎞=B⎣⎢⎡∂x∂0∂x∂0∂y∂∂y∂⎦⎥⎤⋅N⋅ae=B⋅ae
其中:
- γxy 是剪应变 ϵx 和 ϵy 分别是 x 和 y 方向的正应变
- N 为形函数矩阵(2*8), 其值为:
N=[Ni00NiNj00NjNm00NmNn00Nn]
将其进行分块,不妨写为:
[NiNjNmNn]其中,Ni=[Ni00Ni],(i,j,m,n)
其中,
- ae 为单元位移列阵, B 即为应变矩阵,对形函数矩阵 N 求微分,即可得到 B
- 显然,对 N 进行分块后,对 B 也可以进行分块,不妨写为:
B=L⋅N=[BiBjBmBn]其中,Bi=⎣⎢⎡∂x∂0∂x∂0∂y∂∂y∂⎦⎥⎤[Ni00Ni]=L⋅Ni,(i,j,m,n)
五、根据物理方程求应力矩阵
弹性力学中,将应力与应变之间的转换关系也称为弹性关系。对于各向同性的线弹性材料,应力通过应变的表达式可用矩阵形式表示为:
σ=D⋅ϵ
其中,ϵ 为应变矩阵,σ 为应力矩阵,D 为弹性矩阵
D=(1+ν)⋅(1−2ν)E⋅(1−ν)=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡1(1−ν)ν(1−ν)ν000(1−ν)ν1(1−ν)ν000(1−ν)ν(1−ν)ν10000002(1−ν)1−2ν0000002(1−ν)1−2ν0000002(1−ν)1−2ν⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤
如你所见,D 是一个对称阵,作为弹性矩阵,它完全取决于弹性体材料的弹性模量 E 和泊桑比 ν 。
另外,此矩阵还有另一种表示方式,也可以采用拉梅常数 G 和 λ ,它们和 E,ν 的关系如下
G=2(1+ν)Eλ=(1+ν)(1−2ν)Eν
G 也称为剪切弹性模量,注意到:
λ+2G=(1+ν)(1−2ν)E(1−ν)
故弹性矩阵 D 亦可以表示为:
D=⎣⎢⎢⎢⎢⎢⎢⎢⎡λ+2Gλλ000λλ+2Gλ000λλλ+2G000000G000000G000000G⎦⎥⎥⎥⎥⎥⎥⎥⎤
所以,物理方程的另一种形式是:
ϵ=Cσ
其中, C 是柔度矩阵,它和弹性矩阵是互逆关系
注意:本文中在求解应力矩阵时,暂不采用柔度矩阵的方式
根据《有限单元法》一书中第 61 页的说明:
E0=Eν0=ν
E0=1−ν2Eν0=1−νv
综上,求得 D 矩阵为:
D=1−ν02E0⋅⎣⎢⎡1ν00ν0100021−ν0⎦⎥⎤
那么:
{σ}=[D]⋅{ϵ}=[S][D]⋅[B]⋅{ae}=[S]⋅{ae}
其中, S 即为应力矩阵
由于, B 可以写为分块矩阵,所以 S 也可以写为下面形式的分块矩阵:
S=D⋅B=[SiSjSmSn]其中,Si=D⋅Bi,(i,j,m,n)
注意: S 与 B 相同,也都是常量阵,但在很多情况下,不单独定义应力矩阵 S ,而直接用 DB 去计算应力
六、转换单元坐标系
虚功原理这块比较复杂,但结论是:
Ke=A∬BT⋅D⋅B⋅tdxdy
其中, t 为单元的厚度,Ke 是单元刚度阵
如果要直接在单元内进行积分,由于各个单元的形状、大小不仅相同,求解起来变得复杂,而且工程问题也不一定非要取得精确解,有误差可控的数值解就可以了,如果能将积分区域规定到一个固定的区域内,就可以采用很多现有的数值积分方法来进行快速求解,具体的说,就是致力于寻找一个映射,将原来的单元,无论形状如何,都可以映射到一个基准单元中,积分区域将由原来的单元转变为基准单元。(这段是我自己的理解)
在正式推导之前,我们需要更改原来的形函数,之前在划分单元后,每个单元的形状都不尽相同,所以位移插值函数也不同,求解效率低,通过将形状不规整的实际单元和形状规整的标准单元之间建立坐标映射关系,在标准单元上去研究它的性质,却不改变原来的问题,映射称为参数映射,单元称为参数单元,如果坐标变换和试函数里的形函数、插值节点完全相同,则变换就称为等参数变换,参数单元称等参数单元。相应的还有亚参元和超参元。
一种粗暴的变换方式是直接进行压缩,如这篇:https://www.docin.com/p-764314942.html
但是我感觉这样映射其实没啥用,除了去掉了量纲,一种更常见的映射如图 3 所示:
图3 自然坐标系到基准坐标系下的映射示例图
这一点在《有限单元法》-- 王勖成 第二章中尚未提到,是胡老师讲过之后我才知道,顺带搜了一下,其思想在于:让基准单元到每个物理单元之间存在一个映射,比较容易想到的是就是线性映射了,在那篇知乎文章中,映射是这样的:
x=41[(1−ξ)(1−η)xi+(1+ξ)(1−η)xj+(1+ξ)(1+η)xm+(1−ξ)(1+η)xn]y=41[(1−ξ)(1−η)yi+(1+ξ)(1−η)yj+(1+ξ)(1+η)ym+(1−ξ)(1+η)yn]
根据这个映射,可以将母单元上的四个点一一映射到物理单元上的四个点,注意:xi,(i,j,m,n) 是已知的,所以根据母单元的中任意一点坐标 (ξ,η) 可以求得其在物理单元中的坐标 (x0,y0) ,反过来也一样。
更进一步,将公式(32)写为矩阵形式:
[xy]=[Ni00NiNj00NjNm00NmNn00Nn]⋅⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡xiyixjyjxmymxnyn⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
容易得到,形函数为:
⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧Ni(ξ,η)Nj(ξ,η)Nm(ξ,η)Nn(ξ,η)=41⋅(1−ξ)⋅(1−η)=41⋅(1+ξ)⋅(1−η)=41⋅(1+ξ)⋅(1+η)=41⋅(1−ξ)⋅(1+η)
那么,因为之前推导的方程是在原坐标系下,所以现在需要转换到基准坐标系下来
我们当然可以直接求 一个变换 f ,使得:
Ni(ξ,η)=f⋅Ni(x,y)
但是考虑到:
B=L⋅NS=D⋅B=D⋅L⋅N
所以不妨更近一步,考虑新 B 与旧 B 矩阵之间的转换
回到方程(16)
{ϵ}=⎝⎛ϵxϵyγxy⎠⎞=L⋅u=B⎣⎢⎡∂x∂0∂x∂0∂y∂∂y∂⎦⎥⎤⋅N⋅ae=B⋅ae
由于坐标系发生了变化,所以我们现在需要求在基准坐标系下的应变
根据链式法则:
∂ξ∂f=∂x∂f⋅∂ξ∂x+∂y∂f⋅∂ξ∂y∂η∂f=∂x∂f⋅∂η∂x+∂y∂f⋅∂η∂y
求解上式得到:
∂x∂=det[J]1[∂η∂x⋅∂ξ∂−∂ξ∂x⋅∂η∂]∂y∂=det[J]1[∂ξ∂y⋅∂η∂−∂η∂y⋅∂ξ∂]
其中 J 为雅克比矩阵,关于对雅克比矩阵的具体描述,请参见:https://www.zhihu.com/question/22739036/answer/442131829
在本文中:
⎩⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎧J=[∂ξ∂x∂η∂x∂ξ∂y∂η∂y]det[J]=81Xc⋅⎣⎢⎢⎢⎡0η−1ξ−η1−ξ1−η0−ξ−1ξ+1η−ξξ+10−η−1ξ−1−ξ−1η+10⎦⎥⎥⎥⎤⋅Yc,其中:Xc=⎝⎜⎜⎜⎛xixjxmxn⎠⎟⎟⎟⎞T,Yc=⎝⎜⎜⎜⎛yiyjymYn⎠⎟⎟⎟⎞
如此,便将原本对 (x,y) 坐标系下的微分算子,通过雅克比矩阵转换到 (ξ,η) 坐标系下了
新的微分算子为:
L′=det[J]1⋅⎣⎢⎢⎡∂η∂x⋅∂ξ∂−∂ξ∂x⋅∂η∂0∂η∂x⋅∂ξ∂−∂ξ∂x⋅∂η∂0∂ξ∂y⋅∂η∂−∂η∂y⋅∂ξ∂∂ξ∂y⋅∂η∂−∂η∂y⋅∂ξ∂⎦⎥⎥⎤
那么,在新的坐标系下:
ϵ=L′⋅uB(ξ,η)=L′⋅N(ξ,η)=det[J]1⋅[BiBjBmBn]
七、求解单元刚度矩阵
因为已经转换了坐标系,所以之前的求解单元刚度矩阵的公式就可以更新为:
Ke=A∬B(x,y)T⋅D⋅B(x,y)⋅tdxdy=∫−11∫−11B(ξ,η)T⋅D⋅B(ξ,η)⋅t⋅∣J∣dξdη
同上, t 为单元厚度
要求解此积分,精确解难以获得,可以通过数值积分获取,比较常用的一种数值积分方式为高斯积分
对于如下函数的积分:
I=∫−11ydx
假如 yi 为样本点, Wi 为样本点对应的权值,n 为样本点的个数,可将上式积分写为:
I=∫−11ydx=i=1∑nWi⋅yi
对于二维高斯积分,同理:
I=∫−11∫−11f(ξ,η)dξdη=∫−11i∑Wi⋅f(ξi,η)dη=j∑Wj[i∑Wi⋅f(ξi,ηj)]=j∑i∑WiWj⋅f(ξi,ηj)
查表,可得部分高斯积分样本值和权值
样本点数 |
样本点值 |
权值 |
1 |
x1=0 |
2 |
2 |
x1,x2=±0.577350269189626 |
1 |
3 |
x1,x3=±0.774596669241483 x2=0 |
5/9 8/9 |
4 |
x1,x4=±0.861136311594053 x2,x3=±0.339981043584856 |
0.347854845137454 0.652145154862546 |
由于本文是二维积分问题,选四点即可。已知 x1=0.577350269189626 , x2=−0.577350269189626
令:
结点序号 |
坐标值 |
坐标值 |
权值 |
1 |
ξ1=x2 |
η1=x2 |
W1=1∗1=1 |
2 |
ξ2=x1 |
η2=x2 |
W2=1∗1=1 |
3 |
ξ3=x1 |
η3=x1 |
W3=1∗1=1 |
4 |
ξ4=x2 |
η4=x2 |
W4=1∗1=1 |
根据高斯积分,便可将积分问题转变为求和问题:
Ke=t⋅∣J∣⋅{B(ξ1,η1)T⋅D⋅B(ξ1,η1)⋅W1+B(ξ2,η2)T⋅D⋅B(ξ2,η2)⋅W2+B(ξ3,η3)T⋅D⋅B(ξ3,η3)⋅W3+B(ξ4,η4)T⋅D⋅B(ξ4,η4)⋅W4}
八、组装总刚度矩阵
在进行组装之前,我们需要先找到一个变换 G ,能够将单元刚度阵转换到总刚矩阵中。假如该结构的总结点数为 l
不难想到,G 的作用是提高阶数,在《有限单元法》中,对其的定义为:
ae=Gat
其中, ae 为结点自由度(8*1),如果忘了可以翻看本文的最开始那部分, at 是整个结构的结点位移列阵( 2l∗1),通过此方程,便可以使得单元的结点自由度数和结构的结点自由度数相同。
其中:
G=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡0000000000000000⋯⋯⋯⋯⋯⋯⋯⋯1000000001000000⋯⋯⋯⋯⋯⋯⋯⋯0010000000010000⋯⋯⋯⋯⋯⋯⋯⋯0000100000000100⋯⋯⋯⋯⋯⋯⋯⋯0000001000000001⋯⋯⋯⋯⋯⋯⋯⋯00000000⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
同样的,可以得到:
at=GTae
将上式展开写一下:
at=GTae=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡00⋮10⋮00⋮00⋮00⋮0000⋮01⋮00⋮00⋮00⋮0000⋮