说明:为兼容 GitHub 与 Gitee,本文中的公式统一使用行内
$...$与块级$$...$$语法;块级公式均单独成行,并在前后保留空行。
本项目主要研究结构动力学仿真与数据驱动损伤识别的结合应用。内容由以下三个主要部分构成:
- 有限元计算内核 (
./src/PyFEM_Dynamics) —— 基于 Python 开发,实现了从几何参数化建模到动力学时程积分的数值仿真流程。 - 深度学习识别模块 (
./src/Deep_learning) —— 采用图变换网络学习结构拓扑特征,实现对结构损伤状态的反向识别。 - 工况预测与多源对比模块 (
./src/Condition_prediction) —— 集成仿真与推理管线,支持在特定工况下对多源计算结果进行对比分析。
.
├── src/
│ ├── PyFEM_Dynamics/ # FEM 计算内核
│ │ ├── core/ # 核心类(节点、单元、材料)
│ │ ├── solver/ # 求解器(组装、边界、积分)
│ │ └── pipeline/ # 数据生成管线
│ ├── Deep_learning/ # 深度学习模块
│ │ ├── models/ # GT 和 PINN 模型
│ │ └── train.py # 训练脚本
│ ├── Condition_prediction/# 工况预测模块
│ │ └── pipelines/ # 预测管线
│ └── tools/ # 统一 CLI 模块
├── configs/ # 统一配置目录
│ ├── structure.yaml # 结构配置文件
│ ├── dataset_config.yaml # 数据集生成配置
│ └── condition_case.yaml # 工况预测配置
├── scripts/ # 辅助脚本
│ └── generate_fem_demo.py # 演示 GIF 生成脚本
├── outputs/ # 统一运行产物目录
│ ├── checkpoints/ # 模型权重
│ ├── inference/ # 工况预测输出
│ └── postprocess/ # 后处理图像
├── notebooks/ # Jupyter Notebook 分析脚本
│ ├── 01_structure_explorer.ipynb # 结构可视化
│ ├── 02_dataset_overview.ipynb # 数据集概览
│ ├── 03_fem_simulation.ipynb # FEM 仿真分析
│ ├── 04_model_training_history.ipynb # 训练历史可视化
│ ├── 05_damage_prediction.ipynb # 损伤预测分析
│ ├── 06_model_comparison.ipynb # 模型对比
│ ├── 07_stress_analysis.ipynb # 应力分析
│ └── 08_interactive_dashboard.ipynb # 交互式仪表板
├── dataset/ # 生成的数据集
└── tests/ # 自动化测试
本部分的开发过程参考了有限元分析(FEA)的标准数值处理流程。通过将力学公式转化为程序逻辑,实现对桁架及梁结构的静/动力响应分析。
模型通过 YAML 配置文件定义几何拓扑、材料属性(E、rho、nu)及边界约束。程序内部通过 Node 和 Element 对象建立力学关联。当前前处理流程支持 random_multi_point 随机工况生成:在非约束节点上随机选择载荷作用点与 fx/fy 方向,并在给定参数区间内采样幅值、频率、相位与时序参数;每个样本均作为独立工况进行求解。
- 节点构造片段 (
./src/PyFEM_Dynamics/core/node.py):
class Node:
def __init__(self, node_id: int, x: float, y: float):
self.node_id: int = node_id
self.x: float = x
self.y: float = y
self.dofs: List[int] = [] # 存储该节点分配到的全局自由度编号- 相关文件:
./configs/structure.yaml: 结构配置文件。./src/PyFEM_Dynamics/core/io_parser.py: 负责解析配置并自动构建节点与单元对象。./configs/dataset_config.yaml: 随机多点载荷与参数区间配置文件。./src/PyFEM_Dynamics/pipeline/data_gen.py: 工况采样与数据集生成逻辑(当前规模 20,000 样本)。
针对二维拉压桁架单元,其在局部坐标系下的刚度矩阵
def get_local_stiffness(self):
E, A, L = self.material.E, self.section.A, self.length
k = E * A / L
return np.array([
[ k, 0, -k, 0],
[ 0, 0, 0, 0],
[-k, 0, k, 0],
[ 0, 0, 0, 0]
])利用直接刚度法 (Direct Stiffness Method) 将各单元贡献累加至全局矩阵 K 与 M 中。系统在 ./src/PyFEM_Dynamics/solver/assembler.py 中提供了集中质量矩阵(Lumped Mass Matrix)的选项:
def assemble_K(self):
K_global = sp.lil_matrix((self.total_dofs, self.total_dofs))
for element in self.elements:
k_global_element = element.get_global_stiffness()
dofs = element.node1.dofs + element.node2.dofs
K_global[np.ix_(dofs, dofs)] += k_global_element
return K_global.tocsc()为处理本质边界条件并消除矩阵奇异性,程序实现了 划零划一法 (Zero-One Substitution Method):
对于受约束自由度
对于非约束自由度
其中 u_i 为给定的位移边界值。求解该修改后的系统即可自动满足位移边界条件。
该方法相比罚函数法能更好地保证节点位移的精确解,避免了数值溢出风险。
# 边界处理核心片段 (简化版本)
for dof in bc_dofs:
K_csc.data[K_csc.indptr[dof]:K_csc.indptr[dof+1]] = 0.0 # 列清零
for dof, val in self.dirichlet_bcs:
K_lil.rows[dof] = [dof] # 行保留对角元
K_lil.data[dof] = [1.0] # 对角线置1
F_mod[dof] = val对于结构动力学运动方程:
系统采用经典的 Newmark-beta 隐式积分法。阻尼矩阵
算法参数取平均加速度法:
上述参数组合可确保线性系统的无条件稳定性。
# Newmark 积分常数
a0 = 1.0 / (self.beta * self.dt**2)
a1 = self.gamma / (self.beta * self.dt)
a2 = 1.0 / (self.beta * self.dt)
a3 = 1.0 / (2.0 * self.beta) - 1.0
a4 = self.gamma / self.beta - 1.0
a5 = (self.dt / 2.0) * (self.gamma / self.beta - 2.0)
a6 = self.dt * (1.0 - self.gamma)
a7 = self.gamma * self.dt
# 时间步迭代循环
for i in range(1, self.num_steps):
u_prev = U[:, i-1]
v_prev = V[:, i-1]
a_prev = A[:, i-1]
# 计算等效荷载块:
# F_hat_i = F_i + M*(a0*u_prev + a2*v_prev + a3*a_prev) + C*(a1*u_prev + a4*v_prev + a5*a_prev)
term_M = a0 * u_prev + a2 * v_prev + a3 * a_prev
term_C = a1 * u_prev + a4 * v_prev + a5 * a_prev
F_hat = F_t[:, i] + self.M.dot(term_M) + self.C.dot(term_C)
# 求解 U_i
u_next = K_hat_lu.solve(F_hat)
# 更新加速度和速度
a_next = a0 * (u_next - u_prev) - a2 * v_prev - a3 * a_prev
v_next = v_prev + a6 * a_prev + a7 * a_next
U[:, i] = u_next
V[:, i] = v_next
A[:, i] = a_next为了验证有限元内核的计算正确性,对 Truss-Bridge 模型进行了静力及动力载荷下的模拟:
- 计算验证: 上图展示了 FEM 模块对随机多点激励载荷下的结构动力学响应模拟。灰色虚线表示初始平衡态,彩色云图(Viridis 色阶:蓝→黄表示低→高)反映了受载后的 von Mises 应力分布时变演化。计算结果与理论预测的结构弯曲趋势一致,验证了 FEM 内核实现的正确性。
在获得动力学仿真数据后,考虑到损伤(刚度折减)与响应之间存在非线性关系,本项目尝试利用深度学习进行反向识别的学习实践。
利用 FEM 内联内核自动生成了 20,000 组包含不同损伤场景(单元随机折减)与随机多点激振的数据集。
- 数据生成代码:
./src/PyFEM_Dynamics/pipeline/data_gen.py。 - 配置文件:
./configs/dataset_config.yaml。 - 数据文件:
./dataset/train.npz。
考虑到工程结构天然具有图拓扑(Graph Topology)特征,模型采用了 Graph Transformer 网络:
- 节点特征编码: 使用 1D 卷积提取传感器位移/加速度响应的时间序列特征。
- 空间关系推理: 通过 Multi-Head Self-Attention 机制计算力学信号在物理结构中的全局传递关联。
- 预测任务: 针对每个单元预测其刚度折减系数(stiffness reduction factor,取值范围 0.5-0.9,具体由配置文件中的 reduction_range 决定)。
- 模型实现片段 (
./src/Deep_learning/models/gt_model.py):
class GTDamagePredictor(nn.Module):
def forward(self, x, adj, edge_index):
batch_size = x.size(0)
# 重塑输入张量以适配节点结构
x_nodes = x.view(batch_size, -1, self.num_nodes, self.node_in_dim).transpose(1, 2)
x_flat = x_nodes.reshape(batch_size * self.num_nodes, -1, self.node_in_dim).transpose(1, 2)
# 时间特征提取
h_node = self.node_encoder(x_flat).squeeze(-1)
h_node = h_node.view(batch_size, self.num_nodes, -1)
# 添加位置编码
h_node = self.pos_encoder(h_node)
# 图变换器层进行空间信息交互
for layer in self.transformer_layers:
h_node = layer(h_node, adj)
# 提取单元端部节点特征进行拼接预测
node1_idx = edge_index[:, 0]
node2_idx = edge_index[:, 1]
h_node1 = h_node[:, node1_idx, :]
h_node2 = h_node[:, node2_idx, :]
h_edge = torch.cat([h_node1, h_node2], dim=-1)
return self.damage_fc(h_edge).squeeze(-1)独立测试集结果显示,Graph Transformer (GT) 在回归精度与损伤定位综合性能上优于 PINN。以下对各模型的训练演进过程及核心指标进行详细分析:
核心指标分析与后处理效果展示:
Graph Transformer (GT) 训练演进分析:
- 损失收敛趋势:训练损失(Train Loss)与验证损失(Val Loss)在初始阶段呈指数级下降后进入平稳期。Best Val 状态出现于第 100 Epoch,表明参数优化过程在全周期内保持活跃。
- 泛化性能评估:验证损失持续低于训练损失,这归因于训练阶段激活的正则化机制(如 Dropout)提升了模型对未见数据的泛化能力。
- 预测精度与召回:MAE 指标在 20 Epoch 后稳定于 0.084-0.089 范围;F1 Score 迅速攀升并保持在 0.30 左右。尽管 F1 Score 绝对值不高,但考虑到损伤识别的固有困难性(正负样本极度不平衡),该指标表明模型已学习到有效的损伤定位特征。
- 累计性能增益:相对提升曲线呈现稳定的准线性增长,截止第 100 Epoch,模型验证性能较初始阶段累计提升约 4.5%。
- 收敛稳定性评估:虽然损失曲线维持下行趋势,但绝对下降量级极小(从 0.5616 降至 0.5600 附近),说明模型权重更新陷入平缓的局部最优区间。
- 约束冲突分析:验证损失高于训练损失的现象主要源于训练目标中同时包含数据项、分类项以及平滑/范围等物理约束项,增加了优化难度。
- 指标波动分析:MAE 在极窄范围内震荡(0.470-0.472),反映出模型内部权重未发生实质性重构;F1 曲线的平直特征揭示了该分类指标在纯回归物理场预测任务中的不适用性。
- 累计提升评估:尽管相对提升曲线展示增长特征,但 100 Epoch 后的累计提升仅为 0.28%,实际预测性能已趋于饱和。
- 样本级预测对比分析: 逐样本对比结果显示,GT 模型在损伤幅值拟合上更接近真实分布;相比之下,PINN 对损伤位置具备定位倾向,但幅值预测偏差仍存在纠偏空间。
- 预测一致性校准曲线: 该图反映了预测损伤概率与真实损伤频率的相关性。GT 曲线高度贴合对角基准线,证明其预测输出具备较高的可解释性与力学可靠性。
基于对上述架构在损伤数据集上的实验,目前得到以下初步结论与改进思路:
- 结论:模型对结构健康状态具有较好的识别能力,体现了图拓扑特征提取的优势。
- 改进策略:计划引入难例挖掘(Hard Example Mining)策略,并结合有限元求解器增加低刚度折减的损伤样本。
- 结论:由于物理信息损失与数据驱动损失在量级上存在差异,模型在同时满足数据拟合与物理定律时存在一定的优化难度。
- 改进策略:尝试引入自适应损失权重策略(Adaptive Weighting),动态调整训练不同阶段的物理约束比重;同时在场梯度变化较大的区域增加采样点。
说明:本项目完成了从有限元算法实现到图学习与 PINN 应用的学习闭环。后续工作将重点关注损失函数设计与优化策略,以期提高损伤反演的保真度。
在完成离线训练阶段后,本项目构建了集成化的工况预测模块,旨在特定载荷场景下实现有限元基准(FEM)、GT 模型及 PINN 预测结果的统一量化对比。
- 统一入口: 根目录
run.bat/run.sh;安装后也可直接使用pyfem - 工况配置:
configs/condition_case.yaml - 核心管线:
condition_pipeline.py
其中,./configs/condition_case.yaml 统一定义了结构文件、时间参数、阻尼、载荷作用工况、损伤工况、模型推理设置以及输出路径。
该模块按以下步骤完成一次完整工况预测:
- 读取工况,构造确定性载荷时程矩阵。
- 分别计算健康结构与损伤结构的 FEM 动力学响应。
- 基于应力时程构造 FEM 损伤指标。
- 按配置调用指定的深度学习模型(
gt或pinn)进行损伤预测;若检测到另一模型权重,可附加生成动画对比。 - 统一输出对比指标与图像结果。
FEM 损伤指标采用如下形式(基于刚度折减定义):
深度学习模型输出的刚度因子记为
统一说明:在同一载荷条件下,本实现采用应力比近似刚度折减系数:
这是一种工程近似,假设结构处于线弹性小变形状态,从而将深度学习侧预测的刚度因子
针对典型桁架损伤工况,统计得到的计算偏差如下表所示(数值代表预测值与基准值的偏离程度):
| 对比维度 | 时域 MAE | 时域 RMSE | 终态 MAE | 终态 RMSE |
|---|---|---|---|---|
| GT vs FEM | 0.0706 | 0.0989 | 0.0487 | 0.0494 |
| PINN vs FEM | 0.5222 | 0.5226 | 0.5202 | 0.5203 |
| GT vs GroundTruth | 0.0825 | 0.0996 | 0.0710 | 0.0869 |
| PINN vs GroundTruth | 0.4817 | 0.4896 | 0.4793 | 0.4864 |
| GT vs PINN | 0.4553 | 0.4579 | 0.4715 | 0.4716 |
- 损伤均值演化轨迹: GT 预测曲线在全时域内与 FEM 基准保持高度一致性;PINN 结果展现出明显的系统性过估计,反映了物理约束在当前尺度下的欠拟合特征。
- 误差时变稳定性: 误差演化曲线表明,GT 模型的预测偏差始终受限于较低阈值,而 PINN 的误差水平显著更高,且波动范围更大。
- 特征单元响应追踪: 在选定的关键特征单元上,GT 能够精准捕获损伤引起的非线性波动特征及末时刻残余损伤量;PINN 虽然能识别损伤趋势,但在幅值量化上仍显不足。
为更直观地展示结构在指定工况下的动力学演化过程,模块支持自动生成桁架变形与应力云图的时变动画。以下为同一工况下三种计算方式的对比:
- FEM 真值响应: 基于真实损伤工况计算的结构变形与 von Mises 应力演化,灰色虚线表示初始平衡态,彩色云图反映应力分布。
- GT 模型预测: 使用 Graph Transformer 模型推断的损伤因子重新计算得到的结构响应,与 FEM 真值对比可验证模型预测的准确性。
- PINN 模型预测: 使用 Physics-Informed Neural Network 推断的损伤因子计算得到的结构响应,可观察其与 GT 及 FEM 结果的差异。
动画说明: 图中桁架变形已放大 500 倍以便于观察,色彩表示 von Mises 应力强度(Viridis 色阶:蓝→黄表示低→高),标题显示当前时刻。
对比实验表明,GT 模型在当前场景下展现出较好的稳健性:其时域预测结果与有限元计算较为接近,具有代替 FEM 进行快速动力学分析的潜力。
本节介绍如何从零开始运行项目的完整流程,包括环境配置、数据生成、模型训练和工况预测。
项目现在以根目录 run.bat 和 run.sh 作为唯一公开入口,内部统一调度模块位于 src/tools/cli.py。启动时会优先复用当前激活的 conda 环境;如果当前不在项目环境中,则自动创建默认环境 fem 并安装依赖。
# Windows
run.bat
run.bat bootstrap
run.bat pipeline --jobs 4
# Linux / macOS
./run.sh
./run.sh bootstrap
./run.sh pipeline --jobs 4
# 进入交互向导后可输入:
status
train
dataset
pipeline
# 也支持直接参数模式:
run.bat train --model gt --epochs 100 --device gpu
run.bat predict --config configs/condition_case.yamlCLI 命令速查:
| 命令 | 功能 | 常用参数 |
|---|---|---|
env |
查看当前/目标 conda 环境 | --env-name |
bootstrap |
创建 conda 环境并自动安装依赖 | --env-name, --python-version |
install |
向目标 conda 环境安装依赖 | --env-name, --force-install |
static |
FEM 静态分析 | --structure 指定结构配置 |
dataset |
生成训练数据集 | -j 并行核数,--seq 串行模式 |
train |
训练深度学习模型 | --model gt/pinn_v2/both, --epochs, --device cpu/gpu |
predict |
运行工况预测 | --config 指定工况配置 |
pipeline |
运行完整流水线 | --skip-dataset, --skip-train, -j, --condition-config |
status |
检查项目状态 | - |
交互向导说明:
- 直接运行
run.bat或./run.sh会进入统一 CLI。 - 输入裸命令
train、dataset、predict、pipeline会进入逐步问答模式。 - 文本参数直接输入即可;选项参数输入数字编号即可。
- 直接回车表示采用默认值。
- 在向导中可使用
back返回上一项,使用cancel取消当前命令,使用exit/quit退出 CLI。
完整 CLI 示例:
# 1. 初始化或复用 conda 环境
run.bat bootstrap
# 2. 进入交互 CLI
run.bat
# 3. 在交互 CLI 中输入 train,程序会逐步询问:
# - 模型类型
# - 配置文件
# - epochs
# - batch size
# - learning rate
# - 训练设备(auto/cpu/gpu)
# - 是否仅评估
# 4. 直接参数模式仍然可用
run.bat pipeline --skip-dataset --model both --epochs 150
# 5. 仅运行预测(已有训练好的模型)
run.bat predict --config configs/condition_case.yaml提示:如果已激活项目 conda 环境,
run.bat/run.sh会直接复用当前环境;否则默认创建并使用fem环境。
# 创建并激活 conda 环境
conda create -n fem python=3.11 -y
conda activate fem
# 使用统一 CLI 安装依赖
PYTHONPATH=src python -m tools.cli install --env-name fem
# 或安装项目后直接使用
pip install -e .
pyfem status在开始训练前,建议运行测试套件验证环境配置:
# 运行全部测试
pytest tests/ -v
# 仅运行FEM核心测试
pytest tests/test_fem_core/ -v
# 仅运行模型测试
pytest tests/test_models/ -v
# 运行并行数据生成测试
pytest tests/test_pipeline/test_parallel_data_gen.py -v预期输出:所有测试通过(74 passed)。
训练模型需要先生成数据集。配置文件 configs/dataset_config.yaml 定义了生成参数:
# 推荐:进入交互 CLI 后输入 `dataset`
run.bat
# 或直接参数模式
run.bat dataset --config configs/dataset_config.yaml -j 4
run.bat dataset --config configs/dataset_config.yaml --seq参数说明:
--config, -c: 配置文件路径(默认:configs/dataset_config.yaml)--jobs, -j: 并行worker数量,-1为自动(cpu_count - 1)--seq: 启用串行模式(禁用并行)
生成时间: 并行模式下,20,000样本约需10分钟(4核),串行模式约30分钟。
输出文件:
dataset/train.npz: 训练数据集dataset/metadata.json: 元数据
数据生成完成后,开始训练深度学习模型:
# 推荐:进入交互 CLI 后输入 `train`
run.bat
# 或直接参数模式
run.bat train --config configs/dataset_config.yaml --model gt --epochs 100 --device gpu
run.bat train --config configs/dataset_config.yaml --model pinn --epochs 100 --device cpu
run.bat train --config configs/dataset_config.yaml --model both --epochs 100 --device gpu
run.bat train --config configs/dataset_config.yaml --model gt --eval-only主要参数:
| 参数 | 说明 | 默认值 |
|---|---|---|
--config |
配置文件路径 | configs/dataset_config.yaml |
--model |
模型类型:gt/pinn/both |
必填 |
--epochs |
训练轮数 | 从配置文件读取 |
--batch_size |
批大小 | 从配置文件读取 |
--lr |
学习率 | 从配置文件读取 |
--device |
训练设备:auto/cpu/gpu |
自动检测 |
--eval-only |
仅评估,不训练 | False |
训练输出:
outputs/checkpoints/gt_best.pth: GT模型最佳权重outputs/checkpoints/pinn_v2_best.pth: PINN V2 模型最佳权重outputs/checkpoints/pinn_best.pth: 旧版 PINN 模型最佳权重runs/: TensorBoard日志目录
监控训练:
# 启动TensorBoard
tensorboard --logdir runs/
# 浏览器访问 http://localhost:6006训练完成后,使用模型进行工况预测:
# 编辑工况配置
# 修改 configs/condition_case.yaml 中的载荷工况、损伤工况和模型路径
# 运行工况预测
run.bat predict --config configs/condition_case.yaml
# 指定输出目录
run.bat predict --config configs/condition_case.yaml --output-dir ./my_output配置文件configs/condition_case.yaml关键项:
# 载荷工况
load_case:
loads:
- node_id: 3
dof: fx
pattern: harmonic
F0: 10000.0
freq: 1.20
# 损伤工况(真值)
damage_case:
damaged_elements:
- element_id: 7
factor: 0.75
# 模型推理配置
deep_learning:
inference:
model_type: gt # 使用GT模型
checkpoint: ../outputs/checkpoints/gt_best.pth
threshold: 0.95预测输出:
outputs/inference/condition_case_a_YYYYMMDD_HHMMSS/
├── comparison_metrics.json # 量化对比指标
├── mean_damage_comparison_all.png # 损伤均值演化对比
├── error_evolution_all.png # 误差演化对比
├── focus_elements_comparison_all.png # 重点单元对比
├── deformation_animation_fem.gif # FEM变形动画
├── deformation_animation_gt.gif # GT预测变形动画
└── deformation_animation_pinn.gif # PINN预测变形动画
# 1. 环境准备
run.bat bootstrap
# 2. 运行测试
pytest tests/ -v
# 3. 生成数据集(约10分钟)
run.bat dataset -j 4
# 4. 训练GT模型(约30分钟)
run.bat train --model gt --epochs 100 --device gpu
# 5. 工况预测
run.bat predict
# 6. 查看结果
ls outputs/inference/本项目完成了从底层有限元算法编程到深度学习应用的闭环学习流程。通过将力学理论(如 Newmark 积分、单元阵列推导)与代码实现直接对照,系统地实践了数值仿真与数据驱动识别的基础方法论。









