PinnDE:基于物理信息神经网络的微分方程求解库
PinnDE:基于物理信息神经网络的微分方程求解库
摘要
本文介绍了PinnDE,一个用于求解微分方程的开源Python库,集成了物理信息神经网络(PINNs)和深度算子网络(DeepONets)。通过详细解析PINNs和DeepONets的理论基础,展示了PinnDE的核心功能、架构设计及使用方法。结合线性对流方程、泊松方程、热方程等经典案例,演示了库的实际应用流程,并通过对比实验验证了其有效性。
关键词:微分方程求解;物理信息神经网络;深度算子网络;开源库;机器学习
1. 引言
微分方程是描述自然现象和工程问题的核心数学工具,其高效求解一直是科学计算领域的研究热点。传统数值方法如有限差分法、有限元法依赖网格划分和数值微分,在处理复杂几何或高维问题时面临挑战。近年来,基于深度学习的方法为微分方程求解提供了新路径,其中物理信息神经网络(Physics-Informed Neural Networks, PINNs)和深度算子网络(Deep Operator Networks, DeepONets)因其灵活性和无网格特性备受关注。
PINNs通过将微分方程的物理约束嵌入神经网络损失函数,实现对解的全局逼近;DeepONets则通过学习解算子,能够快速处理不同初始条件,支持长时间步预测。然而,现有工具多要求用户具备深厚的机器学习和微分方程背景,限制了其普及。
PinnDE是一个开源Python库,旨在通过低代码接口整合PINNs和DeepONets的优势,提供简洁易用的微分方程求解方案。本文将系统介绍PinnDE的理论基础、功能架构及应用案例,帮助读者快速掌握其核心用法。
2. 理论基础
2.1 物理信息神经网络(PINNs)
PINNs通过最小化包含微分方程残差、初始条件和边界条件的损失函数,训练神经网络逼近微分方程的解。其核心思想是将微分方程的约束直接融入网络训练过程,无需显式网格划分。
损失函数:
L
(
θ
)
=
L
Δ
(
θ
)
+
γ
i
L
i
(
θ
)
+
γ
b
L
b
(
θ
)
\mathcal{L}(\theta) = \mathcal{L}_{\Delta}(\theta) + \gamma_i \mathcal{L}_i(\theta) + \gamma_b \mathcal{L}_b(\theta)
L(θ)=LΔ(θ)+γiLi(θ)+γbLb(θ)
其中:
- L Δ ( θ ) \mathcal{L}_{\Delta}(\theta) LΔ(θ)是微分方程残差损失
- L i ( θ ) \mathcal{L}_i(\theta) Li(θ)和 L b ( θ ) \mathcal{L}_b(\theta) Lb(θ)分别为初始条件和边界条件损失
- γ i \gamma_i γi和 γ b \gamma_b γb是平衡权重
硬约束与软约束:
- 软约束:通过损失函数间接满足初始/边界条件
- 硬约束:通过网络结构直接满足约束(如边界条件函数)
2.2 深度算子网络(DeepONets)
DeepONets通过学习解算子
G
(
u
0
)
(
t
,
x
)
G(u_0)(t, x)
G(u0)(t,x),将初始条件
u
0
u_0
u0映射到时空点
(
t
,
x
)
(t, x)
(t,x)的解。网络由分支网络(处理初始条件)和主干网络(处理时空变量)组成,输出通过点积结合:
G
θ
(
u
0
(
x
)
)
(
t
,
x
)
=
B
θ
(
u
0
(
x
1
)
,
…
,
u
0
(
x
N
s
)
)
⋅
T
θ
(
t
,
x
)
\mathcal{G}^{\theta}(u_0(x))(t, x) = \mathcal{B}^{\theta}(u_0(x_1), \dots, u_0(x_{N_s})) \cdot \mathcal{T}^{\theta}(t, x)
Gθ(u0(x))(t,x)=Bθ(u0(x1),…,u0(xNs))⋅Tθ(t,x)
优势:
- 支持动态替换初始条件
- 可通过时间步长扩展至长时间预测
3. PinnDE库架构与功能
3.1 核心模块
PinnDE基于TensorFlow和JAX实现,提供以下关键模块:
模块 | 功能描述 |
---|---|
Boundaries | 生成边界条件(周期、狄利克雷、诺伊曼) |
Initials | 初始化初始条件 |
Solvers | 提供ODE/PDE求解接口(支持PINNs和DeepONets) |
Models | 定义网络结构(层数、节点数、激活函数) |
求解器分为ode_Solvers
和pde_Solvers
,它们各自提供用于解决特定类型问题的不同函数。目前可用的函数如下:
PINNs | DeepONets |
---|---|
solvePDE_tx() | solvePDE_DeepONet_tx() |
solvePDE_xy() | solvePDE_DeepONet_xy() |
表1:PinnDE中用于求解偏微分方程的函数
PINNs | DeepONets |
---|---|
solveODE_IVP() | solveODE_DeepONet_IVP() |
solveODE_BVP() | solveODE_DeepONet_BVP() |
solveODE_System_IVP() | solveODE_DeepONetSystem_IVP() |
表2:PinnDE中用于求解常微分方程的函数
3.2 求解流程
- 定义问题域:设置时空范围和边界条件
- 配置网络参数:选择层数、节点数、优化器
- 训练与验证:通过损失函数优化网络参数
- 结果可视化:对比预测解与解析解(如图1所示)
3.3 硬约束支持
PinnDE支持多种硬约束策略,例如:
- 周期边界:通过坐标变换层实现
- 初始条件:通过网络结构直接嵌入初始值
- 狄利克雷边界:通过边界函数硬编码约束
具体支持情况如下表:具体支持情况如下表:
问题类型 | PINN | DeepONet |
---|---|---|
ODE初值问题 | 软/硬约束 | 软/硬约束 |
ODE边值问题 | 软/硬约束 | 软/硬约束 |
PDE周期边界 | 软/硬约束 | 软/硬约束 |
PDE狄利克雷边界 | 软约束(部分硬约束) | 软约束 |
表3和表4中列出了目前在硬约束方面具体支持情
ODE问题/模型 | PINN | DeepONet |
---|---|---|
初值问题(IVP) | 软约束、硬约束 | 软约束、硬约束 |
边值问题(BVP) | 软约束、硬约束 | 软约束、硬约束 |
初值问题系统(System of IVPs) | 软约束 | 软约束 |
表3:PinnDE中用于求解常微分方程的初值和边值问题的硬约束情况
PDE问题/模型 | PINN | DeepONet |
---|---|---|
((t, x)) - 周期边界 | 软约束、硬约束 | 软约束、硬约束 |
((t, x)) - 狄利克雷边界 | 软约束 | 软约束 |
((t, x)) - 诺伊曼边界 | 软约束 | 软约束 |
((x, y)) - 周期边界 | 软约束、硬约束 | 软约束、硬约束 |
((x, y)) - 狄利克雷边界 | 软约束、硬约束 | 软约束、硬约束 |
((x, y)) - 诺伊曼边界 | 软约束 | 软约束 |
表4:PinnDE中用于求解偏微分方程的初值和边值问题的硬约束情况
软约束 vs 硬约束:关键对比
特性 | 软约束 | 硬约束 |
---|---|---|
约束方式 | 通过损失函数间接优化 | 通过网络结构直接满足 |
边界误差 | 可能存在残余误差 | 理论上为零 |
灵活性 | 高,适用于复杂问题 | 低,需针对问题设计网络 |
解光滑性 | 对非光滑解鲁棒性强 | 依赖解的光滑性假设 |
参数调优 | 需要调整权重参数 | 无需调优,依赖网络设计 |
4. 应用示例
4.1 常微分方程组(ODE)
问题描述:
{
u
′
′
(
t
)
+
u
(
t
)
=
0
v
′
(
t
)
+
u
(
t
)
=
0
\begin{cases} u''(t) + u(t) = 0 \\ v'(t) + u(t) = 0 \end{cases}
{u′′(t)+u(t)=0v′(t)+u(t)=0
初始条件:
u
(
0
)
=
0.5
,
u
′
(
0
)
=
1
,
v
(
0
)
=
2
u(0)=0.5, u'(0)=1, v(0)=2
u(0)=0.5,u′(0)=1,v(0)=2
求解步骤:
import pinnde.ode_Solvers as ode_Solvers
import numpy as np
eqns = ["utt + u", "xt+u"]
orders = [2, 1]
inits = [[0.5, 1],[2]]
t_bdry = [0, 1]
N_pde = 150
sensor_range = [-3, 3]
N_sensors = 5000
epochs = 20000
mymodel = ode_Solvers.solveODE_DeepONetSystem_IVP(eqns, orders, inits,
t_bdry, N_pde, sensor_range, N_sensors, epochs)
exact_eqns = ["np.sin(t)+0.5*np.cos(t)", "-0.5*np.sin(t)+np.cos(t)+1"]
mymodel.plot_predicted_exact(exact_eqns)
mymodel.plot_epoch_loss()
mymodel.timeStep(10)
结果分析:
- 解析解: u ( t ) = sin t + 0.5 cos t u(t) = \sin t + 0.5\cos t u(t)=sint+0.5cost, v ( t ) = − 0.5 sin t + cos t + 1 v(t) = -0.5\sin t + \cos t + 1 v(t)=−0.5sint+cost+1
- 预测误差:均方误差
<
1
0
−
4
< 10^{-4}
<10−4(如图3所示)
图2:使用DeepONet预测的系统的解与精确解对比(左)以及DeepONet训练期间的物理信息损失时间序列(右)
所使用的特定架构是一个具有4个隐藏层、每层40个节点的DeepONet,使用双曲正切作为激活函数,并选择Adam作为优化器。我们在整个域上使用150个配置点让网络学习解,这些点通过拉丁超立方采样获得。我们在(v(0))、(u(0))、(u’(0) \in[-3,3])的范围内,对DeepONet采样5000个不同的初始条件。我们训练这个网络20000轮,此时轮次损失开始趋于平稳。在接下来的示例中,我们也将训练到达到最小损失。
我们进一步展示在PinnDE中使用DeepONet的时间步长能力。我们对训练好的DeepONet进行10步时间步长计算,将域扩展到([0, 10]),并给出神经网络解与精确解之间的误差。学习到的神经网络解算子展示了在时间步长计算中保持低误差的能力。
图3:训练好的DeepONet预测的系统(7)的时间步长解与精确解对比(左),以及时间步长解区间内网络与解析解之间的误差(右)
4.2 线性对流方程(PDE)
方程:
∂
u
∂
t
+
∂
u
∂
x
=
0
\frac{\partial u}{\partial t} + \frac{\partial u}{\partial x} = 0
∂t∂u+∂x∂u=0
初始条件:
u
0
(
x
)
=
cos
(
π
x
)
u_0(x) = \cos(\pi x)
u0(x)=cos(πx)
边界条件:周期边界
代码实现:
import pinnde.pde_Solvers as pde_Solvers
import pinnde.pde_Initials as pde_Initials
import pinnde.pde_Boundaries_2var as pde_Boundaries
import numpy as np
import tensorflow as tf
u0 = lambda x: tf.cos(np.pi*x)
t_bdry = [0,1]
x_bdry = [-1,1]
t_order = 1
N_iv = 100
initials = pde_Initials.setup_initials_2var(t_bdry, x_bdry, t_order,
[u0], N_iv)
boundaries=pde_Boundaries.setup_boundaries_periodic_tx(t_bdry,
x_bdry)
eqn = "ut+ux"
N_pde = 10000
epochs = 5000
mymodel = pde_Solvers.solvePDE_tx(eqn, initials,
boundaries, N_pde)
mymodel.train_model(epochs)
mymodel.plot_predicted_exact("tf.cos(np.pi*(x-t))")
结果可视化:
- 预测解与解析解 u ( t , x ) = cos ( π ( x − t ) ) u(t, x) = \cos(\pi(x - t)) u(t,x)=cos(π(x−t))高度吻合(如图3所示)
4.3 泊松方程(PDE)
方程:
∂
2
u
∂
x
2
+
∂
2
u
∂
y
2
=
−
2
π
2
cos
(
π
x
)
sin
(
π
y
)
\frac{\partial^2 u}{\partial x^2} + \frac{\partial^2 u}{\partial y^2} = -2\pi^2 \cos(\pi x) \sin(\pi y)
∂x2∂2u+∂y2∂2u=−2π2cos(πx)sin(πy)
边界条件:狄利克雷边界(硬约束)
训练结果:
- 边界误差为零
- 均方误差 < 1 0 − 7 < 10^{-7} <10−7(如图4所示)
4.4 热方程(PDE)
方程:
∂
u
∂
t
=
0.1
∂
2
u
∂
x
2
\frac{\partial u}{\partial t} = 0.1 \frac{\partial^2 u}{\partial x^2}
∂t∂u=0.1∂x2∂2u
初始条件:
u
0
(
x
)
=
sin
(
π
x
)
u_0(x) = \sin(\pi x)
u0(x)=sin(πx)
边界条件:狄利克雷边界(软约束)
时间步长预测:
- 支持长时间预测(如 t ∈ [ 0 , 10 ] t \in [0, 10] t∈[0,10])
- 误差保持稳定(如图5所示)
代码实现:
import pinnde.pde_Solvers as pde_Solvers
import pinnde.pde_Boundaries_2var as pde_Boundaries
import numpy as np
import tensorflow as tf
x_bdry = [-1, 1]
y_bdry = [-1, 1]
N_bc = 100
all_boundary = lambda x, y: tf.cos(np.pi*x)*tf.sin(np.pi*y)
boundaries = pde_Boundaries.setup_boundaries_dirichlet_xy(x_bdry,
y_bdry, N_bc, all_boundaries_cond=all_boundary)
eqn = "uxx + uyy - (-2*np.pi**2*tf.cos(np.pi*x)*tf.sin(np.pi*y))"
N_pde = 10000
epochs = 5000
mymodel = pde_Solvers.solvePDE_xy(eqn, boundaries, N_pde,
net_layers=5, net_units=40, constraint = "hard")
mymodel.train_model(epochs)
mymodel.plot_predicted_exact("tf.cos(np.pi*x)*tf.sin(np.pi*y)")
5. 总结与展望
PinnDE通过整合PINNs和DeepONets的优势,提供了一个高效、易用的微分方程求解平台。其核心优势包括:
- 低代码接口:用户只需定义方程、边界条件和网络参数
- 多场景支持:涵盖ODE/PDE、软/硬约束、长时间预测
- 可视化工具:内置结果对比和误差分析功能
未来计划扩展的功能包括:
- 自适应配置点方法
- 多物理场耦合问题支持
- PyTorch后端兼容
项目地址:GitHub
文档链接:ReadTheDocs
6. 参考文献
[1] M. Raissi, P. Perdikaris, and G. E. Karniadakis, “Physics-informed neural networks: A deep learning framework for solving forward and inverse problems involving nonlinear partial differential equations,” Journal of Computational Physics, 2019.
[2] L. Lu, P. Jin, and G. E. Karniadakis, “DeepONet: Learning nonlinear operators for identifying differential equations based on the universal approximation theorem of operators,” arXiv preprint arXiv:1910.03193, 2019.
[3] J. Matthews and A. Bihlo, “PinnDE: Physics-Informed Neural Networks for Solving Differential Equations,” arXiv preprint arXiv:2408.10011, 2024.