注:本文为 " PINN" 相关合辑。
图片清晰度受引文原图所限。
略作重排,未整理去重。
如有内容异常,请看原文。
什么是物理信息神经网络 (PINN)?
MATLAB中国 发布于 2025-09-25 15:15・上海
物理信息神经网络(PINN)是一类神经网络模型,其将微分方程所描述的物理规律融入损失函数的构建过程,以此引导模型的学习过程,使求解结果更贴合基础物理定律的约束。
PINN 的典型应用场景包括:
借助 Deep Learning Toolbox™,使用者可完成 PINN 的构建与训练,实现高效的预测性分析。PINN 可与 MATLAB® 及 Simulink® 完成集成,应用于系统级仿真、控制方案设计与设计优化等研究工作。

物理信息神经网络(PINN)在深度学习模型的训练流程中引入支配客观世界的物理定律,能够对复杂物理现象进行预测与建模,同时保证结果满足基础物理原理的要求。
1 PINN 的优点
PINN 属于物理信息机器学习方法的范畴,可实现物理知识与数据的无缝融合。在求解涉及 PDE 与 ODE 的问题时,通常将 PINN 与纯数据驱动方法、传统数值方法进行对比分析。
纯数据驱动方法仅通过输入与输出数据学习变量间的数学关系,PINN 与之相比具有以下特征:
- 引入先验物理知识作为约束条件;
- 对训练数据集之外的样本具备更高的预测精度;
- 在训练数据量有限或数据含噪声的场景下表现出更优的有效性。
与求解微分方程的传统数值方法(如用于 PDE 求解的有限元分析)相比,PINN 具有如下特点:
- 无网格特性,无需构建结构化网格;
- 可实现高维 PDE 解的逼近;
- 能够求解模型的缺失参数,如 PDE 或 ODE 的未知系数;
- 可处理无边界数据的不适定问题;
- 易于纳入稀疏或含噪声的观测数据。
尽管 PINN 相较于纯数据驱动方法和传统数值方法具备潜在优势,但仍存在若干局限性与待解决的挑战,主要包括:
- 收敛性理论体系尚未完善;
- 缺乏统一的训练策略框架;
- 计算高阶导数时存在较高的计算成本;
- 难以学习 PDE 解中的高频分量与多尺度分量。
需要说明的是,PINN 是当前机器学习领域的研究热点方向,相关理论与方法仍在持续发展,有望逐步解决上述现存的挑战与局限性。
PINN、数据驱动方法与传统数值方法的选型需依据具体应用场景确定。下表总结了各类方法的优势与局限性。
| 特性 | 纯数据驱动方法 | 传统数值方法 | PINN |
|---|---|---|---|
| 纳入已知物理学知识 | ✗ | ✓ | ✓ |
| 在训练数据有限或含噪情况下,也能很好地泛化 | ✗ | ✗ | ✓ |
| 同时求解正逆问题 | ✓ | ✗ | ✓ |
| 求解高维 PDE | ✗ | ✗ | ✓ |
| 支持快速"在线"预测 | ✓ | ✗ | ✓ |
| 无网格 | ✓ | ✗ | ✓ |
| 具有明确的收敛理论 | ✗ | ✓ | ✗ |
| 能很好地扩展到高频和多尺度 PDE | ✗ | ✓ | ✗ |
特征比较:PINN、纯数据驱动方法(仅从输入-输出数据中学习数学关系)和传统数值方法(如用于逼近 PDE 解的有限元分析)。
2 PINN 与传统神经网络的区别
PINN 与传统神经网络的差异在于,前者能够将以微分方程形式表达的问题先验知识纳入模型训练过程。此类附加信息使 PINN 能够对现有观测数据之外的样本作出精度更高的预测。此外,额外的物理约束可在观测数据含噪声的场景下对预测解进行正则化处理,使 PINN 能够基于真实的基础信号完成学习过程,而非对含噪声数据产生过拟合。
以某系统为例,假设已获取该系统的含噪声观测值 θ meas θ_{\text{meas}} θmeas,研究目标为利用前馈人工神经网络预测系统的未来值 θ pred θ_{\text{pred}} θpred。该网络通过现有观测值完成训练,并用于未知未来值的预测。回归神经网络的训练过程通常以最小化网络预测值与给定观测值之间的均方误差为目标。

传统神经网络通过调整模型参数,最小化网络预测值与观测数据之间的误差。
传统神经网络难以对训练数据之外的系统状态量作出精准预测。

00:04
使用 Deep Learning Toolbox 中的 trainnet 函数训练的原始神经网络会对含噪声观测值产生过拟合,在 t 超出观测数据范围时预测性能显著下降。(请参阅 MATLAB 代码)
增加观测数据量可提升预测效果,但该方法可能产生较高的成本,或在多数应用场景中不具备可行性。然而,领域研究者通常对所研究系统的基础物理过程具备更深入的认知。具体而言,本案例中的观测值表示起重机摆动负载相对于竖直线的位移角度,该过程可通过阻尼摆模型描述;对于小角度摆动场景,可采用线性二阶微分方程近似建模:
θ ′ ′ ( t ) + 2 β θ ′ ( t ) + ω 0 2 θ ( t ) = 0 θ''(t)+2βθ'(t)+ω_{0}^{2}θ(t)=0 θ′′(t)+2βθ′(t)+ω02θ(t)=0
PINN 并未忽略此类物理知识,而是将该微分方程作为附加的物理信息项纳入损失函数。PINN 在求解域内的其他采样点计算微分方程的残差,无需增加观测数据即可为模型提供更多约束信息。尽管该简单案例可通过解析方法求解,但其能够清晰阐释 PINN 的原理。

Deep Learning Toolbox 中提供的 PINN 可调整模型参数,以平衡网络预测值与观测数据间的误差最小化目标,以及物理损失项的约束要求。
在训练过程中,PINN 可在拟合观测数据与满足基础物理过程约束之间实现平衡。

00:10
与传统神经网络相比,使用 Deep Learning Toolbox 构建并训练的 PINN 对观测数据之外的样本具备更优的预测性能,同时表现出更强的抗噪声稳定性。(请参阅 MATLAB 代码。)
通过引入附加的物理损失项,PINN 在含噪声观测数据场景及无观测数据区域的预测性能均优于传统神经网络。
3 PINN 的工作原理
PINN 采用优化算法以迭代方式更新神经网络的参数,直至预设的物理信息损失函数值降至可接受范围,从而使网络输出逐步逼近微分方程的解。

在针对摆方程这类 ODE 训练 PINN 时,优化算法会调整神经网络的参数,以降低损失函数值(该损失函数包含基于自动微分(AD)计算的微分方程残差、边界条件与初始条件项,以及可选的其他标注数据项)至可接受水平。
PINN 的损失函数 L L L 由以下部分构成:物理信息损失项 L Physics L_{\text{Physics}} LPhysics;可选的、用于计算网络预测值与初始/边界数据规定值之间误差的项 L Conds L_{\text{Conds}} LConds;以及其他附加观测数据对应的损失项 L Data L_{\text{Data}} LData。物理信息损失项通过自动微分(AD)或其他数值微分方法,计算微分方程在求解域内各采样点的残差。由于物理信息项并非计算预测值与目标值的误差,因此该部分可视为无监督损失项,即无需依赖采样点的观测数据,即可利用求解域内任意点完成网络训练。
PINN 于 2017 年首次被提出,目前已衍生出多种变体形式,主要包括:
- 贝叶斯 PINN(BPINN):基于贝叶斯框架实现不确定性量化;
- 变分 PINN(VPINN):将 PDE 的弱形式纳入损失函数;
- 一阶公式化 PINN(FO-PINN):求解高阶 PDE 时,相较于标准 PINN 具备更高的计算效率与精度。
此外,PINN 可与不同的神经网络架构结合使用,如图神经网络(GNN)、傅里叶神经算子(FNO)、深度算子网络(DeepONet)等,形成了各类架构的物理信息版本。
MATLAB 与 Deep Learning Toolbox 为 PINN 的研发提供了全面支持,涵盖不同神经网络架构的创建/导入、基于 AD 定义自定义物理信息损失函数、采用 ADAM 或 L-BFGS 等梯度优化算法完成训练,以及利用 MATLAB 高级图形工具实现解的可视化分析等环节。
4 PINN 的应用
PINN 能够充分发挥深度学习方法的优势,同时提升模型对物理定律的遵从性,使其成为适用于物理定律完全或部分已知场景(如含未知系数的 PDE 或 ODE 求解)的通用工具。PINN 的典型应用领域包括:
- 热传递:用于热分布与热传递过程的建模分析。PINN 可将材料与系统热过程的控制方程(如热传导方程)嵌入损失函数,确保求解结果满足物理定律约束,从而得到物理意义合理的预测值。此外,PINN 可替代高成本的数值仿真,在设计优化场景中快速逼近参数化几何模型的温度分布;同时可用于逆问题求解,以确定热导率等未知材料属性。
- 计算流体动力学(CFD):通过在损失函数中纳入纳维-斯托克斯方程,实现流体速度场、压力场与温度场的逼近。PINN 可用于无网格正问题仿真,以精准预测上述物理量;也可用于逆问题求解,即基于观测数据推断边界条件、源项或流体属性等未知参数/输入量。
- 结构力学:将弹性方程、结构动力学方程等控制物理定律直接嵌入损失函数,完成正/逆问题求解。此类集成方式使 PINN 能够精准预测不同载荷与工况下结构的变形、应力、应变等响应,并可基于观测数据识别未知材料属性或外部载荷。PINN 借助物理原理引导学习过程,可降低对大规模数据集的依赖,在传统解析方法不可行或数据匮乏的场景中具备显著优势。PINN 的灵活性使其能够处理非线性材料行为、多物理场建模等复杂问题。
利用 Deep Learning Toolbox 完成 PINN 的构建与训练后,可将其与 Optimization Toolbox™ 无缝集成以实现设计优化,或与 Simulink 连接以开展系统级仿真,亦可应用于其他各类研究场景。
示例和操作方法
- 使用基于物理学的神经网络求解 PDE - 示例
- 使用神经网络求解常微分方程 - 示例
- 使用物理信息神经网络求解单位圆盘上的泊松方程 - 示例
- 使用 PINN 的逆问题 - 可下载的代码
- MATLAB 中科学和基于物理学的机器学习 - 可下载代码
- 基于物理的机器学习:使用基于云的深度学习和声学成图进行器官细胞培养研究 - 文章
物理信息神经网络(PINN):将物理知识融合到深度学习中
21e23f234 原创于 2024-02-07 19:17:03 发布
物理信息神经网络(PINN)是融合深度学习与物理知识的模型,通过在训练中引入物理规律约束,提升模型泛化能力。本文从定义、原理、构建流程、对比优势等方面,系统介绍 PINN 及其在科学计算问题中的应用。
一、PINN 基本定义
物理信息神经网络(Physics-Informed Neural Networks,PINN)是一类将物理规律作为先验信息嵌入学习过程的机器学习模型。
- 与传统数据驱动神经网络不同,PINN 同时利用数据与物理定律进行训练。
- 在数据稀缺、噪声较强的场景中,仍可输出满足物理合理性的结果。

二、PINN 工作原理
PINN 以深度神经网络为基础,在损失函数中加入物理信息项,使模型同时满足数据拟合 与物理规律两类约束。
1. 物理规律指导训练的基本思路
将物理定律(多以微分方程形式给出)转化为损失函数中的残差项,训练过程中同时最小化:
- 网络预测与观测数据的误差
- 网络预测与物理方程的残差
2. 训练实施步骤
-
定义物理问题与控制方程
明确研究对象与支配该系统的物理规律,如流体力学中的纳维‑斯托克斯方程、热传导问题中的热方程等。
-
构建神经网络
- 输入:空间坐标 x x x、时间 t t t 等场量信息
- 输出:待求物理量(速度、压力、温度等)的预测值 u ^ \hat{u} u^
-
构造损失函数
以一维热传导方程 为例:
物理规律:
∂ u ∂ t − α ∂ 2 u ∂ x 2 = 0 \frac{\partial u}{\partial t} - \alpha \frac{\partial^2 u}{\partial x^2} = 0 ∂t∂u−α∂x2∂2u=0- 物理信息损失(PDE 残差):
L P D E = [ ∂ u ^ ∂ t − α ∂ 2 u ^ ∂ x 2 ] 2 \mathcal{L}_{PDE} = \left[ \frac{\partial \hat{u}}{\partial t} - \alpha \frac{\partial^2 \hat{u}}{\partial x^2} \right]^2 LPDE=[∂t∂u^−α∂x2∂2u^]2 - 数据损失(若有观测值 u o b s u_{obs} uobs):
L d a t a = ∥ u ^ − u o b s ∥ 2 \mathcal{L}{data} = \|\hat{u} - u{obs}\|^2 Ldata=∥u^−uobs∥2 - 总损失:
L = λ P D E L P D E + λ d a t a L d a t a \mathcal{L} = \lambda_{PDE} \mathcal{L}{PDE} + \lambda{data} \mathcal{L}{data} L=λPDELPDE+λdataLdata
其中 λ P D E \lambda{PDE} λPDE、 λ d a t a \lambda_{data} λdata 为平衡两项的超参数。
- 物理信息损失(PDE 残差):
-
网络训练
使用梯度下降类优化器(如 Adam)更新网络参数,最小化总损失。
-
验证与测试
在独立样本上检验泛化能力,确保预测同时满足数据精度与物理一致性。
三、PINN 与传统机器学习的对比
1. 物理约束
- PINN:显式将物理定律写入损失函数,输出满足物理一致性。
- 传统机器学习:仅从数据中学习统计关系,一般不嵌入物理规律。
2. 数据依赖
- PINN:对数据量与数据质量要求较低,物理约束可提供额外信息。
- 传统机器学习:高度依赖大量高质量标注数据,数据不足时性能明显下降。
3. 泛化能力
- PINN:在训练分布外、极端工况或数据稀疏区域仍可给出合理预测。
- 传统机器学习:在训练数据覆盖区域外易失效,难以保证物理合理性。
4. 适用场景
- PINN:适用于可由偏微分方程描述的科学与工程问题(流体、传热、结构力学等)。
- 传统机器学习:适用于图像、文本、推荐等难以用显式物理方程描述的场景。
四、PINN 完整构建流程
-
确定问题域与控制方程
明确物理模型,给出 PDE/ODE 形式的控制方程、初始条件与边界条件。
-
选择网络结构
常用全连接网络;涉及空间/图像信息时可使用 CNN 等架构。
-
准备数据
收集可用观测数据,用于构成数据损失项;数据稀缺时仍可训练。
-
定义总损失函数
包含:
- 数据驱动损失:拟合观测值
- 物理驱动损失:最小化方程残差
-
模型训练
使用梯度类优化器,同时最小化数据误差与物理残差。
-
验证与测试
用独立数据集评估精度与物理合理性。
-
超参调优
优化网络结构、学习率、损失权重等,提升收敛性与精度。
-
模型解释与实际应用
分析预测与物理过程的关联,应用于正问题、逆问题求解。
五、参考文献
-
Raissi, M., Perdikaris, P., & Karniadakis, G. E. (2019). Physics-informed neural networks: A deep learning framework for solving forward and inverse problems involving nonlinear partial differential equations . Journal of Computational Physics, 378, 686-707.
-
Pang, G., Lu, L., & Karniadakis, G. E. (2019). fPINNs: Fractional physics-informed neural networks . SIAM Journal on Scientific Computing, 41(4), B837-B858.
-
Jagtap, A. D., Kawaguchi, K., & Karniadakis, G. E. (2020). Adaptive activation functions accelerate convergence in deep and physics-informed neural networks . Journal of Computational Physics, 404, 109136.
-
Kim, J., Azevedo, D., Chen, X., & Karniadakis, G. E. (2020). Integration of deep learning with a physics-based computational model for spatiotemporal dynamics . Proceedings of the National Academy of Sciences, 117(48), 30235-30245.
-
Cai, S., Wang, Z., Wang, S., Perdikaris, P., & Karniadakis, G. E. (2021). Physics-informed neural networks for heat transfer problems . Journal of Heat Transfer, 143(6), 060801.
- 检索平台:ASME Digital Collection
- DOI:10.1115/1.4050658
-
Mao, Z., Jagtap, A. D., & Karniadakis, G. E. (2020). Physics-informed neural networks for high-speed flows . Computer Methods in Applied Mechanics and Engineering, 360, 112789.
-
Zhang, Y., Guo, H., & Karniadakis, G. E. (2021). Learning in modal space: Solving time-dependent stochastic PDEs using physics-informed neural networks . SIAM Journal on Scientific Computing, 43(2), B202-B223.
-
Sirignano, J., & Spiliopoulos, K. (2018). DGM: A deep learning algorithm for solving partial differential equations . Journal of Computational Physics, 375, 1339-1364.
深入了解PINN:物理信息神经网络(Physics-Informed Neural Networks)
哏儿都老码 已于 2024-12-30 17:08:39 修改
1 物理信息神经网络(PINN)的定义
物理信息神经网络(PINN,Physics-Informed Neural Networks)是将神经网络与物理方程相结合的深度学习方法。该类方法将物理系统对应的约束条件,以偏微分方程等形式加入神经网络训练过程,使网络输出在匹配数据分布的同时,满足已知物理规律。
传统神经网络以数据为依据完成目标函数的拟合。PINN 在数据驱动的基础上,额外引入物理方程形成约束。在流体动力学、热传导、结构力学等场景中,PINN 可在实验数据规模有限的条件下,通过物理方程描述系统的演化行为。
2 PINN 的基本原理
2.1 神经网络与物理方程的结合方式
PINN 通过对损失函数进行扩展,引入由物理约束得到的残差项,使网络输出同时满足数据拟合要求与物理系统的动态行为。
对于包含物理约束的模型,PINN 的损失函数由两部分构成:
- 数据损失:由观测数据或边界条件与网络输出的差异得到;
- 物理损失:由物理方程残差得到,即将网络输出代入偏微分方程后计算得到的误差。
损失函数可表示为:
L PINN = L data + L physics \mathcal{L}{\text{PINN}} = \mathcal{L}{\text{data}} + \mathcal{L}_{\text{physics}} LPINN=Ldata+Lphysics
其中:
- L data \mathcal{L}_{\text{data}} Ldata 表示数据拟合损失,常用形式为均方误差;
- L physics \mathcal{L}_{\text{physics}} Lphysics 表示由物理方程得到的约束损失。
2.2 物理约束的引入方式
物理规律通常以偏微分方程(PDE)给出。PINN 将网络预测结果代入对应方程,计算残差并在训练中对其进行最小化。
常用的物理方程包括:
- Navier-Stokes 方程:用于描述流体运动;
- 热传导方程:用于描述热量在介质内的传递过程;
- 波动方程:用于描述波在介质中的传播行为。
通过对网络参数进行优化,网络输出可同时贴近观测数据与物理方程,实现数据与物理规律共同指导训练。
2.3 网络结构与训练过程
PINN 采用与传统神经网络一致的反向传播算法完成参数更新。训练阶段除使用观测数据外,还会在求解域内采样并计算物理方程残差,将其加入总损失共同参与优化。
3 PINN 的应用领域
3.1 流体力学
Navier-Stokes 方程用于描述流体运动。传统数值方法如有限元法、有限差分法在求解时需要网格离散并消耗大量计算资源。PINN 可通过神经网络直接拟合方程,实现对流体速度、压力等物理量的求解,且不依赖网格离散。
3.2 热传导
热传导问题以热传导方程描述温度场的时空变化。PINN 将该方程与神经网络结合,可实现对复杂几何结构内温度分布的求解,降低对传统数值方法的依赖。
3.3 结构力学
PINN 可用于结构变形、应力、应变等物理量的预测,适用于梁、板、框架等结构的力学行为描述,可输出不同载荷条件下结构的响应。
3.4 材料科学
PINN 可用于材料力学与热学性能的模拟,包括弹性、塑性、热膨胀等行为。在实验数据有限时,可借助物理规律对材料特性进行推断。
4 PINN 的优势与挑战
4.1 优势
- 对标注数据的依赖程度更低,可在少量数据条件下完成训练;
- 模型输出满足已知物理规律,提升结果的合理性与可靠性;
- 避免传统数值方法在复杂几何、多尺度问题中网格生成与计算成本较高的问题。
4.2 挑战
- 物理残差的引入提高训练复杂度,易出现梯度消失或梯度爆炸现象;
- 复杂问题下需要对网络结构与损失函数进行细致设计,以保证求解精度;
- 高维问题的训练过程通常需要较高的计算资源支持。
5 PINN 实现示例:一维热传导方程
以一维热传导方程为例,说明 PINN 的构建与训练流程。方程形式为:
∂ u ∂ t = α ∂ 2 u ∂ x 2 \frac{\partial u}{\partial t} = \alpha \frac{\partial^2 u}{\partial x^2} ∂t∂u=α∂x2∂2u
其中 α \alpha α 为热扩散系数, u ( x , t ) u(x,t) u(x,t) 为温度分布。训练目标为使残差
∂ u ∂ t − α ∂ 2 u ∂ x 2 \frac{\partial u}{\partial t} - \alpha \frac{\partial^2 u}{\partial x^2} ∂t∂u−α∂x2∂2u
趋近于 0。
5.1 神经网络结构
基于 PyTorch 构建全连接网络,输入为空间坐标 x x x 与时间 t t t,输出为温度 u ( x , t ) u(x,t) u(x,t)。
python
import torch
import torch.nn as nn
class PINN(nn.Module):
def __init__(self, layers):
super(PINN, self).__init__()
self.layers = nn.ModuleList()
for i in range(len(layers) - 1):
self.layers.append(nn.Linear(layers[i], layers[i+1]))
nn.init.xavier_normal_(self.layers[i].weight)
def forward(self, x, t):
u = torch.cat((x, t), dim=1)
for layer in self.layers:
u = torch.tanh(layer(u))
return u
5.2 物理损失函数
利用自动微分计算时间与空间导数,构建热传导方程残差损失。
python
def physics_loss(model, x, t, alpha):
u = model(x, t)
u_t = torch.autograd.grad(u, t, grad_outputs=torch.ones_like(u), create_graph=True)[0]
u_x = torch.autograd.grad(u, x, grad_outputs=torch.ones_like(u), create_graph=True)[0]
u_xx = torch.autograd.grad(u_x, x, grad_outputs=torch.ones_like(u_x), create_graph=True)[0]
residual = u_t - alpha * u_xx
return torch.mean(residual ** 2)
5.3 模型训练
在空间与时间域内均匀采样,使用 Adam 优化器最小化物理损失。
python
x_train = torch.linspace(0, 1, 100, requires_grad=True).view(-1, 1)
t_train = torch.linspace(0, 1, 100, requires_grad=True).view(-1, 1)
model = PINN([2, 50, 50, 1])
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
alpha = 0.01
for epoch in range(10000):
optimizer.zero_grad()
loss = physics_loss(model, x_train, t_train, alpha)
loss.backward()
optimizer.step()
if epoch % 1000 == 0:
print(f'Epoch {epoch}, Loss: {loss.item():.6f}')
6 结语
物理信息神经网络将物理规律与数据驱动方法结合,在科学计算与工程问题中具备应用价值。在观测数据有限的条件下,PINN 仍可提供满足物理一致性的求解结果。随着相关方法的发展,PINN 将在更多物理与工程问题中得到使用。
物理信息神经网络 PINN 的实现及其应用场景
bitbci 发布日期: 2024-11-19 更新日期: 2024-11-19
一、物理信息神经网络 PINN 简介
物理信息神经网络(Physics-Informed Neural Networks, PINN)是融合深度学习与物理知识的神经网络模型。与传统数据驱动神经网络相比,PINN 在训练阶段引入物理约束,使模型在学习数据分布特征的同时,满足物理定律,提升模型的泛化性能与预测精度。
PINN 将物理定律(如偏微分方程)作为先验信息嵌入神经网络,通过最小化数据损失与物理损失完成模型训练。
PINN 的损失函数包含两项:
- 数据损失 L d a t a L_{data} Ldata:用于描述网络预测值与实测数据之间的偏差。
- 物理损失 L p h y s i c s L_{physics} Lphysics:用于描述网络预测值与物理定律之间的偏差。
总损失函数形式如下:
L = L d a t a + L p h y s i c s L = L_{data} + L_{physics} L=Ldata+Lphysics
二、PINN 的实现
以波动方程(Wave Equation)为例,介绍 PINN 的完整实现流程。
2.1 问题描述
给定输入 x x x、 t t t 与输出 u ( x , t ) u(x,t) u(x,t),训练神经网络模型 A N N ( x , t ) ANN(x,t) ANN(x,t),使模型输出满足波动方程约束。
输入范围:
x ∈ [ − 1 , 1 ] x \in [-1, 1] x∈[−1,1], t ∈ [ 0 , 1 ] t \in [0, 1] t∈[0,1]
输出:
u ( x , t ) u(x,t) u(x,t)
约束条件:
∂ u ∂ t + c ∂ u ∂ x = 0 \frac{\partial u}{\partial t} + c\frac{\partial u}{\partial x} = 0 ∂t∂u+c∂x∂u=0
其中:
- u ( x , t ) u(x,t) u(x,t) 为波的位移
- c c c 为波速,取 c = 1.0 c=1.0 c=1.0
- x x x 为空间坐标
- t t t 为时间坐标
2.2 虚拟数据生成
采用行波解作为波动方程的解析解:
u ( x , t ) = sin ( 2 π ( x − t ) ) u(x,t) = \sin(2\pi(x-t)) u(x,t)=sin(2π(x−t))
参数设置:
- 波长 λ = 1 \lambda = 1 λ=1
- 角频率 ω = 2 π c \omega = 2\pi c ω=2πc
- 相速度 c = 1.0 c = 1.0 c=1.0
python
def generate_data(nx=100, nt=100, x_range=(-1, 1), t_range=(0, 1)):
x = np.linspace(x_range[0], x_range[1], nx)
t = np.linspace(t_range[0], t_range[1], nt)
X, T = np.meshgrid(x, t)
c = 1.0
u_exact = np.sin(2*np.pi*(X - c*T))
return X.flatten(), T.flatten(), u_exact.flatten()
2.3 构建神经网络
网络结构:
- 输入层:2 个节点,对应 ( x , t ) (x,t) (x,t)
- 隐藏层:3 层,每层 20 个节点
- 输出层:1 个节点,对应 u ( x , t ) u(x,t) u(x,t)
- 激活函数:tanh
python
class Net(nn.Module):
def __init__(self, input_size=2, hidden_size=20, output_size=1):
super(Net, self).__init__()
self.fc1 = nn.Linear(input_size, hidden_size)
self.fc2 = nn.Linear(hidden_size, hidden_size)
self.fc3 = nn.Linear(hidden_size, hidden_size)
self.fc4 = nn.Linear(hidden_size, output_size)
def forward(self, x):
x = torch.tanh(self.fc1(x))
x = torch.tanh(self.fc2(x))
x = torch.tanh(self.fc3(x))
x = self.fc4(x)
return x
2.4 构建损失函数
物理约束损失:
L P D E = 1 N ∑ i = 1 N ∣ R ( x i , t i ) ∣ 2 \mathcal{L}{PDE} = \frac{1}{N}\sum{i=1}^N |\mathcal{R}(x_i,t_i)|^2 LPDE=N1i=1∑N∣R(xi,ti)∣2
残差定义:
R = ∂ u ∂ t + c ∂ u ∂ x \mathcal{R} = \frac{\partial u}{\partial t} + c\frac{\partial u}{\partial x} R=∂t∂u+c∂x∂u
数据拟合损失:
L d a t a = 1 N ∑ i = 1 N ∣ u p r e d ( x i , t i ) − u e x a c t ( x i , t i ) ∣ 2 \mathcal{L}{data} = \frac{1}{N}\sum{i=1}^N |u_{pred}(x_i,t_i) - u_{exact}(x_i,t_i)|^2 Ldata=N1i=1∑N∣upred(xi,ti)−uexact(xi,ti)∣2
总损失函数:
L = L P D E + L d a t a \mathcal{L} = \mathcal{L}{PDE} + \mathcal{L}{data} L=LPDE+Ldata
python
def loss_function(net, x, t, u_exact, c=1.0):
inputs = torch.cat([x, t], dim=1)
u_pred = net(inputs)
u_t = torch.autograd.grad(u_pred, t, grad_outputs=torch.ones_like(u_pred), create_graph=True)[0]
u_x = torch.autograd.grad(u_pred, x, grad_outputs=torch.ones_like(u_pred), create_graph=True)[0]
residual = u_t + c * u_x
L_PDE = torch.mean(residual**2)
L_data = torch.mean((u_pred - u_exact)**2)
loss = L_PDE + L_data
return loss
2.5 模型训练
采用 Adam 优化器,学习率 0.001,训练轮数 1500。
2.6 结果可视化
对 t = 0.5 t=0.5 t=0.5 时刻的波形进行对比,观测真实解与 PINN 预测解的差异。
- 真实解: u e x a c t = sin ( 2 π ( x − 0.5 ) ) u_{exact} = \sin(2\pi(x - 0.5)) uexact=sin(2π(x−0.5))
- 预测解:神经网络输出 A N N ( x , t ) ANN(x,t) ANN(x,t)

2.7 完整代码
python
import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
import matplotlib.pyplot as plt
class Net(nn.Module):
def __init__(self, input_size=2, hidden_size=20, output_size=1):
super(Net, self).__init__()
self.fc1 = nn.Linear(input_size, hidden_size)
self.fc2 = nn.Linear(hidden_size, hidden_size)
self.fc3 = nn.Linear(hidden_size, hidden_size)
self.fc4 = nn.Linear(hidden_size, output_size)
def forward(self, x):
x = torch.tanh(self.fc1(x))
x = torch.tanh(self.fc2(x))
x = torch.tanh(self.fc3(x))
x = self.fc4(x)
return x
def generate_data(nx=100, nt=100, x_range=(-1, 1), t_range=(0, 1)):
x = np.linspace(x_range[0], x_range[1], nx)
t = np.linspace(t_range[0], t_range[1], nt)
X, T = np.meshgrid(x, t)
c = 1.0
u_exact = np.sin(2*np.pi*(X - c*T))
return X.flatten(), T.flatten(), u_exact.flatten()
def loss_function(net, x, t, u_exact, c=1.0):
inputs = torch.cat([x, t], dim=1)
u_pred = net(inputs)
u_t = torch.autograd.grad(u_pred, t, grad_outputs=torch.ones_like(u_pred), create_graph=True)[0]
u_x = torch.autograd.grad(u_pred, x, grad_outputs=torch.ones_like(u_pred), create_graph=True)[0]
residual = u_t + c * u_x
L_PDE = torch.mean(residual**2)
L_data = torch.mean((u_pred - u_exact)**2)
loss = L_PDE + L_data
return loss
def train_pinn():
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
X, T, U_exact = generate_data()
x = torch.tensor(X, dtype=torch.float32).reshape(-1, 1).requires_grad_(True).to(device)
t = torch.tensor(T, dtype=torch.float32).reshape(-1, 1).requires_grad_(True).to(device)
u_exact = torch.tensor(U_exact, dtype=torch.float32).reshape(-1, 1).to(device)
net = Net().to(device)
optimizer = optim.Adam(net.parameters(), lr=0.001)
epochs = 1500
for epoch in range(epochs):
optimizer.zero_grad()
loss = loss_function(net, x, t, u_exact)
loss.backward()
optimizer.step()
if (epoch + 1) % 100 == 0:
print(f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}')
return net, x, t, u_exact
def plot_results(net, x, t, u_exact):
with torch.no_grad():
x_plot = torch.linspace(-1, 1, 100, device=x.device).reshape(-1, 1)
t_plot = torch.full_like(x_plot, 0.5)
inputs = torch.cat([x_plot, t_plot], dim=1)
u_pred = net(inputs)
u_exact_plot = torch.sin(2*np.pi*(x_plot - t_plot))
plt.figure(figsize=(10, 6))
plt.plot(x_plot.cpu().numpy(), u_exact_plot.cpu().numpy(), 'b-', label='Exact')
plt.plot(x_plot.cpu().numpy(), u_pred.cpu().numpy(), 'r--', label='PINN')
plt.xlabel('x')
plt.ylabel('u')
plt.title('t = 0.5')
plt.legend()
plt.grid(True)
plt.show()
if __name__ == "__main__":
net, x, t, u_exact = train_pinn()
plot_results(net, x, t, u_exact)
三、PINN 的应用场景
3.1 PINN 的特点
- PINN 通过损失函数使模型输出满足物理约束,提升结果的物理一致性。
- PINN 对标注数据的依赖程度较低,在物理约束已知的条件下,可降低数据采集与标注成本。
3.2 PINN 的应用场景
- 偏微分方程数值求解
- 多物理场耦合问题分析
- 复杂流体动力学模拟
- 材料科学相场演化模拟
- 生物医学图像分析与处理
reference
- 什么是物理信息神经网络 (PINN)? - 知乎
https://zhuanlan.zhihu.com/p/1954533680518263962 - 深入了解 PINN:物理信息神经网络(Physics-Informed Neural Networks)-CSDN 博客
https://blog.csdn.net/weixin_37522117/article/details/144830259 - 物理信息神经网络(PINN): 将物理知识融合到深度学习中-CSDN 博客
https://blog.csdn.net/qq_28247201/article/details/136072595 - 物理信息神经网络 PINN 的实现及其应用场景 | BITBCI
https://bitbci.github.io/2024/11/19/2-ke-yan-lun-wen/wu-li-xin-xi-shen-jing-wang-luo-pinn-de-shi-xian-ji-qi-ying-yong-chang-jing/ - 刘谋斌教授、钱志浩副研究员团队在物理信息神经网络研究中取得重要突破_北京大学力学与工程科学学院
https://mech.pku.edu.cn/xwzx/xwkx/ecd47e386b6e463f9c99fb20e7a6d8d1.htm