
简介这是一份海洋工程方向的随机波浪速度与波浪力计算资源面向从事海洋结构物设计、船舶与海工研究的工程师、研究生及高年级本科生解决随机波浪序列生成、速度场求解与小尺寸结构物波浪力评估问题。压缩包共2个文件以MATLAB脚本.m为主辅以1张说明图.png整体约39KB。其中脚本可基于Jonswap谱生成随机波浪序列结合小振幅理论计算波浪速度场再通过Morison方程求解作用于小尺寸结构物的波浪力说明图用于展示流程或结果便于验证与理解。已有879人浏览学习。资料短小精悍适合需要快速搭建随机波浪计算流程、理解从谱模拟到受力评估完整链条的读者可作为课程设计、科研入门或工程验证的参考脚本。1. 随机波浪速度及波浪力为什么把几十个余弦波叠加起来就能骗过海洋在海洋工程里真正用于桩柱、立管和浮体受力的波浪极少是实验室里那种规则的单个余弦波。工程规范默认的做法是把一段海况看成无数频率不同、相位随机的余弦波的线性叠加然后逐点求出每个波分量对应的水质点速度和加速度再用经验公式把力算出来。这套“随机波浪模拟→随机波浪速度→随机波浪力”的链条表面上只是套公式实际上每一环都压着一个强假设波浪是线性的、分量之间互不干扰、力的非线性可以留到最后再处理。理解这些假设才能看懂为什么同一组海况参数不同程序算出来的极端作用力可以差到两倍。2. 随机波浪的生成机制频谱、随机相位与“伪随机”的底层真相2.1 波能谱一张谱图就是一段海况的完整配方随机波浪的“随机”不是白噪声那种随机而是有结构的随机。描述这个结构的标准工具是波能谱密度 S(f)单位是 m²·s频率谱或 m²·s/rad角频率谱。它回答的问题很简单单位频率宽度内这个海况携带多少波动能量也就是自由表面方差。所以一张谱图就是一段海况的完整配方谱峰在哪、能量集中在哪个频带、高频尾巴衰减多快全写在里面。工程上最常见的两个谱是 Pierson-Moskowitz 谱充分成长海况和 JONSWAP 谱有限风区、未充分成长。以频率形式写P-M 谱的表达式是S_PM(f) 0.3125·Hs²·fp⁴·f⁻⁵·exp(-1.25·(fp/f)⁴)Hs 是有义波高fp 是谱峰频率。JONSWAP 在 P-M 基础上乘一个峰增强因子 γ^rγ 默认取 3.3r 是在谱峰附近取值的窄窗。这样做的物理原因是有限风区里成长中的波浪能量不像充分成长那样均匀铺开而是明显集中在谱峰附近。换句话说P-M 是“标准身材”JONSWAP 是“肩更窄、峰值更高”的版本。代码里实现 JONSWAP 谱的函数长这样import numpy as np def jonswap(f, hs, tp, gamma3.3): 频率域 JONSWAP 谱f 为频率数组单位 Hz fp 1.0 / tp sigma np.where(f fp, 0.07, 0.09) pm 0.3125 * hs**2 * fp**4 * f**(-5) * np.exp(-1.25 * (f / fp)**(-4)) r np.exp(-(f - fp)**2 / (2.0 * sigma**2 * fp**2)) return pm * gamma**r这里有一个容易忽略的细节sigma 在谱峰两侧取值不同f≤fp 时取 0.07ffp 时取 0.09这是为了让谱的左翼更陡、右翼更缓符合实测波浪谱的偏斜形状。这段代码看起来只是“套一个公式”但它直接决定了后面速度和力的能量分配谱形取错频率域的权重就错了力的结果差出百分之几十是很正常的。用谱而不是用“波高周期”来描述海况是因为随机波浪的响应本质上是窄带随机过程谱是它二阶统计量的完整描述。有了谱波面方差等于零阶矩 m0∫S(f)df有义波高又近似满足 Hs≈4√m0。这一条是后面自检模拟结果是否合格的锚点也是整个随机波浪模拟的能量红线。2.2 随机相位与线性叠加随机性到底藏在哪有了谱第二步是把连续谱离散化成有限个分量再叠加成波面时间序列。最经典的线性叠加法把波面写成η(t)Σ a_i·cos(k_i·x − 2πf_i·t ε_i)每个分量的振幅由谱密度决定a_i √(2·S(f_i)·Δf)关键点来了振幅 a_i 是确定性的频率 f_i 是确定性的波数 k_i 由色散关系确定也是确定性的。整条波面里唯一随机的部分是每个分量的相位 ε_i——它在 [0, 2π) 上均匀分布。这就是随机波浪模拟里“伪随机”的真相计算机用随机数生成一串相位剩下的工作全是确定性的叠加。你换一个种子等于换一组相位得到一条长相完全不同、但统计性质相同的波面。def phase_seeded(f, S, seed42): df f[1] - f[0] amp np.sqrt(2.0 * S * df) rng np.random.default_rng(seed) eps rng.uniform(0.0, 2.0 * np.pi, sizef.shape) return amp, eps这里有一个常见误解以为“随机波浪”必须让振幅也随机。实际工程实现中振幅是被谱完全锁定的只有相位随机。这是因为线性系统下波面的二阶统计量由各个分量的自功率谱决定相位只影响波面长什么样不改变它的能量谱。随机相位的作用是让不同分量之间失去相干性从而让叠加后的波面看起来“混乱”并且在统计上趋近高斯过程。需要特别说明的是线性叠加法生成的只是“谱等价的高斯海况”。真实大风浪下波峰偏尖、波谷偏平那是非线性效应线性叠加法天然表达不了。所以这套方法默认了你接受一个近似海况是高斯随机过程相位结构是均匀随机的。工程上绝大多数随机波浪力计算都建立在这个近似上因为它换来了极其廉价的高精度统计描述。2.3 分量个数与频率离散N取200还是2000差在哪分量个数 N 直接决定波面的“细腻程度”和随机性质量。N 太少时中心极限定理还没生效波面会呈现明显的分组调制看起来一簇一簇的而不是均匀混乱的海面N 太多时直接叠加的时间复杂度是 O(N×M)M 为时间点个数力和速度计算时每个时间点都要做三角函数求和计算量会明显上涨。更隐蔽的坑是频率上限。谱虽然按 f⁻⁵ 衰减但高频部分不是零。如果截断频率选得太低比如只取到 2fp谱尾能量被整体丢掉模拟波面的方差会小于目标值。一般建议 f_max 取到 5~6 倍谱峰频率然后做能量校核f np.linspace(0.01, 0.6, 2048) S jonswap(f, hs4.0, tp10.0) m0_target np.trapezoid(S, f)拿到波面时历后的第一个自检动作是算模拟波面的方差它应该约等于 m0_target然后算模拟有义波高 Hs_sim4·std(η)和目标 Hs 对比。这一步不是形式上的验收而是确认离散化过程没有偷走能量。工程上最常见的翻车场景是频率点数明明很多但用了均匀频率采样谱峰又特别尖结果模拟 Hs 比目标 Hs 矮了 10% 以上。解决办法通常有两种。一种是加密频率点让 Δf 小到能贴住谱峰另一种是改用“等分能量法”把谱曲线下面积切成 N 块面积相等的区间每个区间取一个代表频率和代表谱值保证每个分量携带相同能量。谱峰越尖等分能量法的优势越明显。所以“N200 够不够”永远没有唯一答案真正的答案是模拟结果的 m0 和 Hs 校核通过了才够。3. 随机波浪速度计算把自由表面位移还原成水质点运动3.1 速度势与线性波理论速度不是波高直接除以周期很多人把波浪速度想成“波高除以周期”这是混淆了波面传播速度和质点速度。波面传播速度是波长除以周期而水质点本身并不随波前进它只是在原地做近似椭圆轨道运动。线性波理论里要得到水质点速度第一步是假设流体无旋、不可压缩于是存在速度势 φ满足拉普拉斯方程。自由表面条件和小振幅假设把问题线性化之后单个余弦波分量的速度势解为φ_i (a_i·ω_i/k_i) · [cosh(k_i(zh))/sinh(k_i·h)] · sin(k_i·x − ω_i·t ε_i)对这个速度势取空间梯度得到水平速度 u 和垂向速度 wu_i a_i·ω_i·cosh(k_i(zh))/sinh(k_i·h) · cos(k_i·x − ω_i·t ε_i)w_i a_i·ω_i·sinh(k_i(zh))/sinh(k_i·h) · sin(k_i·x − ω_i·t ε_i)随机波浪情况下线性系统允许叠加总速度就是每个分量速度的求和。这也是为什么“先模拟波面、再算速度”必须共用同一套随机相位波面、速度、加速度来自同一组相位结果才有物理意义。如果波面用一个种子、速度用另一个种子三者统计上互不相关算出来的力完全是一堆没有因果关系的数字。速度表达式里有两个容易被忽略的量。一个是 cosh(k(zh))/sinh(kh)它描述速度沿水深的衰减z0 时等于 coth(kh)z−h 时等于 1/sinh(kh)所以水平速度在水底不为零垂向速度在水底则为零。另一个是 ω_i 前面的因子速度幅值正比于 a·ω高频分量尽管波面振幅小却能产生可观的速度。这个“裸露的 ω”到了力计算那一层会变成 ω²高频误差会被进一步放大。3.2 有限水深修正深水近似在什么时候会坑你色散关系 ω²g·k·tanh(k·h) 确定了频率和波数的关系。如果直接取深水近似 k≈ω²/g等于默认 tanh(kh)1也就是 kh 足够大。kh 大于 π 左右时这个近似误差在 1% 量级但在中等水深和浅水tanh(kh) 明显小于 1真实波数和深水近似差得越来越远。给定 ω真实 k 是方程 kω²/(g·tanh(kh)) 的根。因为 tanh(kh)1右边需要更大的 k 才能平衡所以真实 k 大于深水近似 k。更大的 k 意味着什么速度放大因子 cosh(k(zh))/sinh(kh) 在自由表面是 coth(kh)kh 越小coth(kh) 越大。也就是说同一个频率、同一个波面振幅在浅水里产生的水平速度更大。把浅水当深水算速度会被系统性低估基础、立管上的波浪力也跟着偏小。判断标准很朴素算完色散关系后看一眼 kh。khπ 可以用深水近似khπ/10 用浅水极限 kω/√(gh)中间区间老老实实解完整色散方程。很多程序为了省事全程用深水近似在浅水长周期海况里速度低估 20% 以上这不是调调系数能补回来的而是物理模型本身就选错了。3.3 从谱直接算速度场色散关系迭代与叠加实现把前两节的逻辑落成代码。这里用固定点迭代解色散关系初值给深水 k然后反复更新def wave_kinematics(f, S, z, h, seed7): 给定频率轴、谱、目标高程 z 和水深 h返回速度/加速度构造函数 df f[1] - f[0] amp np.sqrt(2.0 * S * df) rng np.random.default_rng(seed) eps rng.uniform(0.0, 2.0 * np.pi, sizef.shape) omega 2.0 * np.pi * f g 9.81 k np.empty_like(f) for i, w in enumerate(omega): k_i w * w / g # 深水初值 for _ in range(30): k_i w * w / (g * np.tanh(k_i * h)) k[i] k_i gu np.cosh(k * (z h)) / np.sinh(k * h) gw np.sinh(k * (z h)) / np.sinh(k * h) def calc(t, x0.0): phi k * x - omega[:, None] * t[None, :] eps[:, None] u np.sum(amp[:, None] * omega[:, None] * gu[:, None] * np.cos(phi), axis0) w np.sum(amp[:, None] * omega[:, None] * gw[:, None] * np.sin(phi), axis0) return u, w return calc固定点迭代在大部分情况下都能收敛因为 tanh 函数单调且有界。但要注意水深非常浅时迭代次数会变多更稳妥的做法是把方程改写成二分法求根。这里的关键是最终 k 的符号和大小必须和 ω 一致相位里的 k·x 才和实际波长相匹配否则多个 x 位置处的力会算错。这个函数返回一个闭包 calc你在任意一组时间点上调用它就能得到同一时刻的水平速度和垂向速度。强调“同一时刻”是因为力计算里后续要用到加速度加速度必须和速度同相位、同频率不能另起炉灶重新生成一条随机过程。工程实现里常见的错误就是速度算一套、加速度算一套结果相关系数完全不对。4. 随机波浪力计算Morison方程里谁在真正扛力4.1 拆开Morison方程拖曳力和惯性力对频率的响应完全不同海洋工程里算细长杆件桩柱、立管、电缆的波浪力标准工具是 Morison 方程。它把单位长度上的水平力写成两项之和F 0.5·ρ·Cd·D·u·|u| ρ·Cm·A·(du/dt)第一项是拖曳力来自流体质点绕柱时产生的压差阻力正比于速度的平方。第二项是惯性力它由两部分构成未被扰动流体的 Froude-Krylov 力以及柱体加速运动时带动周围流体一起加速产生的附加质量力。工程上干脆合成一个系数 Cm对光滑圆截面柱体Cm 一般取 2.01 份 Froude-Krylov 1 份附加质量。这两项对频率的敏感度完全不同。单个线性波分量下速度幅值是 a·ω加速度幅值是 a·ω²。所以拖曳力幅值正比于 (a·ω)²惯性力幅值正比于 a·ω²。低频分量波幅大、加速度小拖曳力容易占主导高频分量波幅小但加速度按频率平方放大惯性力反而压过拖曳力。随机波浪力谱的高频段形状基本由惯性力决定这也是上一章强调速度公式里那个“裸露的 ω”的原因。判断谁主导工程上通常用 Keulegan-Carpenter 数KC U_m·T/DU_m 是特征速度幅值T 是特征周期D 是柱径。KC 小大致小于 5时流动分离弱惯性力主导KC 大大于 20 左右时拖曳力主导中间区域两项都必须保留。随机波浪里U_m 可以用速度时历标准差乘 √2 估算T 用跨零周期。这个判断应该在算力之前做而不是算完再回头看惯性力主导的工况里用了偏大的 Cd力的幅值会虚假偏高。还要记住拖曳力里的 u|u| 是非线性项它让力的时间序列不再是正弦形会出现高次谐波。因此频域里力的功率谱不能简单地把速度谱乘一个系数再平方。工程上做谱分析时常用等效线性化把 u|u| 换成线性增益 α·u其中 α sqrt(8/π)·σ_uσ_u 是速度时历标准差。这是随机线性化的一种实现代价是只匹配方差意义上的能量峰值会被略微抹平。时域 Morison 计算不需要这种近似但代价是极值统计需要跑很长的样本。4.2 速度与加速度的90度相位差力的峰值不该落在波峰回到线性波理论单色波下水平速度 u∝cos(kx−ωtε)加速度 du/dt∝sin(kx−ωtε)。在波峰处速度最大而加速度为零在零穿越处速度为零而加速度最大。两者整整差 90 度。这个相位关系不是数学巧合而是简谐运动的基本性质速度最大时位移变化最缓加速度最大时位移过零。直接后果是Morison 力的峰值不一定出现在波峰时刻而是出现在速度较大、加速度也还不小的某个中间相位上。在随机波浪里每个分量都有自己的频率和相位整体上说不清“力的峰值出现在哪个波面位置”但速度和加速度之间的正交性依然存在对零均值高斯过程速度与加速度的相关系数为零。这意味着你看到某个时刻波面很高那时刻的力不一定大真正的大力往往发生在波面斜率很陡、质点速度很大的陡波面上。这也是为什么只盯着波高最大值做设计会低估波浪力。用代码生成力和加速度时一个高频错误是把加速度写成数值差分。随机速度时历里天然带有高频小幅波动差分相当于乘上一个随频率增长的传递函数高频噪声被放大算出的加速度峰值可以比真实值大出几倍。正确做法是在叠加循环里直接对每个分量解析求导让加速度和速度共享同一组相位、频率和振幅。4.3 随机波浪力的数值实现解析求导取代差分把速度函数扩展成同时输出加速度和力def morison_force(u, acc, D1.0, rho1025.0, cd1.0, cm2.0): A np.pi * D**2 / 4.0 return 0.5 * rho * cd * D * u * np.abs(u) rho * cm * A * acc # 在 wave_kinematics 内部一并算出 acc # phi k*x - omega*t eps # u sum(amp * omega * gu * cos(phi)) # acc sum(amp * omega * omega * gu * sin(phi))这里唯一要留神的是符号。取行进方向为 x相位写成 kx−ωtε则速度是 cos 项加速度是 sin 项符号为正。如果把相位写成 ωt−kxεsin 的符号会整个翻转力和时间轴的对应关系就错位了。波浪力计算里符号错误不容易被统计量发现因为方差、最大值分布往往不受正负号影响但相位敏感的结构响应会出错。参数层面Cd 的取值非常依赖工况光滑圆柱在亚临界雷诺数下约 0.6~1.0粗糙或带海生物附着的柱体可以升到 1.2 以上。而且拖曳力是速度平方Cd 差 0.3力峰值的差距远大于 30%因为 u|u| 把峰值放大了。Cm 在光滑圆柱上通常取 2.0但在 KC 很小、流动没有分离时附加质量系数接近理论值 1.0。不要把 Cd 和 Cm 当成“常数”它们背后是雷诺数和 KC 数控制的不同流动状态。整体计算流程在时域上就四步构造谱 → 分配相位生成波面 → 对每个分量解析求速度和加速度 → 对每个时间点代入 Morison 方程。如果需要整根杆件的总力把单位长度力从水底到自由表面沿 z 积分。注意自由表面 zη 是随时间变化的工程上一般积分到静水面 z0超出部分做修正。这一步处理得粗一点结果差 5%~10% 很正常。5. 随机波浪速度及波浪力计算的常见问题避坑5.1 模拟波高偏低均匀频率采样吃掉了谱峰能量现象同一组 Hs、Tp模拟出来的波面有义波高比输入 Hs 矮了一大截直接自检发现 Hs_sim≈0.85Hs。原因频率点均匀撒在 [f_min, f_max] 上谱峰很尖时峰值附近的能量密度极高但均匀网格的两个相邻点都落在峰两侧相当于把峰“压低”了。再加上高频截断太低尾部能量被扔掉离散后的能量守恒锚点 m0∫S(f)df 不再成立。解决改用等分能量法离散频率让每个分量携带相同能量把 f_max 提到 5~6 倍谱峰频率算完立刻做 m0 校核离散积分和目标谱积分差超过 2% 就要加密或换离散方式。这一步不做后面所有速度和力都是基于“缩水海况”算的。5.2 加速度异常偏大数值差分把高频噪声当成了加速度现象Morison 力时历高频抖动剧烈峰值比解析结果大 50% 以上力功率谱在高频段明显鼓包。原因加速度用的是速度时历的数值差分。随机波浪速度谱在高频段虽然小但非零差分运算的幅值响应随频率线性增长等于把高频分量人为放大。更糟的是速度时历的数值误差在差分后变成尖刺。解决加速度必须在叠加循环里解析求解用同一组 amp、omega、gu、phase 直接算。如果坚持用差分至少用中心差分并先对速度做低通滤波但要意识到这已经改变了原始谱能量不是推荐路径。快速验证办法用单频测试加速度峰值应等于速度峰值乘以该频率的圆频率。5.3 力系数拍脑袋Cd 和 Cm 不是常量现象公式、代码都没问题但对标参考书或规范发现力峰值对不上有时差一倍。原因Cd 依赖雷诺数和柱体表面粗糙度Cm 依赖 KC 数和流场是否分离。同一个 1m 直径圆柱光滑和附着海生物两种状态Cd 可以从 0.7 变到 1.5因为拖曳力是 u|u|这个变化被平方放大。Cm 取 2.0 是光滑圆柱的主流值但在波流联合、近自由面位置会有修正。解决先算 KC 数判断主导机制再按规范或实验曲线取 Cd/Cm并写明取值依据。报告里不要只写“取 Cd1.2Cm2.0”要附带对应工况的雷诺数和 KC 数范围。做参数敏感性分析时把 Cd/Cm 当成不确定度来源而不是固定常数。5.4 水深公式用错浅水工况被深水近似系统性低估现象算出的速度剖面和力在浅水区明显小于实测或更精细参考解长周期海况下尤其严重。原因全程用了深水色散关系 kω²/g忽略了 tanh(kh) 的衰减。浅水里真实 k 更大速度放大因子 coth(kh) 更大速度被低估。解决统一用完整色散关系迭代求 k先判断 kh 区间khπ 才允许深水近似。另一个自查办法算一下 u 在水底的值。模拟水深 10m、周期 12s 时若深水近似算出的 u(z−h) 明显小于完整色散关系的结果就说明近似已经失效。5.5 结果不可复现种子没固定极值靠运气现象同一海况重复跑 10 次最大力的变化范围达到 ±20%算出的疲劳损伤也差很多。原因随机相位真的随机时单次模拟只是随机过程的一个样本。波浪力极值对相位组合极其敏感个别极端波群会把力拉高。样本时长太短时凑没凑到这种波群结果自然漂移。解决固定随机种子保证同一输入永远得到同一输出把模拟时长定到足够长至少覆盖几百个跨零周期或者跑多次实现把每次的最大值做极值拟合取分位数而不是拿单次最大值当设计值。做敏感性分析时把种子作为变量得到的是极值分布而不是一个确定数字。6. 设计取舍线性叠加拿什么换来了工程上的“够用”线性叠加法能成为随机波浪计算的事实标准不是因为物理上精确而是因为它在精度和成本之间的折中做得好。它把所有非线性都挤压到最后一个步骤速度场线性叠加力再用 Morison 方程做非线性修正。这样得到的速度和加速度是平稳高斯过程可以直接做谱分析、疲劳损伤计算和极值外推计算量小到可以在普通工作站上跑上万秒的时历。作为对比全非线性势流或 CFD 求解一个高海况的几小时时历代价高出几个数量级工程初选阶段根本付不起。代价在哪里线性理论下的波面是对称的波峰和波谷分配相近的概率质量波面高程近似高斯分布。真实大浪下波峰会变尖、波谷会变平波面偏离高斯随机相位法生成的是均匀随机相位的“平均水平”无法复现真实海况里因波-波非线性相互作用形成的波群结构更模拟不了极端波浪那种相位聚集。速度场在自由表面附近也被线性理论低估因为真实水质点在波峰附近的速度比线性预测更大、更不对称。这些误差在拖曳力平方项上都会被进一步放大。所以我的一般做法是把线性叠加法当作“第一遍筛子”用来筛选工况、估算疲劳和初步极值凡是波陡过大、水深很浅、或结构对非线性敏感的部位再单独用非线性波或更精细方法复核一遍。如果你正准备做这类计算这份资源里的代码把谱构造、色散关系迭代、速度恢复和 Morison 力求解的完整链路封装成了可直接改参数的流程正好绕开上面那些坑。某次在模拟项目 X 里我正是不加区分地把线性结果直接拿去和规范极值对标发现极端力差 40%最后定位到是波陡太大、线性假设已经不成立了。从那以后我每次拿到随机波浪速度及波浪力计算结果都强制把海况的波陡和 KC 数先算一遍确认线性假设还成立再继续往下走。希望帮到你。本文还有配套的精品资源点击获取