结构热应力仿真-主题023_三角形与四边形单元-主题023_三角形与四边形单元教程
LiAiAi123LiAAii123AAA:三角形总面积AiA_iAi:P与对边构成的子三角形面积性质L1L2L31L1L2L31。
主题023:三角形与四边形单元
目录


引言
1.1 为什么要学习单元技术?
在有限元方法中,单元是离散化的基本构件。理解单元技术对于:
- 正确实现有限元程序:形函数、雅可比矩阵、数值积分
- 处理复杂几何:曲边单元、等参变换
- 提高计算精度:高阶单元、自适应网格
- 优化计算效率:选择合适的单元类型和阶次
1.2 本主题学习目标
完成本主题学习后,您将能够:
- 理解三角形单元的形函数构造
- 掌握面积坐标的概念和应用
- 实现四边形单元的等参变换
- 计算雅可比矩阵及其行列式
- 应用高斯积分进行数值积分
- 对比不同单元的特点和适用场景
三角形单元基础
2.1 线性三角形单元(CST)
**常应变三角形(Constant Strain Triangle, CST)**是最简单的二维单元。
节点配置:
2
|\
| \
| \
0---1
形函数:
N i = L i , i = 1 , 2 , 3 N_i = L_i, \quad i = 1, 2, 3 Ni=Li,i=1,2,3
其中 L i L_i Li 是面积坐标。
特点:
- 3个节点,每个节点2个自由度
- 位移场线性变化,应变/应力为常数
- 对弯曲问题精度较低(剪切自锁)
2.2 二次三角形单元(LST)
**线性应变三角形(Linear Strain Triangle, LST)**在边上增加了节点。
节点配置:
2
|\
5 4
| \
0--3--1
形函数:
- 顶点节点: N i = L i ( 2 L i − 1 ) , i = 1 , 2 , 3 N_i = L_i(2L_i - 1), \quad i = 1, 2, 3 Ni=Li(2Li−1),i=1,2,3
- 边中节点: N i j = 4 L i L j N_{ij} = 4L_iL_j Nij=4LiLj
特点:
- 6个节点
- 位移场二次变化,应变/应力线性变化
- 精度明显高于CST
面积坐标与自然坐标
3.1 面积坐标的定义
对于三角形内的任意点P,面积坐标定义为:
L i = A i A , i = 1 , 2 , 3 L_i = \frac{A_i}{A}, \quad i = 1, 2, 3 Li=AAi,i=1,2,3
其中:
- A A A:三角形总面积
- A i A_i Ai:P与对边构成的子三角形面积
性质:
L 1 + L 2 + L 3 = 1 L_1 + L_2 + L_3 = 1 L1+L2+L3=1
3.2 面积坐标与直角坐标的关系
x = L 1 x 1 + L 2 x 2 + L 3 x 3 x = L_1x_1 + L_2x_2 + L_3x_3 x=L1x1+L2x2+L3x3
y = L 1 y 1 + L 2 y 2 + L 3 y 3 y = L_1y_1 + L_2y_2 + L_3y_3 y=L1y1+L2y2+L3y3
逆变换:
L i = 1 2 A ( a i + b i x + c i y ) L_i = \frac{1}{2A}(a_i + b_ix + c_iy) Li=2A1(ai+bix+ciy)
其中:
a 1 = x 2 y 3 − x 3 y 2 , b 1 = y 2 − y 3 , c 1 = x 3 − x 2 a_1 = x_2y_3 - x_3y_2, \quad b_1 = y_2 - y_3, \quad c_1 = x_3 - x_2 a1=x2y3−x3y2,b1=y2−y3,c1=x3−x2
3.3 母单元坐标
对于四边形单元,使用母单元坐标 ( ξ , η ) ∈ [ − 1 , 1 ] × [ − 1 , 1 ] (\xi, \eta) \in [-1, 1] \times [-1, 1] (ξ,η)∈[−1,1]×[−1,1]。
等参变换:
x ( ξ , η ) = ∑ i = 1 n N i ( ξ , η ) x i x(\xi, \eta) = \sum_{i=1}^{n} N_i(\xi, \eta) x_i x(ξ,η)=i=1∑nNi(ξ,η)xi
y ( ξ , η ) = ∑ i = 1 n N i ( ξ , η ) y i y(\xi, \eta) = \sum_{i=1}^{n} N_i(\xi, \eta) y_i y(ξ,η)=i=1∑nNi(ξ,η)yi
四边形单元基础
4.1 双线性四边形单元(Q4)
节点配置:
3-----2
| |
| |
0-----1
形函数:
N 0 = 1 4 ( 1 − ξ ) ( 1 − η ) N_0 = \frac{1}{4}(1-\xi)(1-\eta) N0=41(1−ξ)(1−η)
N 1 = 1 4 ( 1 + ξ ) ( 1 − η ) N_1 = \frac{1}{4}(1+\xi)(1-\eta) N1=41(1+ξ)(1−η)
N 2 = 1 4 ( 1 + ξ ) ( 1 + η ) N_2 = \frac{1}{4}(1+\xi)(1+\eta) N2=41(1+ξ)(1+η)
N 3 = 1 4 ( 1 − ξ ) ( 1 + η ) N_3 = \frac{1}{4}(1-\xi)(1+\eta) N3=41(1−ξ)(1+η)
特点:
- 4个节点
- 双线性位移场
- 可能出现剪切自锁
4.2 二次四边形单元(Q8, Q9)
Q8单元(Serendipity):
- 8个节点:4角点 + 4边中点
- 不含内部节点
Q9单元(Lagrange):
- 9个节点:4角点 + 4边中点 + 1中心点
- 使用张量积构造形函数
等参变换
5.1 等参变换的概念
等参(Isoparametric):几何插值和场变量插值使用相同的形函数。
优点:
- 可以处理曲边几何
- 统一了各种单元的处理方式
- 便于数值积分
5.2 雅可比矩阵
雅可比矩阵描述从母单元到物理单元的映射:
J = [ ∂ x ∂ ξ ∂ x ∂ η ∂ y ∂ ξ ∂ y ∂ η ] \mathbf{J} = \begin{bmatrix} \frac{\partial x}{\partial \xi} & \frac{\partial x}{\partial \eta} \\ \frac{\partial y}{\partial \xi} & \frac{\partial y}{\partial \eta} \end{bmatrix} J=[∂ξ∂x∂ξ∂y∂η∂x∂η∂y]
计算:
∂ x ∂ ξ = ∑ i = 1 n ∂ N i ∂ ξ x i \frac{\partial x}{\partial \xi} = \sum_{i=1}^{n} \frac{\partial N_i}{\partial \xi} x_i ∂ξ∂x=i=1∑n∂ξ∂Nixi
行列式的意义:
d A = ∣ det ( J ) ∣ d ξ d η dA = |\det(\mathbf{J})| d\xi d\eta dA=∣det(J)∣dξdη
5.3 导数变换
形函数对物理坐标的导数:
[ ∂ N i ∂ x ∂ N i ∂ y ] = J − 1 [ ∂ N i ∂ ξ ∂ N i ∂ η ] \begin{bmatrix} \frac{\partial N_i}{\partial x} \\ \frac{\partial N_i}{\partial y} \end{bmatrix} = \mathbf{J}^{-1} \begin{bmatrix} \frac{\partial N_i}{\partial \xi} \\ \frac{\partial N_i}{\partial \eta} \end{bmatrix} [∂x∂Ni∂y∂Ni]=J−1[∂ξ∂Ni∂η∂Ni]
数值积分方法
6.1 高斯积分原理
高斯积分通过最优选择积分点和权重,达到最高代数精度。
一维高斯积分:
∫ − 1 1 f ( ξ ) d ξ ≈ ∑ i = 1 n w i f ( ξ i ) \int_{-1}^{1} f(\xi) d\xi \approx \sum_{i=1}^{n} w_i f(\xi_i) ∫−11f(ξ)dξ≈i=1∑nwif(ξi)
二维高斯积分(四边形):
∫ − 1 1 ∫ − 1 1 f ( ξ , η ) d ξ d η ≈ ∑ i = 1 n ∑ j = 1 n w i w j f ( ξ i , η j ) \int_{-1}^{1}\int_{-1}^{1} f(\xi, \eta) d\xi d\eta \approx \sum_{i=1}^{n}\sum_{j=1}^{n} w_i w_j f(\xi_i, \eta_j) ∫−11∫−11f(ξ,η)dξdη≈i=1∑nj=1∑nwiwjf(ξi,ηj)
6.2 三角形单元的数值积分
常用积分公式:
| 阶数 | 点数 | 位置 | 权重 |
|---|---|---|---|
| 1 | 1 | (1/3, 1/3) | 1 |
| 2 | 3 | (1/6, 1/6), (2/3, 1/6), (1/6, 2/3) | 1/3 |
| 3 | 4 | (1/3, 1/3), (0.6, 0.2), (0.2, 0.6), (0.2, 0.2) | -27/48, 25/48 |
6.3 积分阶数的选择
一般原则:
- 多项式阶次 p p p,需要积分阶次 n ≥ ( p + 1 ) / 2 n \geq (p+1)/2 n≥(p+1)/2
- 线性单元:2×2积分
- 二次单元:3×3积分
- 考虑计算效率与精度的平衡
案例实战
实例一:三角形单元与面积坐标
本实例演示三角形单元的实现,包括面积坐标、形函数和数值积分。
完整代码:
"""
实例一:三角形单元与面积坐标
================================
"""
import numpy as np
import matplotlib.pyplot as plt
class TriangleElement:
"""三角形单元类"""
def __init__(self, nodes):
"""
初始化三角形单元
参数:
nodes: 节点坐标数组,形状为 (n_nodes, 2)
"""
self.nodes = np.array(nodes)
self.n_nodes = len(nodes)
self.order = 1 if self.n_nodes == 3 else 2
def shape_functions_linear(self, xi, eta):
"""
线性三角形单元的形函数
参数:
xi, eta: 面积坐标 L₁, L₂
返回:
N: 形函数值数组 [N₁, N₂, N₃]
"""
N1 = xi
N2 = eta
N3 = 1 - xi - eta
return np.array([N1, N2, N3])
def compute_jacobian(self):
"""
计算雅可比矩阵
返回:
J: 雅可比矩阵
detJ: 行列式
J_inv: 逆矩阵
"""
x = self.nodes[:, 0]
y = self.nodes[:, 1]
J = np.array([
[x[0] - x[2], x[1] - x[2]],
[y[0] - y[2], y[1] - y[2]]
])
detJ = np.linalg.det(J)
J_inv = np.linalg.inv(J)
return J, detJ, J_inv
def integrate_function(self, func, order=2):
"""
在单元上积分函数
参数:
func: 被积函数
order: 积分阶数
返回:
integral: 积分值
"""
# 2阶积分点
points = np.array([
[1/6, 1/6],
[2/3, 1/6],
[1/6, 2/3]
])
weights = np.array([1/3, 1/3, 1/3])
J, detJ, _ = self.compute_jacobian()
integral = 0.0
for i, (xi, eta) in enumerate(points):
integral += weights[i] * func(xi, eta)
integral *= abs(detJ)
return integral
# 使用示例
nodes = np.array([
[0.0, 0.0],
[2.0, 0.0],
[1.0, 1.5]
])
element = TriangleElement(nodes)
# 计算面积
def f_const(xi, eta):
return 1.0
area = element.integrate_function(f_const)
print(f"单元面积: {area:.6f}")
代码深度解析:
1. 形函数计算:
def shape_functions_linear(self, xi, eta):
N1 = xi # L₁
N2 = eta # L₂
N3 = 1 - xi - eta # L₃
return np.array([N1, N2, N3])
线性三角形单元的形函数就是面积坐标本身。
2. 雅可比矩阵:
J = np.array([
[x[0] - x[2], x[1] - x[2]],
[y[0] - y[2], y[1] - y[2]]
])
对于线性三角形,雅可比矩阵是常数。
实例二:四边形单元与等参变换
本实例演示四边形单元的等参变换和数值积分。
完整代码:
"""
实例二:四边形单元与等参变换
================================
"""
import numpy as np
import matplotlib.pyplot as plt
class QuadrilateralElement:
"""四边形单元类"""
def __init__(self, nodes):
self.nodes = np.array(nodes)
self.n_nodes = len(nodes)
self.elem_type = 'Q4' if self.n_nodes == 4 else 'Q8'
def shape_functions_Q4(self, xi, eta):
"""Q4单元形函数"""
N0 = 0.25 * (1 - xi) * (1 - eta)
N1 = 0.25 * (1 + xi) * (1 - eta)
N2 = 0.25 * (1 + xi) * (1 + eta)
N3 = 0.25 * (1 - xi) * (1 + eta)
return np.array([N0, N1, N2, N3])
def shape_function_derivatives(self, xi, eta):
"""形函数导数"""
dN_dxi = 0.25 * np.array([
-(1 - eta),
(1 - eta),
(1 + eta),
-(1 + eta)
])
dN_deta = 0.25 * np.array([
-(1 - xi),
-(1 + xi),
(1 + xi),
(1 - xi)
])
return dN_dxi, dN_deta
def compute_jacobian(self, xi, eta):
"""计算雅可比矩阵"""
dN_dxi, dN_deta = self.shape_function_derivatives(xi, eta)
J = np.array([
[np.dot(dN_dxi, self.nodes[:, 0]),
np.dot(dN_deta, self.nodes[:, 0])],
[np.dot(dN_dxi, self.nodes[:, 1]),
np.dot(dN_deta, self.nodes[:, 1])]
])
detJ = np.linalg.det(J)
J_inv = np.linalg.inv(J)
return J, detJ, J_inv
def integrate_function(self, func, order=2):
"""高斯积分"""
# 2×2高斯积分点
xi_vals = [-1/np.sqrt(3), 1/np.sqrt(3)]
eta_vals = [-1/np.sqrt(3), 1/np.sqrt(3)]
w_vals = [1.0, 1.0]
integral = 0.0
for i in range(2):
for j in range(2):
xi, eta = xi_vals[i], eta_vals[j]
J, detJ, _ = self.compute_jacobian(xi, eta)
weight = w_vals[i] * w_vals[j]
integral += weight * func(xi, eta) * abs(detJ)
return integral
# 使用示例
nodes = np.array([
[0.0, 0.0],
[2.0, 0.0],
[2.0, 1.5],
[0.0, 1.5]
])
element = QuadrilateralElement(nodes)
# 计算面积
area = element.integrate_function(lambda xi, eta: 1.0)
print(f"单元面积: {area:.6f}")
代码深度解析:
1. 等参映射:
def map_to_physical(self, xi, eta):
N = self.shape_functions_Q4(xi, eta)
x = np.dot(N, self.nodes[:, 0])
y = np.dot(N, self.nodes[:, 1])
return x, y
通过形函数将母单元坐标映射到物理坐标。
2. 高斯积分:
xi_vals = [-1/np.sqrt(3), 1/np.sqrt(3)]
eta_vals = [-1/np.sqrt(3), 1/np.sqrt(3)]
2×2高斯积分可以精确积分三次多项式。
更多推荐



所有评论(0)