PINN(Physics-informed Neural Networks)之入门

目录

前言

物理模拟简单公式说明

PINN 

简单理解

具体公式理解

文章section3. data-driven solutions of partial differential equations

Continuous time models

Specific Example-流体模拟

Other Info

Reference


前言

物理模拟简单公式说明

  • 物理模拟可以简单看做不停在解 F= m a这个方程(称之为Governing Equations)-->求a

(其中F(force):某一个粒子的受力(假设已知—— 一般通过deformation得到);m(mass):某一个particle的质量(假设已知—— 一般通过m=ρV(ρ:density;V:volume));a(acceleration):表示某一个particle的加速度(未知数))

  • 对于每一个particle会去track其state

这里简单用position以及velocity来描述state,即:p = (x,v)  (x: 三维坐标,v: velocity)

  • position——x:当前时刻和上一时刻的坐标关系可以看做:x_{t} = x_{t-1} + \Delta {t}\ast v_{t-1}
  • velocity——v:如下图的蓝色公式:

所以v是关于t的一阶导数,a是关于t的二阶导数

Steps: 知道这个时刻的加速度a-->能得到这个时刻的速度v-->知道这个时刻的速度,即能算出下个时刻的位移。

Recap一些公式补充:

(匀速运动)

匀速直线运动的质点坐标: x=x_{0}+vt


(变速运动)

1. 变速运动速度: v=v_{0}+at

2. 变速运动质点坐标: x=x_{0}+v_{0}t+\frac{1}{2}at^{2}

3. 速度随坐标变化公式:v^2-v_{0}^2=2a(x-x_{0}) 


PINN 

PINN的seminal paper来自于2019年的这篇文章👇🏻

 文章Link: https://www.sciencedirect.com/science/article/abs/pii/S0021999118307125


简单理解

根据上面简单的一些公式说明,我们意识到是在不停地解F=ma这个方程,那么可以变成一个解F-ma=0 这个公式,即做minimization下面:

min||F-ma||^2=0 

不断缩小F-ma,逼近求得一个a满足F-ma=0

这个就可以用neural network来模拟,即loss function。


具体公式理解

(解读PINN文章的一些重点内容)

根据前言的小知识,我们可以明白在文章2. Problem setup 公式(1):

u_{t}+N[u:\lambda ]=0,x \in \Omega , t \in [0,T]

从high-level来看即F=ma(F-ma=0),这里整理成的形式是一个关于时间的偏微分方程 partial differential equations(PDE)

文章section3. data-driven solutions of partial differential equations

从文章3开始,上面的(1)公式可以写成更简单的形式如下图:

Continuous time models

3.1对上面的图片中红框标出的公式(2)进行了简化。

  • 物理模拟的loss regulate: f为F-ma,其中MSEf即对应:||F-ma||^2=0
  • 数据分布loss regulate这一项是:假设有一些supervision的data,即一些真实的观测数据u^i,与neural network approximate出的u(t_{u}^{i},x_{u}^{i})的数据,进行mse


Specific Example-流体模拟

在文章的4.1.1节给了流体模拟的example来进一步说明PINN,本质上还是F=ma

  1.  流体模拟中,有两个量需要track,即pressure & velocity -->所以公式(15)是两个公式。
  2. 公式(18)把公式(15)整理了一下,变成了右端项为0的方程组形式(解方程组--neural network来帮忙-->公式(19)Loss)

可以注意到公式(19)的MSE loss中的"+号"右边部分,同样是F-ma L2 norm的形式(物理模拟);"+号"左边的部分,同样是有些观测数据然后数据上的regulate loss。


Other Info

如何将显示方程整理成PDE,以F=ma为例,可以考虑如下Steps:

​​​​​​​


Reference

安利一些写得超级不错的相关文章:

PINN——加入物理约束的神经网络 - 知乎【摘要】 基于物理信息的神经网络(Physics-informed Neural Network, 简称PINN),是一类用于解决有监督学习任务的神经网络,它不仅能够像传统神经网络一样学习到训练数据样本的分布规律,而且能够学习到数学方…icon-default.png?t=N7T8https://zhuanlan.zhihu.com/p/544561165深度学习求解偏微分方程(4)PINN局限与拓展 - 知乎创作不易,每篇文章基本都要写一整天,希望给个小小的三连支持一下! 最近一周(11.11-11.17)出一个深度学习求解偏微分方程系列,流程大概是 传统方法不足-->PINN-->PINN实战-->PINN不足-->算子学习-…icon-default.png?t=N7T8https://zhuanlan.zhihu.com/p/666566853PINN物理信息神经网络入门及相关论文 - 知乎物理信息驱动深度学习方法 基于神经网络的微分方程求解器论文总结 物理信息驱动深度学习方法入门详解 物理信息驱动的深度学习方向重要进展与趋势 基于物理信息驱动深度学习的不确定性量化方法 本栏主要介绍物理信…icon-default.png?t=N7T8https://zhuanlan.zhihu.com/p/517450449?utm_id=0

好的,以下是用 PINN 求解二阶 Diffusion 方程的 PyTorch 代码: ```python import torch import numpy as np import matplotlib.pyplot as plt # 定义求解区域的左右边界 x_left = 0.0 x_right = 1.0 # 定义时间和空间步长 delta_t = 0.001 delta_x = 0.05 # 定义神经网络的输入维度和隐藏层维度 input_dim = 2 hidden_dim = 10 # 定义神经网络的输出维度 output_dim = 1 # 定义 Diffusion 方程的初始条件和边界条件 def u_init(x): return np.sin(np.pi * x) def u_left(t): return 0.0 def u_right(t): return 0.0 # 定义神经网络模型 class PINN(torch.nn.Module): def __init__(self): super(PINN, self).__init__() self.fc1 = torch.nn.Linear(input_dim, hidden_dim) self.fc2 = torch.nn.Linear(hidden_dim, hidden_dim) self.fc3 = torch.nn.Linear(hidden_dim, output_dim) def forward(self, x, t): # 拼接时间和空间坐标作为神经网络的输入 xt = torch.cat([x, t], dim=1) h1 = torch.tanh(self.fc1(xt)) h2 = torch.tanh(self.fc2(h1)) out = self.fc3(h2) return out # 定义 PINN 的损失函数 def pinn_loss(model, x_left, x_right, delta_t, delta_x): # 定义空间和时间的网格 x = torch.linspace(x_left, x_right, int((x_right - x_left) / delta_x) + 1).unsqueeze(1) t = torch.linspace(0, 1, int(1 / delta_t) + 1).unsqueeze(1) # 计算模型在内部网格点上的预测值 x_internal = x[1:-1] t_internal = t[1:-1] u_internal = model(x_internal, t_internal) # 计算模型在左右边界上的预测值 u_left_boundary = model(x_left, t_internal) u_right_boundary = model(x_right, t_internal) # 计算初始条件和边界条件的损失 init_loss = torch.mean((model(x, torch.zeros_like(x)) - u_init(x)) ** 2) left_boundary_loss = torch.mean((u_left_boundary - u_left(t_internal)) ** 2) right_boundary_loss = torch.mean((u_right_boundary - u_right(t_internal)) ** 2) # 计算 Diffusion 方程的残差 u_x = torch.autograd.grad(u_internal, x_internal, grad_outputs=torch.ones_like(u_internal), create_graph=True)[0] u_xx = torch.autograd.grad(u_x, x_internal, grad_outputs=torch.ones_like(u_x), create_graph=True)[0] f = u_xx - (1 / delta_t) * (u_internal - u_init(x_internal)) # 计算残差的损失 residual_loss = torch.mean(f ** 2) # 计算总的损失 loss = init_loss + left_boundary_loss + right_boundary_loss + residual_loss return loss # 初始化神经网络模型和优化器 model = PINN() optimizer = torch.optim.Adam(model.parameters(), lr=0.001) # 训练神经网络模型 for i in range(10000): optimizer.zero_grad() loss = pinn_loss(model, x_left, x_right, delta_t, delta_x) loss.backward() optimizer.step() if i % 1000 == 0: print("Iteration {}, Loss = {}".format(i, loss.item())) # 使用训练好的神经网络模型进行预测 x_test = torch.linspace(x_left, x_right, 101).unsqueeze(1) t_test = torch.linspace(0, 1, 1001).unsqueeze(1) u_test = model(x_test, t_test).detach().numpy() # 绘制预测结果 X, T = np.meshgrid(x_test, t_test) plt.pcolormesh(X, T, u_test, cmap='coolwarm') plt.colorbar() plt.xlabel("x") plt.ylabel("t") plt.title("PINN Solution to Diffusion Equation") plt.show() ``` 这段代码中,首先定义了求解区域的左右边界、时间和空间步长等参数,然后定义了 Diffusion 方程的初始条件和边界条件,以及神经网络模型和损失函数。在训练神经网络模型时,使用了 Adam 优化器,最后使用训练好的模型进行预测,并绘制了预测结果。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值