ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

神经网络代理模型加速火箭发动机结构动力学优化

神经网络代理模型加速火箭发动机结构动力学优化 简介一份基于神经网络技术的火箭发动机结构动力学优化PDF文档面向从事液体火箭发动机设计、结构动力学分析及机器学习数据建模的工程师、科研人员和研究生。该论文针对大推力液体火箭发动机研制中低频结构动力学频率优化的关键问题提出以改进BP神经网络为核心的求解方案先借助有限元法和试验模态分析构建可信的低频动力学模型再对结构低频特性进行灵敏度分析筛选出对低阶固有频率敏感的设计变量随后将这些变量作为神经网络输出、目标固有频率作为输入建立非线性映射关系最后通过有限元分析验证优化后设计变量能满足固有频率目标要求有效降低与箭体产生谐振的风险。打包内容仅含1个PDF文件体积约280KB涵盖完整的理论推导、方法流程与工程案例适合作为相关课题的参考文献或技术入门资料。目前已有85人浏览学习读者可从中获取将传统有限元仿真与深度学习方法相结合的工程实践思路以及处理复杂结构动力学逆问题的可复用建模框架。1. 神经网络进场之前火箭发动机结构动力学的成本瓶颈在哪某型液体火箭发动机涡轮泵的叶片高周疲劳问题有着典型的过程转速拉过某一区间后叶片动频与谐波激励重合动应力放大十几倍试车台上裂纹出现的周期短得惊人。要改方案工程师能做的常规动作是调整叶根圆角、局部壁厚、加筋位置可每改一次就要重跑一遍有限元模态分析与谐响应分析单次求解 20 到 40 分钟。一个包含频率禁带约束、质量上限约束的优化问题全局搜索至少要评估两三百次时间成本直接以“天”为单位。神经网络在这条链路里的角色不是取代设计师而是取代那个被反复调用的正问题求解器用一批有代表性的样本把设计参数到固有频率、频响幅值、动应力响应之间的映射学出来让优化器在毫秒级推理的基础上完成上万次搜索。下面按一条能落地的路径展开先把正问题为什么慢讲透再把样本、网络、优化器串成闭环。2. 火箭发动机结构动力学优化的正问题瓶颈一次评估为什么这么贵2.1 优化目标与设计变量频率禁带、动响应约束怎么进入数学规划结构动力学优化写出来是一个带约束的非线性规划问题。设计变量 x 是那些能加工、能测量的几何参数比如叶根圆角半径、涡轮泵壳体壁厚、喷管加强筋高度、螺栓预紧力矩目标函数常见的有两类一类是给定质量上限下最小化关注测点的动响应另一类是把前几阶固有频率推出激励频带。约束条件除了质量和静强度还有频率禁带约束、振型相关性约束。我一般会把优化目标先按“神经网络输出容易学什么”重新组织一下常见对应关系如下优化目标数学表达示例神经网络输出建议最小化峰值动响应min max_ω |H(ω, x)|受质量上限约束频响峰值、响应均方根、结构总质量固有频率避开发动机激励频带f_i(x) ∉ [f_low, f_high]前 m 阶固有频率振型与关注测点匹配MAC(x) ≥ 阈值关键节点位移振型分量或 MAC 值注意频率禁带约束和动响应约束是两类不同性质的产物。禁带约束是硬约束违背一点就要罚动响应是软目标越小越好。写损失函数时硬约束要先转成罚项软目标则直接做网络输出。这个区分在后续第 4 章包装目标函数时很关键。2.2 单次正问题求解为什么慢模态分析到谐响应的时间账一次高保真结构动力学求解的成本要拆开看。首先是网格划分和边界条件设置中大型发动机结构动辄上百万自由度准备阶段要确认接触、约束、温度场映射这些人工操作无法完全自动化。然后是模态分析求解广义特征值问题 (K − ω²M)φ 0刚度矩阵 K 和质量矩阵 M 都是大规模稀疏矩阵特征值求解器要迭代很多轮。做完模态分析还要做谐响应分析在关注频带内扫频每个频点都要解一次复数方程。一个需要给出经验数字的环节是中等规模的火箭发动机部段模型单次模态加谐响应求解20 分钟到 1 小时属于正常范围如果模型里带非线性接触或粘弹性阻尼单次求解可能到两小时以上。优化器做全局搜索时评估次数在几百到上千之间这意味着纯 CAE 驱动的优化在单机上几乎跑不动。换句话说瓶颈不在优化算法而在正问题求解器被反复调用。2.3 用批量正问题样本喂养神经网络先把求解器变成数据生成器代理模型surrogate model的核心假设是在设计变量变化范围内固有频率和动响应幅值随参数的变化是相对光滑的。远离模态交叉时结构修改量小频率移动的规律近似连续单调动响应幅值在共振峰附近变化剧烈但在对数坐标下仍然有可学习的结构。神经网络要学的就是这个从参数空间到响应空间的映射。传统响应面法在变量超过 10 个以后拟合效果明显下降Kriging 模型在小样本下表现好但对参数维度增长敏感。神经网络的优势在于结构灵活、可以输出高维响应曲线、训练完成后单次推理是微秒级而且天然支持梯度传播。下面是构造训练数据的示意流程注意核心是“把正问题求解器封装成一个可批量调用的函数”import numpy as np from scipy.stats import qmc def beam_freq(thickness, width, length, E2.1e11, rho7850.0, n_modes3): 简化的等截面悬臂梁弯曲固有频率解析式。 实际工程中这一段应替换为有限元求解器的批处理调用 例如提交 Nastran/ABAQUS 计算后读取 .dat 或 .odb 中的模态结果。 beta [1.875, 4.694, 7.855] # 悬臂梁前 3 阶频率系数 area width * thickness inertia width * thickness**3 / 12.0 frequencies [] for i in range(n_modes): omega beta[i]**2 * np.sqrt(E * inertia / (rho * area)) / length**2 frequencies.append(omega / (2.0 * np.pi)) return np.array(frequencies) sampler qmc.Sobol(d3, scrambleTrue) params sampler.random(600) params[:, 0] 1.0e-3 params[:, 0] * 7.0e-3 # 厚度 1~8 mm params[:, 1] 10.0e-3 params[:, 1] * 20.0e-3 # 宽度 10~30 mm params[:, 2] 200.0e-3 params[:, 2] * 100.0e-3 # 长度 200~300 mm X_samples params Y_samples np.array([beam_freq(h, w, l) for h, w, l in X_samples])这段代码使用 Sobol 低差异序列采样它比随机均匀采样在高维参数空间里的分布更均匀样本不容易聚团。厚度、宽度、长度各自缩放到实际工程范围保证训练数据覆盖的是可制造的参数区间。注意真实项目中beam_freq函数要替换成“提交有限元计算 — 读取模态频率和频响结果”的批处理脚本并且要处理计算失败、网格畸变等异常不要因为个别样本报错就让整个采样流程中断。3. 训练数据与网络设计让神经网络记住结构动力学的映射关系3.1 参数化建模与采样的工程约定变量上下限、几何可行域和样本量训练数据的质量决定了代理模型的上限。设计变量的上下限不能只看设计要求还要考虑几何可行性叶根圆角半径不能大过叶片自身厚度加筋高度不能与相邻壁面干涉螺栓预紧力不能超过材料屈服。采样时这些不可行的区域会生成大量无效样本白白占用有限元计算资源。我一般在采样前先做一轮确定性检查用脚本过滤掉几何干涉和工艺无法实现的参数组合然后再用 Sobol 或拉丁超立方采样。样本量方面有一个粗粒度经验设计变量数乘以 80 到 150。10 个设计变量的模型800 到 1500 个样本起步变量超过 30 个时建议先用灵敏度分析筛出对频率和动响应影响最大的参数否则样本量会大到一个晚上算不完。需要提醒的是神经网络对训练数据分布敏感参数空间的边界区域样本稀疏时预测误差会显著上升。采样时最好额外在边界上补一批样本让代理模型不要把边界误判为外推区域。3.2 输出层该预测什么固有频率、动响应幅值与频响曲线的网络选型结构动力学响应包含几类不同性质的信息选网络时不能一概而论。固有频率和峰值响应是低维标量用全连接网络就能学频响函数是一条随频率变化的曲线用一维卷积网络更合适模态振型是空间分布严格说应该用图神经网络或者以节点坐标作为输入的 CNN但这会让数据准备复杂度上一个台阶。输出类型和网络结构的对应关系如下输出类型输出维度推荐网络结构损失函数建议前 m 阶固有频率mMLP频率相对误差关键测点频响曲线频点数量1D-CNN对数域 MSE动响应峰值或 RMS 值1~k 个标量MLP相对误差 / 对数误差模态振型分量节点数 × 模态数图神经网络或 CNN余弦相似度 / MAC 损失对于中等规模模型我的默认选择是一个三层到四层的 MLP隐层宽度 128 到 256激活函数用 SiLU。输出层如果是固有频率激活函数要保证非负Softplus 比 ReLU 更平滑避免在零附近出现不可导的拐点。3.3 归一化、损失函数与训练循环避免高阶模态主导误差结构动力学数据的量纲跨度很大固有频率在几千赫兹量级动响应幅值可以跨两三个数量级质量在几十公斤量级。如果直接把原始数值喂进网络梯度会被大数值特征主导。我的做法是分物理量归一化频率分量用 Z-score幅值分量先取对数再做 min-max 归一化几何参数用 min-max 归一化到 [0, 1]。损失函数也不要全用 MSE。高阶固有频率数值大绝对误差会被高阶模态主导低阶模态反而学不准。用相对误差或者对数误差更符合动力学问题的物理感知。下面这一段是模型定义和损失函数的核心代码import torch import torch.nn as nn class DynaSurrogate(nn.Module): 结构动力学代理模型。 输入归一化后的设计参数维度 n_in。 输出前 m 阶固有频率和若干个动响应幅值维度 n_out。 def __init__(self, n_in, n_out, hidden256): super().__init__() self.net nn.Sequential( nn.Linear(n_in, hidden), nn.SiLU(), nn.Linear(hidden, hidden), nn.SiLU(), nn.Linear(hidden, hidden), nn.SiLU(), nn.Linear(hidden, n_out) ) self.freq_softplus nn.Softplus() def forward(self, x): out self.net(x) # 假设前 freq_dim 维是固有频率保证输出为正 freq_dim self.freq_dim freq self.freq_softplus(out[:, :freq_dim]) amp out[:, freq_dim:] return torch.cat([freq, amp], dim1) def dyna_loss(pred, target, freq_dim5, freq_weight1.0, amp_weight1.0): 分物理量计算损失 频率分量用相对误差动响应幅值用对数误差。 freq_pred, freq_tar pred[:, :freq_dim], target[:, :freq_dim] freq_loss torch.mean(((freq_pred - freq_tar) / freq_tar) ** 2) amp_pred torch.log1p(pred[:, freq_dim:]) amp_tar torch.log1p(target[:, freq_dim:]) amp_loss torch.mean((amp_pred - amp_tar) ** 2) return freq_weight * freq_loss amp_weight * amp_loss损失函数里freq_weight和amp_weight是超参数初值可以设为 1.0但要注意两类误差的量级。频率相对误差通常在 10^-3 量级对数幅值误差可能在 10^-2 到 10^-1 量级如果不加权幅值误差会主导梯度。训练时用早停early stopping监控验证集损失验证集按参数空间分块选取不要随机打乱——随机分割会让验证集和训练集距离过近低估了外推误差。4. 把代理模型嵌进优化器禁带约束、全局搜索与精校闭环4.1 目标函数包装把频率禁带和质量约束写进罚函数训练好的神经网络要进入优化器第一步是把它包装成一个目标函数。这里的关键是把硬约束转成罚项并且罚项的量级要压过正常目标的变化范围。以频率禁带为例如果设计目标是让前 m 阶固有频率全部避开发动机的激励频带那么频率落进禁带时就要受罚距离越近罚值越大。质量约束同理超出上限就用一次函数或二次函数罚。import numpy as np import torch from scipy.optimize import differential_evolution def objective(x_original): 优化器调用的是原始设计参数先归一化再送入代理模型预测。 x_norm scaler.transform([x_original])[0] pred model(torch.tensor(x_norm, dtypetorch.float32)).detach().numpy() freq pred[:freq_dim] amp pred[freq_dim:] # 基础目标最小化关注频段内的动响应峰值 total float(np.max(amp)) # 频率禁带罚函数落入禁带越深罚值越大 for f_low, f_high in forbidden_bands: for fk in freq: if f_low fk f_high: margin min(fk - f_low, f_high - fk) total 1.0e4 * margin ** 2 # 质量约束超过上限则按超过量罚 mass mass_model(x_norm) if mass max_mass: total 1.0e6 * (mass - max_mass) return total罚项系数不是越大越好。系数过大优化器会把所有精力放在修正罚项上忽略动响应目标系数过小优化结果可能落在禁带内。我一般先跑 20 次随机采样统计正常目标值和罚项的比例再调整系数让两者在同一量级。mass_model可以是另一个小网络也可以是质量解析公式如果结构质量能直接由几何参数推导优先用解析式减少一次预测误差。4.2 differential_evolution 的关键参数与并行评估代理模型的推理速度是毫秒级所以优化器可以选择群体智能类算法而不必担心计算量。SciPy 的differential_evolution是我常用的选择它实现的是差分进化算法适合非光滑、有罚项的目标函数。核心参数配置如下result differential_evolution( objective, boundsbounds, # 设计变量的原始上下限 popsize15, # 初始种群大小 15 * 变量数 tol1e-8, # 收敛容差 mutation(0.5, 1.0), # 变异率范围扰动强度 recombination0.8, # 交叉率保留父代信息的比例 workers-1, # 使用所有 CPU 核并行评估 polishTrue # 最终做局部精化 )参数popsize用默认的 15 通常够用设计变量多于 20 个时增加到 30。mutation控制变异步长范围型取值比固定值更容易在前期大范围探索、后期局部收敛之间平衡。recombination越高子代保留的父代信息越少搜索越激进。polishTrue的作用是在差分进化找到全局最优区域后调用 L-BFGS-B 再做一轮局部精化对光滑的神经网络代理模型非常划算。4.3 候选点精校闭环用高保真有限元修正代理模型误差优化器输出的“最优解”只是代理模型预测的最优真实物理结果必须用高保真有限元复核。差异可能来自训练样本不足、边界区域外推、或者模态交换导致预测跳变。因此完整的优化流程不能止步于一次搜索而要形成闭环用代理模型跑完差分进化得到 Top 5 候选设计点。对这 5 个点做一次高保真模态和谐响应分析。如果存在违反约束或与预测偏差大的点把真实结果追加进训练集。微调代理模型几个 epoch重新搜索。这个闭环的成本分析很重要。纯 CAE 全局优化要做几百次高保真求解代理模型路线只在离线采样阶段批量做几百次求解在线搜索阶段每次评估都是毫秒级推理。对比经验值如下方案高保真求解次数优化器评估次数典型耗时单机纯 CAE 全局优化300 ~ 500 次300 ~ 500 次3 ~ 7 天代理模型 一次搜索300 ~ 800 次离线采样数万次1 ~ 2 天代理模型 精校闭环350 ~ 900 次数万次 × 多轮1 ~ 3 天什么时候值得用代理模型单次高保真求解超过 5 分钟、设计变量超过 6 个、且需要对多个工况反复搜索的场景都值得。单次求解只要几秒钟的小算例用代理模型的收益不大因为离线采样阶段的时间已经能覆盖直接优化的成本。5. 火箭发动机场景下的排错模态交换、热-力耦合与域外预测5.1 模态交换与标签错位用 MAC 重排训练数据的阶次训练数据里固有频率的“第 1 阶、第 2 阶”标签不是天然稳定的。设计参数变化后原本的第 1 阶弯曲模态和第 2 阶扭转模态可能在某个区域频率交叉纯按频率大小排序会让标签跳变神经网络学到一个不连续的映射误差大幅上升。正确做法是用模态置信准则MAC做模态跟踪用上一设计点的振型为基准重新匹配当前设计点的模态阶次。import numpy as np from scipy.optimize import linear_sum_assignment def reorder_modes(phi_ref, phi_cur, f_cur): 基于 MAC 矩阵的模态重排序。 phi_ref: [节点数, 模态数]参考设计的振型 phi_cur: [节点数, 模态数]当前设计的振型 f_cur: 当前设计按频率升序排列的固有频率 # 计算 MAC 矩阵值越接近 1 表示两阶模态越相似 denom np.diag(phi_ref.T.conj() phi_ref)[:, None] * \ np.diag(phi_cur.T.conj() phi_cur)[None, :] mac np.abs(phi_ref.T.conj() phi_cur) ** 2 / (denom 1e-12) # 用匈牙利算法找 MAC 最大的全局匹配 row, col linear_sum_assignment(-mac) return f_cur[col], phi_cur[:, col]linear_sum_assignment求解的是二分图最优匹配它能保证整体匹配得分最高而不是逐阶贪心。实际操作中MAC 计算需要提取有限元输出的振型向量并且要对节点顺序做严格对齐。复数振型在含阻尼的结构中很常见代码里用共轭转置处理。5.2 热载荷与阻尼的“变量化”冻结常数会让代理模型失效火箭发动机结构的工作环境是热-力耦合的。燃烧室壳体在高温下弹性模量下降叶片在转速变化下离心刚化效应明显阻尼比在小振动和大振动之间甚至差一个量级。如果训练代理模型时把这些参数冻结在名义值试车工况一变模型预测就会系统性偏移。我的建议是把关键工况参数直接作为输入维度加入训练。比如壳体壁面温度、入口压力、转速区间、阻尼比假设值都放进设计变量向量里。样本覆盖点火起动、主级稳态、关机过渡三个工况区间后代理模型学到的就是一个“工况相关的响应面”优化器也就能在多个工况下找最优解而不是只针对冷态结构。代价是输入维度增加、采样数量需要相应提升但总成本仍然低于每个工况各建一个模型。5.3 域外预测与快速拒绝别让神经网络在外推区给出光滑的错误答案神经网络的外推能力比大多数人想象的差。参数落在训练范围之外时网络输出往往光滑、连续、看起来合理但和真实物理完全脱节。火箭发动机结构的参数范围通常有物理下限比如厚度不可能为负、叶根圆角不能小到应力奇异优化器可不管这些它会为了目标值跑到训练范围之外找“假的最优解”。我在目标函数里加一个简单的域内检查器def in_domain(x, x_min, x_max, margin0.02): 判断设计点是否在训练范围内。 margin 允许轻微外扩不建议超过 0.05。 span x_max - x_min return bool(np.all(x x_min - margin * span) and np.all(x x_max margin * span))对超出范围的设计点直接返回一个非常大的目标值让优化器自然避开。不要试图用很小的罚值纠正因为外推区的预测值本身不可信罚值小了优化器会反复试探边界。这个快速拒绝器在引入代理模型的同时增加一道物理安全边界。工程排错中常见的几类问题可以汇总如下错误现象根因应对手段高阶模态预测误差远大于低阶高阶模态对局部几何参数更敏感样本不足增加样本量或在敏感参数方向加密采样低阶频率整体偏移一个固定量边界条件或材料属性被冻结将温度、预紧力等作为输入维度目标函数随迭代剧烈震荡优化器反复跨出训练域启用域内检查器硬拒绝外推点预测频率出现负值或突变输出层激活函数不保证正使用 Softplus 输出层6. 进阶迁移学习、多工况极值目标与物理分组验证6.1 迁移学习历史设计数据把冷启动样本量压到必要下限同一型发动机的改型设计中大量历史有限元结果是可以复用的。上一版壳体的训练数据已经包含了材料特性、边界条件、结构拓扑的大部分信息新设计的几何参数只有局部变化。我的做法是用历史数据预训练代理模型然后冻结前两层网络参数只微调输出层。效果上冷启动样本量可以从 1000 个降到 200 到 300 个。import torch # 假设 pretrained_state 来自历史模型维度不同时只拷贝形状匹配的层 pretrained torch.load(engine_shell_v1.pth) new_model DynaSurrogate(n_in, n_out) state new_model.state_dict() for k, v in pretrained.items(): if k in state and state[k].shape v.shape: state[k] v new_model.load_state_dict(state) for name, param in new_model.named_parameters(): if name.startswith(net.0) or name.startswith(net.2): param.requires_grad False冻结前两层相当于保留历史结构的基础特征提取方式只让输出层适应新设计的频率和响应分布。如果两个设计域相差太远比如从涡轮泵转子迁移到喷管扩张段特征已经不具备通用性硬迁移反而会拖慢收敛甚至引入负迁移。6.2 多工况极值目标把转速扫掠循环并入训练标签火箭发动机最恶劣的动响应往往不在单一转速点而在起动或关机穿越共振区的瞬间。如果训练标签里只有某个固定转速下的响应幅值优化结果会在另一个转速点失效。更实用的做法是让数据生成阶段对每个设计点扫掠完整转速剖面取整个剖面中的最大响应作为标签训练得到的代理模型直接预测“最恶劣工况响应”。优化器搜索的就是全局最恶劣情况下的结构方案计算成本增加在离线采样阶段在线推理仍然只有毫秒级。6.3 一组验证案例怎么设计物理分组校验比随机划分更有说服力训练时常见的验证集划分方式是按样本序号随机切分这会让验证样本与训练样本距离过近低估模型在真实设计空间中的误差。更可靠的是按物理工况分组把点火起动、主级、关机三种工况的数据拆开训练集只含主级工况验证集用起动和关机工况专门考察跨工况外推能力。下表是一组推荐的精校检查项验证对象检查内容建议指标全局扫频精度训练域内随机 50 个点与高保真求解对比频率相对误差 1%幅值对数误差 0.3候选最优解复核优化器给出的 Top 5 点有限元精校目标函数偏差 5%禁带约束零违反热态外推边界取未参与训练的高温工况频率误差 3%判断是否需要增量学习这个验证矩阵的最后一项最容易被忽视。代理模型在训练域附近要准在训练域边界不能“自信地错”。把验证集按物理工况分组而不是随机打乱你才能真正分清楚模型是学会了结构动力学的规律还是只背下了训练样本。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进