恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

PINN求解微分方程实战:Python Notebooks从入门到避坑

  • 首页
  • 资讯中心
  • /
  • PINN求解微分方程实战:Python Notebooks从入门到避坑

相关资讯

TUIStudio 部署指南:Docker 容器化 + Nginx 生产环境配置实战 2026/10/11 20:23:22
2026预约小程序开发定制哪家好?四个平台特点和选择方法 2026/10/11 20:23:22
Velodyne VLP16激光雷达调试指南:从网络配置到点云解析 2026/10/11 20:23:22

最新资讯

QString 的 %1、%2 占位符与 setCursor、setAcceptedMouseButtons 实战解析:从参数替换到鼠标交互的完整链路
vue-table字段回调函数进阶指南:一个方法自定义任意列的数据显示格式
MySQL聚合、分组、联合查询组合实战:避开重复计数与去重陷阱
【城市】城市能源模拟住宅、商业和公共建筑集群的每小时热能和电力需求Matlab实现
BarTender数据库集成实战:SQL Server连接、序列号与高并发打印
教学管理系统数据库课程设计:从ER图到MySQL全流程实践

今日推荐

UE动画修改实战:从资产编辑到重定向与蒙太奇驱动
统计随机数生成器攻击下的KLJN安全密钥交换协议Matlab仿真
政务API安全治理:资产测绘、低代码编排与行标对标实践

本周热门

UE动画修改实战:从资产编辑到重定向与蒙太奇驱动
统计随机数生成器攻击下的KLJN安全密钥交换协议Matlab仿真
政务API安全治理:资产测绘、低代码编排与行标对标实践

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

PINN求解微分方程实战:Python Notebooks从入门到避坑

发布时间:2026/10/11 20:28:22
PINN求解微分方程实战:Python Notebooks从入门到避坑 简介这份资源围绕物理信息神经网络PINN求解微分方程展开面向具备一定Python与深度学习基础、希望将神经网络用于科学计算的研究生、工程师及科研人员。内容覆盖常微分方程、泊松方程、拉普拉斯方程、扩散方程、欧拉梁及洛伦兹系统等典型问题并涉及Dirichlet、Neumann、Robin、周期等多种边界条件帮助读者理解如何把物理方程约束嵌入损失函数进行求解。资源包共22个文件以17个ipynb交互式笔记本为主体配合3个py源码模块、1个md说明文档和1张结果示意图整体约889KB结构紧凑便于按案例逐步运行与修改。其中源码模块封装了PDE、模型与几何等基础组件笔记本则给出可直接复现的实验流程另含Jacobian-Hessian方法等进阶测试。目前已有2976人学习下载适合作为入门PINN与微分方程数值求解的实践参考。1. 从一份 PINN-Notebooks 说起Python 求解微分方程到底能落地到什么程度很多人第一次听到 PINN物理信息神经网络是在论文里公式一屏接一屏真到自己动手时却卡在“这玩意到底怎么跑起来”。我手里这份基于PINN求解微分方程的方法python.zip就是干这件事的它把 PINN 求解微分方程拆成了一堆可以直接在 Jupyter 里点开就跑的 Notebook覆盖 Euler Beam、扩散方程、Poisson 方程Dirichlet / Neumann / Robin / Periodic 四类边界、Laplace 圆盘、PDAE 系统、Lorenz 系统、简单 ODE 系统还单独给了 Jacobian-Hessian 方法的测试用例。配套的pinns geometry.py、PDE.py、model.py是底层模块data_domain.ipynb负责采样域README.md交代环境。适合谁适合已经会一点 Python、被有限差分/有限元网格划分折磨过、想看看无网格方法到底靠不靠谱的工程师和研究生。它不承诺精度吊打传统方法但能让你在一个下午内把“神经网络解 PDE”从概念变成屏幕上一条收敛曲线。2. 环境与目录把 Notebook 跑起来前必须理清的三件事2.1 依赖安装与版本选择这份资源是纯 Python 栈核心依赖是 PyTorch或 TensorFlow取决于model.py的实现常见做法是 PyTorch、NumPy、Matplotlib以及 DeepXDE 用于部分 Poisson 算例。我一般会先建一个干净环境避免和系统里已有的 CUDA 版本打架。下面这套命令在 Linux 和 Windows 的 conda 下都验证过# 创建独立环境Python 3.8~3.10 兼容性最好 conda create -n pinn_env python3.9 -y conda activate pinn_env # 安装 PyTorchCPU 版先跑通逻辑有卡再换 CUDA 版 pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu # 科学计算与绘图 pip install numpy matplotlib scipy jupyter # DeepXDE 只在部分 Poisson 算例里用到按需装 pip install deepxde逻辑说明先隔离环境是因为 PINN 对 PyTorch 版本敏感torch.autograd.grad的create_graph参数在不同版本行为有差异混装容易在二阶导上翻车。参数上Python 3.9 是甜点版本3.11 以上部分老 Notebook 的np.float别名会报错。DeepXDE 不是所有算例都依赖DeepXDE Poisson_equation_Dirichlet.ipynb才需要其余用原生 PyTorch 的可以先不装省得它把 TensorFlow 后端也拖进来。2.2 目录结构与模块职责解压后你会看到 Notebook 和三个.py文件混在一起这不是随意摆放而是有调用关系的。pinns geometry.py定义求解域几何区间、圆盘、边界点采样PDE.py负责把微分方程残差写成可求导的形式model.py是网络骨架和训练循环。Notebook 通过import把这些模块拉进来所以必须从解压根目录启动 Jupyter否则ModuleNotFoundError会直接糊脸。# 进入解压后的根目录再启动不要在上层目录启动 cd PINN-Notebooks-main jupyter notebook逻辑说明Python 的模块搜索路径默认包含当前工作目录Jupyter 启动目录就是工作目录。如果你在上级目录启动from pinns geometry import ...这种带空格的模块名实际导入时通常写成pinns_geometry或按 README 约定会找不到。参数上建议把整个文件夹放在纯英文路径下中文路径在 Windows 上偶尔会让 Matplotlib 保存图片失败。2.3 先跑哪个 Notebook推荐顺序别一上来就点Lorenz system.ipynb混沌系统对初值和网络容量都敏感容易让你误以为代码坏了。我建议的顺序是先ysin(πx)_cos(πx)这种一阶 ODE 建立信心再Δu 2的 Poisson 方程看二阶导怎么处理然后Euler Beam.ipynb看四阶导梁方程的 Jacobian-Hessian 技巧最后再碰Lorenz system和PDAE_system。data_domain.ipynb可以穿插看它帮你理解采样点是怎么撒的。提示每个 Notebook 第一次运行会现场训练网络CPU 上几分钟到十几分钟不等别以为卡死了看 loss 有没有在动。3. 核心原理落地PDE.py 与 model.py 里到底写了什么3.1 把微分方程变成 loss残差项怎么构造PINN 的核心思想不复杂让网络输出u(x)去逼近真解然后把微分方程残差、边界条件残差、初值条件残差加权求和当 loss。PDE.py干的就是这件事。以-y π²sin(πx)为例真解是sin(πx)残差写法如下import torch def pde_residual(model, x): # 开启梯度追踪x 需要 requires_grad x.requires_grad_(True) u model(x) # 一阶导 u_x torch.autograd.grad(u, x, grad_outputstorch.ones_like(u), create_graphTrue)[0] # 二阶导create_graphTrue 是关键否则无法再求导 u_xx torch.autograd.grad(u_x, x, grad_outputstorch.ones_like(u_x), create_graphTrue)[0] # 残差-u - π²sin(πx) 0 residual -u_xx - (torch.pi ** 2) * torch.sin(torch.pi * x) return residual逻辑说明create_graphTrue是 PINN 的命门没有它二阶导直接报错或返回 None。参数上grad_outputs必须和u同形状通常用torch.ones_like。残差本身不是 loss后面要取均方。常见做法是把域内残差、边界残差分别算 MSE 再加权权重比比如 1:10直接影响收敛边界权重太小会导致解“飘”出边界。3.2 网络结构与采样model.py 和 data_domain.ipynb 的配合model.py一般是全连接网络MLP激活函数常用tanh或sin。为什么不用 ReLU因为 ReLU 二阶导恒为零解二阶 PDE 时残差直接失效这是新手最容易踩的坑。data_domain.ipynb负责在域内和边界上采样常见做法是均匀采样加随机扰动或者拉丁超立方。import torch.nn as nn class PINN(nn.Module): def __init__(self, layers[1, 50, 50, 50, 1]): super().__init__() # 用 tanh保证二阶导非零 self.act nn.Tanh() self.linears nn.ModuleList( [nn.Linear(layers[i], layers[i1]) for i in range(len(layers)-1)] ) def forward(self, x): for i, lin in enumerate(self.linears[:-1]): x self.act(lin(x)) return self.linears[-1](x)逻辑说明层数和宽度是精度与速度的权衡[1,50,50,50,1]对一维问题是常见起点二维问题要加宽。参数上初始化用 Xavier 或默认即可学习率我一般从1e-3起步配合StepLR或ReduceLROnPlateau。采样点数不是越多越好域内 1000~5000 点、边界每侧 100~200 点通常够用点太多反而拖慢每轮迭代。3.3 边界条件处理Dirichlet、Neumann、Robin、Periodic 的差别这份资源把 Poisson 方程的四种边界都单独做了 Notebook这是它比很多“一锅炖”教程强的地方。Dirichlet 直接约束u值Neumann 约束u的法向导数又要用到 autogradRobin 是两者线性组合Periodic 要求左右边界值和导数都相等。以 Neumann 为例def neumann_loss(model, x_boundary, normal, g): x_boundary.requires_grad_(True) u model(x_boundary) u_x torch.autograd.grad(u, x_boundary, grad_outputstorch.ones_like(u), create_graphTrue)[0] # 法向导数 g return torch.mean((u_x * normal - g) ** 2)逻辑说明Neumann 的坑在于法向方向一维问题里就是正负号二维圆盘上要用法向量点乘梯度。参数上normal要和边界点一一对应。Periodic 边界常见做法是把左右边界的u和u_x差值都塞进 loss权重给大一点否则解在边界处会断开。4. 避坑与排查跑 PINN 时最容易被劝退的五个现象4.1 loss 不降反升或者降到某个值就卡住现象训练几百轮后 loss 在 1e-2 附近震荡解的形状完全不对。原因学习率太大或者边界 loss 权重太小网络只顾着满足域内方程而忽略边界。解决先把学习率降到1e-4再把边界权重调到域内的 10~100 倍观察 loss 曲线是否重新下降。我一般会先单独训练边界几轮让网络“记住”边界再联合训练。4.2 二阶导报错 “element 0 of tensors does not require grad”现象运行-y...类 Notebook 时直接抛 RuntimeError。原因输入x没有requires_grad_(True)或者第一次求导时create_graphFalse。解决检查PDE.py里残差函数开头有没有x.requires_grad_(True)以及两次torch.autograd.grad是否都带了create_graphTrue。这是血泪经验少一个参数整条链路断掉。4.3 解在边界处“飞出去”域内却拟合得很好现象画图时域内曲线贴着真解边界附近突然翘起。原因边界采样点太少或者边界 loss 用了 mean 而域内用了 sum量级不对等。解决把边界采样点加密到每侧 200 以上统一用torch.mean算 loss再检查权重。Periodic 边界尤其要注意左右两边都要采样。4.4 换台机器或换 PyTorch 版本后结果复现不了现象同一份 Notebook别人跑出漂亮解你跑出来一团糟。原因随机种子没固定或者 PyTorch 版本差异导致初始化不同。解决在 Notebook 开头加torch.manual_seed(42)、np.random.seed(42)并记录 PyTorch 版本。常见做法是把种子写进model.py的初始化函数里保证每次运行一致。4.5 DeepXDE 算例报后端冲突现象DeepXDE Poisson_equation_Dirichlet.ipynb报 TensorFlow 相关错误。原因DeepXDE 默认后端可能是 TensorFlow而你环境里只装了 PyTorch。解决装 DeepXDE 时指定后端或在代码开头设置os.environ[DDE_BACKEND] pytorch。参数上DeepXDE 对 PyTorch 版本也有要求太新可能不兼容建议按它文档的推荐版本装。注意避坑的核心不是背现象而是学会看 loss 分量。把域内 loss、边界 loss 分开打印哪个大就调哪个比盲目调网络结构有效得多。5. 进阶技巧用 Jacobian-Hessian 方法啃高阶方程与混沌系统5.1 为什么四阶梁方程需要 Jacobian-HessianEuler Beam.ipynb和Jacobian-Hessian methods for Laplace equation.ipynb是这份资源里最有含金量的部分。梁方程是四阶导如果老老实实嵌套四次autograd.grad计算图会爆炸显存和速度都吃不消。Jacobian-Hessian 方法的思路是把高阶导拆成矩阵运算利用 Hessian 的对称性减少重复计算。常见做法是显式构造 Jacobian 和 Hessian再用它们组合出高阶残差。def hessian_diag(model, x): # 计算 Hessian 的对角线用于拉普拉斯类算子 x.requires_grad_(True) u model(x) u_x torch.autograd.grad(u, x, grad_outputstorch.ones_like(u), create_graphTrue)[0] # 逐分量再求导得到对角线 hess_diag [] for i in range(x.shape[1]): grad_i torch.autograd.grad(u_x[:, i].sum(), x, create_graphTrue)[0] hess_diag.append(grad_i[:, i]) return torch.stack(hess_diag, dim1)逻辑说明这段代码算的是 Hessian 对角线对拉普拉斯算子Δu正好够用。参数上x.shape[1]是维度一维问题就退化成二阶导。相比嵌套求导这种写法在二维以上问题里能省不少显存。Jacobian-Hessian methods for ODE system.ipynb则把它推广到方程组适合PDAE_system.ipynb那种耦合系统。5.2 Lorenz 系统与 PDAE混沌和耦合系统的验证方法Lorenz system.ipynb是检验 PINN 鲁棒性的试金石。Lorenz 对初值极度敏感PINN 很难长时间精确拟合所以验证时不要只看最终图要看短时间窗口内的轨迹重合度和参数反演能力。我一般会把时间域切成若干段逐段训练再拼接比一次性训整个时间域稳。PDAE_system.ipynb是偏微分代数方程约束更多训练时要把代数约束单独作为一项 loss权重给高。Notebook方程类型关键技巧验证重点Euler Beam四阶 ODEJacobian-Hessian边界弯矩是否为零Lorenz system一阶混沌 ODE 组分段时间训练短窗轨迹重合PDAE_system偏微分代数代数约束单独 loss约束残差量级Laplace on a disk二维椭圆极坐标采样圆心处是否光滑5.3 一个我常用的收敛判断习惯跑完任何 Notebook我不会只看最后那张对比图。我会把 loss 历史导出来看三个量域内残差是否降到 1e-4 以下、边界残差是否比域内低一个量级、解的最大值是否和真解同量级。三个都满足才认为这次训练有效。从那以后我每次开新算例都强制走一遍这个检查省得被一张“看起来像”的图骗了。希望这份 Notebook 能帮你把 PINN 从论文里的符号变成手里能跑、能改、能验证的代码。本文还有配套的精品资源点击获取

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号