主题023:三角形与四边形单元

目录

  1. 引言
  2. 三角形单元基础
  3. 面积坐标与自然坐标
  4. 四边形单元基础
  5. 等参变换
  6. 数值积分方法
  7. 案例实战
  8. 总结与习题

在这里插入图片描述
在这里插入图片描述

引言

1.1 为什么要学习单元技术?

在有限元方法中,单元是离散化的基本构件。理解单元技术对于:

  • 正确实现有限元程序:形函数、雅可比矩阵、数值积分
  • 处理复杂几何:曲边单元、等参变换
  • 提高计算精度:高阶单元、自适应网格
  • 优化计算效率:选择合适的单元类型和阶次

1.2 本主题学习目标

完成本主题学习后,您将能够:

  1. 理解三角形单元的形函数构造
  2. 掌握面积坐标的概念和应用
  3. 实现四边形单元的等参变换
  4. 计算雅可比矩阵及其行列式
  5. 应用高斯积分进行数值积分
  6. 对比不同单元的特点和适用场景

三角形单元基础

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(2Li1),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=x2y3x3y2,b1=y2y3,c1=x3x2

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=1nNi(ξ,η)xi
y ( ξ , η ) = ∑ i = 1 n N i ( ξ , η ) y i y(\xi, \eta) = \sum_{i=1}^{n} N_i(\xi, \eta) y_i y(ξ,η)=i=1nNi(ξ,η)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):几何插值和场变量插值使用相同的形函数。

优点

  1. 可以处理曲边几何
  2. 统一了各种单元的处理方式
  3. 便于数值积分

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=1nξ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} [xNiyNi]=J1[ξ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=1nwif(ξ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) 1111f(ξ,η)dξdηi=1nj=1nwiwjf(ξ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高斯积分可以精确积分三次多项式。


Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐