这篇文章记录的是一次波浪生成模型的工程实现过程。从波浪谱出发,完成频率离散和波分量计算,再将核心逻辑封装为动态库并接入 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