把 PINN 塞进群智能反演:一次可审计的结构损伤识别 MATLAB 复现

把 PINN 塞进群智能反演:一次可审计的结构损伤识别 MATLAB 复现

结构损伤识别说白了是一个逆问题:手上只有有限几个测点的模态频率和振型,要反过来推出每个单元的刚度损失了多少。观测少、噪声大、解空间非凸,这三件事凑在一起,就成了结构健康监测里最难啃的一块。

最近花时间把一篇论文的完整方法链在 MATLAB 里重做了一遍------有限元建模、贝叶斯权重校准、FOX/DEFOX 群智能反演、物理信息神经网络(PINN)模态修正,全流程跑通,24 组识别、25 幅图、全套 CSV 和 MAT 结果文件都存了下来。

这篇文章不聊概念,只讲这个工程具体怎么搭的、公式长什么样、参数怎么定、跑出来什么数,以及哪些地方是论文没写清、由我做补充假设的。

复现依据:陈震等,《融合物理信息神经网络与群智能优化算法的结构损伤识别研究》,《振动工程学报》网络首发,DOI 10.16385/j.cnki.issn.1004-4523.202512025。


01 背景:三个环节各自的短板

先把这个问题的结构拆开。

有限元模型修正是传统路线。 用模态频率和振型的改变量构造灵敏度矩阵,反解刚度折减系数。它快、可解释,但有个前提:有限元模型本身得足够准。实际结构里,边界条件、材料离散性、未建模的次要构件都会带来模型误差,这个误差和损伤引起的模态变化量级相当,于是"分不清是模型错了还是结构坏了"。

群智能优化把问题重新表述成搜索。 损伤向量直接作为优化变量,目标函数是预测模态和观测模态的差异,用 FOX、WOA 这类算法去做无梯度的全局搜索。好处是不需要灵敏度矩阵、能处理非凸,坏处是目标函数本身仍然建立在那个不准的有限元模型上。

PINN 想补的正是这一块。 让神经网络去学"有限元解和真实解之间的修正量",同时用物理残差约束网络输出,别让它跑偏。网络不是替代有限元,而是修有限元的偏差。

三者串起来的动机就很清楚了:有限元给物理骨架,群智能在骨架上搜索损伤,PINN 在线修正骨架本身的误差。这套思路能不能用,得跑出来看。


02 这个工程做到了什么

从入口 main.m 进去,一次运行走完五步:

第一步,建模与数值验证。 建两类结构------10 单元简支梁和 18 单元双层平面刚架,组装刚度矩阵、一致质量矩阵,做模态分析。同时检查刚度/质量矩阵的对称性与正定性、特征方程残差、网格收敛性。

第二步,模态模拟与含噪观测。 按指定损伤状态求模态,给振型加指定相对 RMS 的高斯扰动,频率扰动取振型噪声的十分之一,再按二范数归一化、统一符号。

第三步,独立工况上的贝叶斯权重校准。 目标函数由频率、MAC、曲率三项加权组成,权重怎么取不靠拍脑袋------单独构造一组校准损伤工况(位置随机、且避开测试指定的单元),用高斯过程 + 期望改进在权重的三维空间里搜。

第四步,三种方法反演。 同一评估预算下跑 FOX、DEFOX,以及 DEFOX+PINN 交替反演。

第五步,评价、绘图与导出。 算 MAE、RMSE、损伤单元相对误差、误报漏报、F1,导出 25 幅图(FIG + 矢量 PDF + 600 dpi PNG)。

九组识别工况覆盖三种难度层次:简支梁 3 处损伤配 0%/5%/10% 振型噪声;刚架 1 处、2 处、3 处损伤各 20%(噪声 10%);模拟试验梁 1 处 40%、2 处 53.33%/40%、3 处 66.67%。


03 技术路线

复制代码
有限元建模(梁 / 双层刚架,K(d)=Σ(1-dₑ)Kₑ)
      │
      ├─→ 健康模态 + 曲率基准
      │
      ├─→ 模拟含噪观测(振型相对RMS噪声,频率噪声=1/10)
      │
      ├─→ 贝叶斯权重校准(独立校准工况,RBF-GP + EI)
      │        └─ 输出固定权重 [w₁ w₂ w₃]
      │
      └─→ 主反演循环(同一评估预算 60% / 20% / 20%)
              │
              ├─ DEFOX 反演 → 损伤估计 d̂
              │        │
              │        └─→ PINN 训练(坐标网络 + 频率参数 + 物理残差)
              │                 └─ 输出修正后的模态观测
              │
              ├─ DEFOX 反演(热启动,用修正观测)
              ├─ PINN 再训练
              └─ DEFOX 最终反演 → 最终损伤 d̂

关键点在于预算。三种方法共用同一个在线评价次数上限(快速模式 3030 次,完整模式 18060 次)。混合方法把预算按 60%/20%/20% 切开,每次更换观测后重新评价热启动种群,这些调用也算进预算。不同阶段用的是不同观测,目标值不能被拼成一条"单调收敛曲线"------这一点代码里明确写了注释,绘图时也只比较同一原始观测下的 FOX 和 DEFOX。


04 公式原理

4.1 有限元与损伤参数化

损伤用单元刚度折减率表示,质量不参与损伤:

复制代码
K(d) = Σ (1 - dₑ) · Kₑ ,   dₑ ∈ [0, 0.8]

论文式 (31) 里的 I₂/I₁ 是剩余刚度比,本工程的损伤定义为 d = 1 - I₂/I₁,这样才和表 6 的损伤百分比对得上。

求模态时不显式求逆,先做质量矩阵 Cholesky 预白化,把广义特征值问题变成对称标准特征值问题:

复制代码
M = L·Lᵀ
A = L⁻¹ · K(d) · L⁻ᵀ
A·v = λ·v ,   f = √λ / (2π)

特征值排序后取前 5 阶(梁)或 6 阶(刚架),振型回代并做质量归一化。

4.2 目标函数

三项非负误差,各自除以一个一次确定、之后不再变化的尺度:

复制代码
J(d) = w₁·(Δf/0.02) + w₂·((1-MAC)/0.01) + w₃·(Δκ/κ_scale) + η·‖d‖₁

Δf   = mean( |f_pred - f_obs| / f_obs )         相对频率绝对误差
MAC  = (φ_predᵀφ_obs)² / (‖φ_pred‖²·‖φ_obs‖²)    模态置信度
Δκ   = ‖C·(φ_pred - φ_healthy) - Δκ_obs‖²        曲率变化差异
κ_scale = 健康曲率均方值的 5%
η    = 0.002                                      确定性 L1 稀疏惩罚

尺度固定这件事很重要。如果尺度随候选损伤变化,目标函数就不是同一个函数了,优化过程会失去可比较性。

这里做了几处必要的修正:

论文式 (7) 的 MAC 分母 改用标准的两组振型自内积乘积形式,保证 MAC 对缩放和符号都不变(验证脚本里专门用 -3φ 检查过,误差 < 1e-12)。

论文式 (8) 归一化后直接求和可能恒等于 1,失去辨识能力。本工程改成比较"预测曲率相对于健康结构的变化量"和观测的变化量,这一项才真正能区分损伤。

论文的随机矩阵 L1 项 每次评价都重新采样,会让目标函数随机波动。这里替换为确定性 η‖d‖₁,验证脚本断言了同一输入两次调用结果完全相等。

论文式 (13) 的均方误差文字描述和显示公式不一致,采用残差平方的平均值。

4.3 FOX

按原作者公开实现独立编写。每次迭代在两条分支间以 0.5 概率选择:

复制代码
分支一(声传播 + 扑跳):
   t = max(rand(1,n), eps)
   soundDistance = (x_best·tᵀ / Σt² ) · t
   jump = 0.5·9.81·(mean(t)/2)²
   c = 0.18,若 rand ≤ 0.18 则 c = 0.82
   x_new = 0.5 · soundDistance · jump · c

分支二(随机游走):
   x_new = x_best + randn(1,n) · minTime · 2(1-progress)

minTime 在拿到样本前初始化为 0.5------公开实现里它在未初始化时会导致无穷步长,这里做了修正。

4.4 DEFOX

论文给了 Lévy 飞行、WOA 搜索和动态参数,但没有给完整伪代码和策略组合规则。本工程按论文可用信息实现,并补充一套可审计的确定规则:

复制代码
动态因子   τ  = sin(π·progress/2 + π) + 1
动态权重   C1 = 0.18·τ/T
           C2 = 0.81/T + 0.19·τ
Lévy 指数  β  = 1.5(Mantegna,边界截断)

探索阶段(占 50%):
   在 WOA 包围 / 随机鲸鱼 / 对数螺旋之间选择,
   叠加尺度为 0.1(1-progress) 的 Lévy 扰动

开发阶段(占 50%):
   以当前最优点为中心的狐狸扑跳,
   叠加尺度为 0.1(1-progress)² 的衰减 Lévy 扰动,
   扰动方向取 (x_best - x_prev)

每代保留一个全局最优精英(不额外消耗目标函数调用)

原文里 ω 和 τ 的符号前后不一致,这里统一解释为同一个动态因子。这套组合是工程补充,不等同于作者的未公开源码,代码注释里写明了这一点。

三种算法共用同一套初始化规则:一半均匀随机样本,一半基于稀疏先验的样本(每维以 0.25 概率保留、幅度减半),并且显式包含健康状态。初始化不使用损伤真值。

4.5 贝叶斯权重优化

权重空间是三维的,w ∈ [0,5]³,且排除零值。用自编的 RBF 高斯过程做代理模型:

复制代码
核:k(x,x') = exp( -‖x-x'‖² / (2·0.35²) )      长度尺度 0.35
采集函数:EI = (y_min - μ - 0.001)·Φ(z) + σ·φ(z),  z = (y_min - μ - 0.001)/σ

前四次做随机初始化(第一次固定取 1,1,1),之后每轮从 512 个候选配置里挑 EI 最大的那个。Cholesky 分解用递增 jitter 保证数值稳定。

反馈量是校准集上的平均损伤 MAE。每个候选权重都从相同随机起点跑内层 DEFOX,把优化噪声压下去。校准工况本身独立生成、损伤位置避开测试指定单元,每种结构校准完就用固定权重。

校准集可以用它自己的模拟真值,测试集真值不参与选权、网络训练或优化停止。

4.6 PINN 模态修正

网络输入是归一化的二维坐标,输出是各阶各自由度的模态修正量:

复制代码
φ_net = φ_FEM + 0.1/componentScale · Net(x, y)

末层用零初始化,所以训练起点就是有限元解,网络学的是"偏离量"。三层隐藏层,宽度 32,tanh 激活。

离散物理残差按固定逐行力尺度无量纲化:

复制代码
residual = K(d)·q - M·q·ω²
rowScale = |K|·|q_base| + |M|·|q_base|·ω²      (下限 1e-12)
physics  = mean( (residual / rowScale)² )

联合损失五项加权:

复制代码
L = 1.0 · L_data        + 0.1 · L_physics
  + 10  · L_boundary    + 0.1 · L_normalization
  + 0.1 · L_orthogonal

L_data     = mean((S·q - φ_obs)²) + mean(((ω-ω_obs)/ω_obs)²)
L_boundary = mean(φ_fixed²)
L_normalization = mean((Σ q² - 1)²)
L_orthogonal = mean( (qᵀMq / (‖q‖_M‖q‖_M) - I)² )

频率不做固定值,而是作为独立的 log(ω) 变量和网络一起做 Adam 更新,这样频率恒为正。前半程学习率 1e-3,后半程降到 1e-4。

训练完把网络修正的模态和原始观测按 0.5/0.5 融合,作为下一轮 DEFOX 的新观测。这一步是为了压住初始损伤估计带来的模型偏差------如果全信网络,可能被带得更偏。

有损伤模型用的是论文式 (23) 的广义模态约束,而不是直接套常系数四阶强形式,避免在分段刚度不连续处错误求导。另有一个独立的均匀梁验证:真的用自动微分算四阶空间导数,用解析正弦基加可训练修正作为初值,专门验证连续方程那条链路。


05 算法步骤

把上面串成可执行流程:

  1. 建模 :组装 Kₑ、M,Cholesky 预白化,求健康模态与健康曲率基准。
  2. 构造观测:按指定损伤求模态 → 加噪 → 归一化 → 统一符号 → 计算固定尺度,写入观测对象(不传出真值)。
  3. 权重校准(每类结构一次):生成独立校准工况 → GP+EI 搜索 8 次(完整模式 24 次)→ 取校准 MAE 最小的权重。
  4. 反演 :
    • FOX 或 DEFOX:直接以 J(d) 为目标做群智能搜索;
    • DEFOX+PINN:第 1 段 DEFOX(60%)→ PINN 训练 → 第 2 段 DEFOX 热启动(20%)→ PINN 再训练 → 第 3 段 DEFOX 最终反演(20%)。
  5. 评价:真值只在离线评价阶段使用,算 MAE / RMSE / 相对误差 / 误报 / 漏报 / F1。
  6. 导出 :CSV 表格、results.mat、25 幅图、运行配置.json、每个工况一个 checkpoint.mat。

模态指派单独处理。频率靠近时模态会发生交换,这里不做简单的最近邻匹配,而是构造评分矩阵:

复制代码
score(i,j) = (φ_refᵀφ_pred)² - 0.1·|log(f_ref / f_pred)|

用最多 6 阶的全排列做精确指派,取总分最大的排列,然后统一符号。排列结果做了缓存,避免重复计算。


06 参数设定

所有默认参数集中在 functions/default_config.m,第二个入参可以直接覆盖同名字段。

参数 快速模式 完整模式
解析函数:种群 / 迭代 / 重复 30 / 100 / 3 150 / 500 / 10
结构识别:种群 / 迭代 / 重复 30 / 100 / 1 60 / 300 / 10
每方法在线评价次数 3030 18060
贝叶斯配置数 8 24
校准工况数 2 4
校准内层:种群 / 迭代 16 / 30 30 / 80
PINN 训练步数 300 3000
PINN 宽度 32(3 层 tanh) 32
PINN 损失权重 1, 0.1, 10, 0.1, 0.1 同左
频率-振型融合比 0.5 / 0.5 同左

固定设定:

项目 取值
损伤上限 0.8
L1 系数 η 0.002
评价阈值(仅用于误报漏报统计) 0.02
固定随机种子 20261015
梁:L / E / A / I / ρ 2.46 m / 7×10¹⁰ Pa / 3×10⁻³ m² / 1×10⁻⁷ m⁴ / 2700 kg·m⁻³
梁单元数 / 模态数 / 测点数 10 / 5 / 9
刚架:总高 / 跨度 / 网格 2.82 m / 1.41 m / 0.47 m
刚架梁 / 柱材料 E=2×10¹¹ Pa,ρ=7.59×10³ / 8.59×10³ kg·m⁻³
刚架单元数 / 模态数 / 测点数 18 / 6 / 16
采样率 / 时长 / 阻尼比 / 响应噪声 1000 Hz / 60 s / 1% / 1% RMS
解析函数维度与边界 20 维,SchafferF6 ±100、Rastrigin ±5.12、Schwefel ±500

关于噪声的定义必须说清楚 :文中的"噪声 10%"指加性高斯振型扰动的相对 RMS,频率扰动 RMS 取它的十分之一。论文没有明确噪声分布以及在频率和振型之间的分配方式,这是公开约定,不能把这里的数值误差直接等同于论文表中的数值。


07 运行环境

项目 说明
MATLAB R2025b(本机实测 25.2.0.2998904)
必需工具箱 Deep Learning Toolbox(启动时校验许可证,缺失直接报错)
运行设备 CPU
不依赖 统计与机器学习、优化、信号处理、并行计算工具箱均不需要
字体 中文 SimSun,刻度 Times New Roman
入口 main / main('full') / main('smoke') / run_validation
重绘 main('replot') 可直接从已有 results.mat 重画,不重算

常用调用:

matlab 复制代码
results = main;                                % 快速模式:九组工况 + 25 幅图
results = main('full');                        % 完整统计 + 逐项消融
report  = run_validation;                      % 数值、梯度、指派、消融开关验证
results = main('quick', struct('makePlots',false));
main('replot');                                % 只重画,不重算

改 population 或 iterations 时,要同步覆盖 maxEvaluations = population*(iterations+1),否则预算统计会对不上。输出分别写进 output/quick、output/full、output/smoke;跑同一种模式会覆盖旧结果,需要保留就另外指定 outputDir。


08 实际跑出来的结果

快速模式九组工况 24 次识别,计算部分约 45 s(不含图片导出)。完整预算代表工况单次耗时:FOX 3.2 s、DEFOX 3.2 s、DEFOX+PINN 33.8 s------PINN 训练占了绝大部分,这部分是单独记录并计入总耗时的。

刚架单损伤(第 8 单元 20%,振型噪声 10%)表现最干净:

方法 MAE 损伤单元相对误差 误报 F1
FOX 0.0242 53.4% 4 0.333
DEFOX 0.0045 23.5% 1 0.667
DEFOX+PINN 0.0039 22.2% 0 1.000

刚架三损伤工况出现了一个值得说的情况:DEFOX+PINN 的全单元 MAE(0.0154)反而略高于纯 DEFOX(0.0112),但损伤单元相对误差更低(21.4% vs 25.9%)。原因是混合方法在健康单元上的少量误报拉高了整体 MAE,而它在真正损伤位置上的定量精度更好。这也说明单一指标会误导------MAE 和相对误差得一起看。

简支梁 10% 噪声那组,两种方法都出现了误报和漏报(FOX MAE 0.0651 / F1 0.286,DEFOX 0.0587 / F1 0.25)。模拟三损伤梁工况下 FOX(MAE 0.0476)明显好于 DEFOX(0.1048)。

程序没有预设 DEFOX 或 PINN 必须胜出,这些"不好看"的结果原样保留,没有按真值位置修剪健康单元,也没有筛选随机种子。

完整预算代表工况的对照更接近工程预期:FOX 0.0307、DEFOX 0.0296、DEFOX+PINN 0.0291,对应约 3.07 / 2.96 / 2.91 个损伤百分点。这是固定权重下的单次代表工况验证,不是统计结论。

解析函数基准(20 维,3 次重复)呈现出明显的分化:FOX 在 Expanded Schaffer F6 和 Rastrigin 上三次全部收敛到最优值 0;DEFOX 在快速预算下 Rastrigin 均值 109.95、SchafferF6 均值 8.38,明显落后;WOA 居中。这里要注意,快速模式预算很紧,DEFOX 的动态权重和 Lévy 扰动还没到发挥作用的阶段。

贝叶斯校准:梁选中权重 1.000, 1.000, 1.000(第一轮随机点即最优,校准 MAE 0.0142);刚架选中 3.561, 2.680, 0.0689,校准 MAE 0.0213------三项权重差异不小,说明刚架这个工况对曲率项几乎不敏感。

数值验证:简支梁网格从 10 单元加密到 20 单元,前五阶频率最大相对误差约 0.026%(均更接近解析解);自动微分与中心有限差分梯度的相对差异 7.52e-10;解析正弦函数四阶自动微分最大绝对误差 1.42e-14;模拟时程 FFT 独立拾取的五个显著峰,与有限元频率最大相对误差 0.064%。

消融(提醒:这组只有冒烟预算,样本同一批观测,不能用来论证优越性):无 PINN 的 MAE 0.055、去除 Lévy 上升到 0.080,完整方法 0.036。方向上有信号,但强度不足以下结论。


09 应用场景

这套流程能落地的地方,我列几个实际的:

桥梁与框架结构的损伤定位。 用少量加速度测点或模态测试结果反推构件刚度退化,输出的是每个单元的折减率,可以直接对应到具体构件编号,比只给一个"结构整体异常"的指标更可操作。

传感器布置方案的可行性预评估。 工程里测点数量是硬约束。这套代码可以固定传感器数量与位置、扫不同损伤组合,看哪些位置组合还能保持辨识能力------比在实测结构上试错便宜得多。

有限元模型误差与真实损伤的分离。 PINN 这一层的作用就是把"模型不准"和"结构变坏"分开算账。如果实测数据和有限元对不上,先看网络学出来的修正量有多大,再判断是模型问题还是损伤。

优化算法研究的标准测试台。 FOX / DEFOX / WOA 在同一评价预算、同一初始化规则、同一目标函数下对比,还额外挂了三个解析基准函数和完整消融开关。做群智能算法的人可以直接拿这个框架验证新策略,不用再自己搭脚手架。

需要明确一点:目前这套东西完成的是仿真验证,没有接实测数据。 论文表 7 的公开频率只做独立对照,不和模拟振型拼接,模拟时程也没有被当作实测时程使用。


10 这份复现的边界

写技术文章最怕把补充假设写成论文原意,这里把边界交代清楚:

哪些是论文给的:梁的几何与材料参数、刚架材料表(表 4)、单元编号(图 12)、信号采样率与时长、Adam 优化器、广义模态约束形式(式 23)、损伤定义(式 31 的剩余刚度比)。

哪些是补充假设:网络层数与宽度(3×32)、残差式参数化、五项损失权重、具体学习率衰减策略、L1 系数与评价阈值、刚架每节点三自由度的平面实现、噪声分布及其在频率/振型间的分配、DEFOX 的策略组合与伪代码。

哪些论文本身有瑕疵:式 (7) 的 MAC 分母、式 (8) 归一化后可能恒为 1、随机矩阵 L1 会使目标函数随机波动、式 (13) 的均方误差表述与公式不一致、ω 与 τ 的符号矛盾。这些都在代码里做了修正,并在 README 中逐条记录。

哪些还没做完 :完整模式下九组工况各十次重复、以及完整规模的消融,程序和输出路径都已实现,但尚未全部执行完。当前 output/ablation_check 里的消融结果是冒烟预算跑的,不能用于论证算法优劣。快速模式每个工况只跑一次,汇总表里标准差一律记 NaN,不据此宣称统计显著性。

工程里还留了一份 源文件SHA256.csv,代码、说明文档和输入论文的校验值都记了下来,配合 运行配置.json 里可直接阅读的参数与来源说明,方便别人复现和核查。


写在最后

做这次复现最大的体会是:把物理塞进优化和把优化塞进物理,是两个完全不同的问题。

FOX 这种算法在低维、平滑、可解析的基准函数上表现极其强势(三次全部命中 0),但一进到结构识别这种高维、非凸、目标函数由多个不可比误差项拼起来的场景,优势就没了。而 PINN 反过来------它在单损伤、噪声可控的工况里能把损伤单元相对误差和误报同时压下去,但训练成本是群智能搜索的十倍量级,多损伤高噪声下收益也不稳定。

所以真正有价值的问题不是"哪个算法更强",而是"在什么观测条件和预算下,哪个环节值得投入"。这套代码至少把这个问题变成了可以实测的东西。

代码、数据、图表、校验值都已归档。所有振型、加速度和识别输出均由程序计算或模拟生成,没有把论文表格里的识别结果写回计算结果。


相关推荐
机器学习之心7 小时前
基于CNN-BiLSTM的轴承剩余寿命预测,MATLAB代码
matlab·cnn·cnn-bilstm·轴承剩余寿命预测
苦瓜汤补钙9 小时前
Matlab 2022b(中文)的使用教程——Win11
开发语言·matlab
星夜离尘561 天前
MATLAB 工程实验:滞回加持续时间报警,把 UNKNOWN 留在状态机里
开发语言·matlab
星夜离尘562 天前
MATLAB 只剩批次摘要怎么合并方差:用 n、mean、M2 保留批间差异
开发语言·matlab
爱喝热水的呀哈喽3 天前
HEJIAN RESEARCH
开发语言·matlab
星夜离尘563 天前
MATLAB阶跃响应怎么量:别把最后一个采样点当成稳态
开发语言·matlab
星夜离尘563 天前
MATLAB滑动RMS如何接报警:窗口未满和缺样不能当成正常
开发语言·matlab
机器学习之心3 天前
给地铁牵引系统做一次“体检“:灰色聚类 + 正态云模型的MATLAB完整实现
matlab·数据挖掘·聚类
星夜离尘564 天前
MATLAB 采样混叠实验 20 Hz 和 80 Hz 为什么会得到相同数据
matlab·数据采集·信号处理·采样定理·混叠