
求解PDE数值算法、有限差分理论推导及纳维斯托克斯方程的Deeponet和FNO求解方
法与基于物理方程的深度神经网络实现
最近在搞流体模拟,发现传统数值方法和神经网络结合的新玩法挺有意思。今天就拿Navier-Stoke
s方程开刀,聊聊怎么用PyTorch既实现传统有限差分又搞点机器学习黑科技。
先上硬菜——有限差分法。咱先看二维不可压缩NS方程:
```python
# 动量方程离散化模板
def momentum_eq(u, v, p, nu, dx, dy):
# 对流项用中心差分
conv_u = u[1:-1,1:-1] * (u[2:,1:-1] - u[:-2,1:-1])/(2*dx)
+ v[1:-1,1:-1] * (u[1:-1,2:] - u[1:-1,:-2])/(2*dy)
# 扩散项用二阶差分
diff_u = nu * ((u[2:,1:-1] - 2*u[1:-1,1:-1] + u[:-2,1:-1])/dx**2
+ (u[1:-1,2:] - 2*u[1:-1,1:-1] + u[1:-1,:-2])/dy**2)
return conv_u + diff_u
```
这段代码实现了动量方程的空间离散,注意边界处理留了1个格子的空隙。实际计算时需要配合压
力泊松方程迭代,这里为了展示只保留核心逻辑。
不过传统方法有个痛点:复杂几何边界处理起来要命。这时候物理驱动神经网络(PINN)就派上用场
了。看这个PyTorch实现:
```python
class NS_PINN(nn.Module):
def __init__(self):
super().__init__()
self.net = nn.Sequential(
nn.Linear(3, 32), nn.Tanh(),
nn.Linear(32, 32), nn.Tanh(),
nn.Linear(32, 3)) # 输出u,v,p
def forward(self, x, y, t):