本文译自作者的韩语原文。 阅读原文(한국어)
[论文回顾] Physics-Informed Neural Networks for Turbulence Modeling
Re变成10倍,粘性残差就剩十分之一。λ一旦抹掉传感器项,表上的1%就不再属于那一次训练。
论文信息
- 作者: Raissi, M., Perdikaris, P., Karniadakis, G. E.
- 期刊: Journal of Computational Physics, Vol. 378, pp. 686–707, 2019
- DOI: 10.1016/j.jcp.2018.10.045
- arXiv: 1711.10561
一句话总结
该论文提出了一种通过将 Navier-Stokes 方程直接嵌入(Physics-Informed)神经网络损失函数的方法,实现仅通过几个压力传感器即可反求整个速度场。
推动 λ_PDE、λ_BC、λ_data 三个滑块,损失面倾向物理残差还是传感器项,会跟着变。
손실 가중치 λ가 너무 작으면 그 항이 안 떨어지고, 너무 크면 다른 항을 짓누른다. Re가 커지면 PDE 항이 stiff 해진다 — PINN의 핵심 난점.
只有数据项变深时,传感器拟合还在,散度为零的条件会松开。只有物理项变深时,方程更近了,压力传感器和速度却分开。
研究背景
传统的 CFD 处于两个极端之间。
传统方法 (k-ε, k-ω SST): 依赖于经验闭合系数。当雷诺数或几何形状发生变化时,需要重新调整系数,泛化能力有限。
纯数据驱动的深度学习: 需要大量的标注数据,且训练好的模型无法保证质量守恒或动量守恒。即使预测结果在物理上完全讲不通,损失函数也无法感知。
PINNs 是弥合这一差距的尝试。即使数据稀疏,物理定律也能起到正则化(regularizer)的作用。
核心方法论
PINN 的总损失函数是两项之和:
数据损失 是观测值(例如压力传感器)与神经网络预测值之间的差异。
物理损失 是不可压缩 Navier-Stokes 方程的残差(residual):
第二项是连续性方程(质量守恒)。由于神经网络被训练为使该残差趋于 0,因此预测值始终近似满足 N-S 方程。
导数是通过 PyTorch/TensorFlow 的自动微分 (automatic differentiation) 计算的,不需要额外的数值离散化。
变小以后时间积分怎么变硬,格子那一侧写在低马赫数下不把声音杀掉的渐近保持格式。这边同一份刚性,是用损失权重接下来的。
主要结果
| 案例 | 条件 | 结果 |
|---|---|---|
| 2D 圆柱绕流 | Re=100, 仅使用压力传感器 | 速度场重构误差在1%以内, 准确复原涡旋频率 |
| 顶盖驱动流 (Lid-driven cavity) | Re=1000 | 速度剖面与 DNS 结果的一致性在 1% 以内 |
| 雷诺数反演 | 仅通过速度数据 | 成功将 Re 值本身识别为学习参数 |
特别是反问题 (inverse problem) 的解决能力令人印象深刻。可以从流场中反推雷诺数,或者仅凭速度数据复原隐藏的压力场。这些问题在传统方法中是不可能或极难实现的。
把表上的两个 Re 按粘性项拆开。圆柱是 Re=100,顶盖驱动是 Re=1000,差 10 倍。动量残差里的粘性一块是 。速度尺度靠近 1 时,对流 大小不动,粘性只剩十分之一。连续残差 里没有 Re。若 λ 是数据项和物理项的天平,要在 Re=1000 把粘性一块留在传感器旁边,λ 就得比 Re=100 时更撑得住。
圆柱只用压力传感器,速度场误差在 1% 以内,涡频率也复原了。顶盖驱动和 DNS 的差别在 1% 以内。两个数字都坐在 1% 这个位置。这个位置是 和 互不抹掉的时候。把 λ 加大到传感器项被埋住,几个压力点就不再把速度绑在 1%。把 λ 减小,拟合还在,散度为零的条件会松开。表记下的是天平成立的一个点,不是说 λ 随便搬,1% 还在。
Re 反演只给速度,把 Re 本身当成学习参数。粘性项的系数就是未知数。 错了,残差里的粘性一块整个换一个大小,数据项为了贴住速度,可以把这个错误藏进压力梯度。λ 小,这种藏法就便宜。表上的识别成功,是 λ 把这种藏法变得很贵的那一次。
实际应用可能性
何时有用:
- 实验测量数据稀疏的情况(仅有少数传感器)
- 反问题:需要从测量值反求物理属性(粘度、Re)时
- 基于物理的数据插值:利用物理定律填充实验数据的空白区域
能立即替代 OpenFOAM/Fluent 吗?
目前还不行。训练时间比 FVM 求解器慢数十到数百倍。一个简单的槽道流在 GPU 上可能需要数小时。目前不适合实时工程分析。
但是,与 OpenFOAM 混合使用的研究非常活跃。即通过 FVM 求得粗略解,再利用 PINN 进行精细校正。
# 使用 PyTorch 实现的物理损失计算示例
def physics_loss(model, x, t, Re):
x.requires_grad_(True)
t.requires_grad_(True)
output = model(x, t)
u, v, p = output[:, 0], output[:, 1], output[:, 2]
# 通过自动微分计算偏导数
u_t = torch.autograd.grad(u.sum(), t, create_graph=True)[0]
u_x = torch.autograd.grad(u.sum(), x, create_graph=True)[0][:, 0]
u_y = torch.autograd.grad(u.sum(), x, create_graph=True)[0][:, 1]
p_x = torch.autograd.grad(p.sum(), x, create_graph=True)[0][:, 0]
# x 方向动量方程残差
residual_u = u_t + u * u_x + v * u_y + p_x - (1/Re) * (u_x + u_y)
return (residual_u**2).mean()把 λ 调大、把传感器项抹掉的地方
三维高 Re 里,残差的高频不容易留在网络中。边界层一薄,训练就晃,标准 PINN 不把晃动的幅度交回来。把区域切开,或者从 FVM 的解出发,是下一步的选择,不是把 λ 再拧一下就能补上的。
时间步长加大以后收益会断,这和损失权重是同一类账单。把 Δt 放大 5 倍只快了 1.9 倍、放大 10 倍就停在原地的那扇窗就是这条曲线。λ 也一样,过了某个值,它只是在抹传感器项。
相关文章
如果对您有帮助,请分享。