AI × MWORKS:智能波浪生成模型的一次工程实践
这篇文章记录的是一次波浪生成模型的工程实现过程。从波浪谱出发完成频率离散和波分量计算再将核心逻辑封装为动态库并接入 Sysplorer 模型。在这个过程中AI 主要用于辅助整理推导和生成首版代码模型最终能不能用于仿真仍然要回到物理约束、边界条件和结果校核。图1 从海况约束、Julia 计算到动态库封装和系统仿真的整体链路01 先看结果一条波浪曲线是如何生成的在船舶运动仿真中波浪输入是绕不开的一环。这次实践采用了一条比较清晰的路线先用波浪谱描述海况中的能量分布再在 Syslab 中完成频率离散和波分量计算随后将核心计算逻辑封装为 C 动态库最后接入 Sysplorer 模型生成可用于船舶运动仿真的时域波浪输入。这条路线的重点不只是“把曲线画出来”而是让计算结果能够进入工程模型可以被模型调用可以与其他子系统连接也可以继续用于运动响应分析、环境载荷仿真和半实物测试。图2 ITTC 单参数谱下生成的时域波浪曲线示例如果只看图它就是一条起伏曲线但在仿真里真正需要保证的是频率、幅值、相位以及能量分布之间的关系。只有这些关系合理波浪输入才具备进一步分析的意义。图3 在 Sysplorer 环境中调用外部动态库并进行系统级建模02 真正的波浪建模难在还原能量分布如果只是让曲线上下波动办法有很多。随机给几组频率再叠加正弦函数也能很快画出一条看起来像海浪的曲线。但工程仿真不能只看“像不像”还要看它在统计意义上是否站得住。真实海面可以理解为许多波分量的叠加。不同频率附近包含的能量并不一样主频附近通常能量更集中远离主频的区域能量逐渐降低。如果频率点随便取或者简单等间隔取就可能出现两个问题高能区采样不够低能区又被过度代表。短时间看不一定明显放到较长时间的仿真里统计特性就会偏。所以实现前真正需要先想清楚的不是代码怎么写而是每个频段到底应该分到多少能量。这个问题确定下来后面的离散和叠加才有依据。图4 波浪谱可以理解为“频率—能量分布图”波浪谱描述的正是单位频率范围内的能量分布。后续的离散、幅值计算和时域叠加本质上都是围绕这张“能量分布图”展开。03 核心思路按能量离散不是按频率等分为了更直观地理解可以把波浪谱想象成一块厚薄不均的蛋糕横向位置代表频率蛋糕厚的地方代表能量多薄的地方代表能量少。如果按位置等间隔切每一刀看起来很规整但每块蛋糕的重量可能差很多。放到波浪谱里就是部分频段分到的能量不合理。更合适的做法是先计算累计能量再按“重量”去切。这样切出来的每一份能量更均衡映射回频率轴后主能量区的频率点也会自然更密。图5 按位置切分与按能量切分的差异示意这次先以 ITTC 单参数谱为主线基本形式如下实际计算时先对谱函数积分得到累计能量再把指定频率范围内的累计能量分成若干份最后通过反函数求回每个能量点对应的频率。这样处理后频率点不再机械地等间距排列而是跟着谱能量分布走。04 在 Syslab 中快速验证计算逻辑这类模型如果完全手工整理流程并不短查谱模型确认参数含义推积分形式求反函数写离散循环处理边界再把脚本改造成可被工程软件调用的接口。每一步都不算特别难但任何一个小细节处理不好后面的结果都会受影响。在推导和首版代码整理过程中AI 更适合作为一个“草稿整理器”帮助梳理公式、生成函数雏形、提醒可能的边界条件。但模型能不能用仍然取决于物理约束是否清楚、参数范围是否合理以及结果校核是否充分。代码的关键计算逻辑如下先算上下限累计能量再在能量区间内等分最后用反函数求回频率点。function generate_wave_logic(H13, N, w0) B 3.12 / H13^2; A 0.78 w_low, w_high 0.5w0, 2.5w0 F(w) (A / (4B)) * exp(-B / w^4) energy_steps range(F(w_low), F(w_high), length N 1) w_points [(-B / log(4B * e / A))^(1/4) for e in energy_steps] return w_points, diff(w_points) end第一版结果出来后还需要逐项检查几个容易出问题的地方谱函数表达是否正确积分方向是否和区间一致边界值会不会造成无效计算频率点数量是否满足仿真需求异常输入是否会导致计算失败。这些检查看起来琐碎却决定了模型能不能真正进入后续流程。05 从动态库封装到 Sysplorer 调用完成单点计算验证后下一步不是停留在脚本结果而是把计算能力接入工程仿真环境。因为实际工程仿真通常不会只运行一段独立脚本模型需要稳定接口需要和其他子系统连接也需要方便复用。因此在 Syslab 中跑通计算逻辑后可以进一步将计算逻辑封装成动态库。封装完成后外部模型不需要关心内部推导细节只需要按照接口传入参数拿到频率、幅值、相位等结果。这一步是从“算法验证”走向“工程集成”的关键。图6 编译后生成的 dll、h、lib 等工程文件在 Sysplorer 侧可以通过 function 定义输入输出并使用 external C 声明外部函数和动态库路径。这样波浪谱离散化逻辑就能作为模型的一部分被调用而不是停留在单独的计算脚本里。图7 在模型函数中声明输入输出并调用外部动态库随后在模型初始化阶段调用该 function生成若干个具有不同频率、幅值和随机相位的正弦波分量再叠加得到最终波浪曲线。图8 在模型初始化阶段生成波分量并叠加在这条链路中Sysplorer 承担的是系统级集成和验证把外部计算能力接入系统模型把波浪环境输入放进更大的仿真系统里并和船舶运动、控制、载荷等模块继续耦合。也就是说它不是最后“展示一下结果”而是把单点算法放进工程模型的容器。06 换成不同波浪谱流程依然成立以 ITTC 单参数谱为例当有义波高、主频范围和离散数量给定后模型可以输出每个波分量的幅值 、频率 ω 和随机相位 φ。多个波分量叠加后就得到用于仿真的时域波浪输入。图9 多个波分量的计算结果示例图10 多个波分量叠加后的波浪曲线同样的方法也可以扩展到 ITTC 双参数谱、JONSWAP 谱和 Ochi-Hubble 双峰谱。不同谱模型的差异主要体现在谱函数和参数输入上后面的工程链路基本一致确定谱模型完成能量离散生成波分量接入系统仿真。图11 不同谱模型生成的波浪曲线示例一图12 不同谱模型生成的波浪曲线示例二波浪生成看似只是“造一条曲线”实际是在把海况的统计特性、谱能量分布和系统仿真接口统一起来。当这条链路打通以后波浪模型就不再只是数学公式或脚本示例而是可以进入工程仿真的环境输入。这次实践也说明工具可以加快推导和实现但真正让模型可靠落地的仍然是工程人员对物理逻辑、接口稳定性和仿真结果的持续校核。更多案例未来我们也将持续分享更多 AI × MWORKS 的工程实践案例。想了解更多案例内容与资源欢迎登录 MoHub 平台获取探索 AI 在系统建模仿真中的更多应用可能。https://mohub.net/sharing