FBPINNs
FBPINNs 是一款基于有限基物理信息神经网络的开源工具,专门用于求解偏微分方程(PDE)的正向与逆向问题。它主要解决了传统物理信息神经网络(PINNs)在处理高频波动或多尺度解时面临的难题:由于神经网络的“频谱偏差”及优化复杂度激增,传统方法往往难以收敛或精度不足。
FBPINNs 创新性地引入了“分而治之”的策略,将复杂的计算域分解为众多重叠的子区域。在每个子区域内部署独立的神经网络,并通过平滑窗口函数进行局部约束和独立归一化。这种设计不仅有效降低了每个子网络需要学习的频率难度,还大幅简化了整体优化过程。值得一提的是,该工具近期已重构为 JAX 版本,利用并行计算技术将运行速度提升了 10 至 1000 倍,并能轻松扩展至数千个子域。
这款工具非常适合从事科学计算、计算物理及应用数学的研究人员与开发者使用。如果您正在探索波浪传播、多尺度建模等复杂微分方程求解难题,FBPINNs 能为您提供比传统方法更高的精度与计算效率,是突破现有神经网络求解瓶颈的有力助手。
使用场景
某地球物理勘探团队正利用地震波数据反演地下复杂岩层结构,需高精度求解包含高频振荡与多尺度特征的非线性波动方程。
没有 FBPINNs 时
- 高频失效:传统 PINN 受神经网络“频谱偏差”影响,难以捕捉地震波中的高频细节,导致成像结果模糊,丢失关键地质界面信息。
- 优化困难:面对多尺度解,单一全局网络的损失函数地形极度复杂,模型极易陷入局部最优,训练过程震荡且不收敛。
- 算力瓶颈:为提升精度被迫增加网络深度,导致显存爆炸且无法有效并行,计算耗时从数小时拖延至数天,严重阻碍迭代效率。
使用 FBPINNs 后
- 精准复原:FBPINNs 通过区域分解将大问题拆解,每个子域网络独立归一化,成功“压低”了局部有效频率,清晰还原了高频波场特征。
- 稳定收敛:采用“分而治之”策略大幅降低了优化复杂度,配合灵活的子域训练调度,即使在多尺度源项下也能快速稳定收敛。
- 极速扩展:基于 JAX 重构的代码利用
vmap实现子域计算高度并行,支持上千个子域同时运算,将原本数天的任务缩短至分钟级,效率提升百倍。
FBPINNs 通过创新的领域分解架构,彻底突破了传统深度学习求解器在处理高频、多尺度偏微分方程时的性能天花板。
运行环境要求
- Linux
- macOS
- Windows
- 非必需(支持 CPU 和 GPU)
- 若使用 GPU,需安装对应版本的 JAX GPU 包(支持 NVIDIA CUDA 或 Apple Silicon/MPS),具体型号和显存未说明,由 JAX 自动检测可用设备
未说明(取决于子域数量和网格点密度,可扩展至数千个子域)

快速开始
有限基物理信息神经网络(FBPINNs)
本仓库允许您使用有限基物理信息神经网络(FBPINNs)求解与偏微分方程(PDEs)相关的正问题和反问题。
🔥 重大更新 🔥:我们已用 JAX 重写了
fbpinns库;相比原有的 PyTorch 代码,现在运行速度提升了 10 到 1000 倍(通过使用jax.vmap并行化子域计算),并且可扩展至上千个子域。此外,我们还新增了多项功能:现在可以求解反问题、添加任意类型的边界/数据约束、定义不规则或多层级的区域分解以及自定义子域网络,同时高层级接口也更加灵活易用。更多信息请参阅发布说明。
FBPINNs 的详细描述见此处:有限基物理信息神经网络(FBPINNs):一种用于求解微分方程的可扩展区域分解方法,B. Moseley、T. Nissen-Meyer 和 A. Markham,2023 年 7 月《计算数学进展》]。您还可以在此处查看我们在 2023 年 Maths4DL 大会上的演讲幻灯片这里。
图 1:FBPINN 与 PINN 求解高频一维简谐振子
为什么选择 FBPINNs?
- 物理信息神经网络(PINNs)是求解与 PDEs 相关的正问题和反问题的一种流行方法。
- 然而,PINNs 在处理高频率和/或多尺度解的问题时往往表现不佳。
- 这主要是由于神经网络的谱偏差以及 PINN 优化问题的复杂度急剧增加所致。
- FBPINNs 通过结合区域分解、各子域归一化和灵活的子域训练调度,在这一领域显著提升了 PINN 的性能。
- 实验表明,在求解高频率和多尺度问题时,FBPINNs 在准确性和计算效率方面均显著优于 PINNs(图 1 和图 2)。
图 2:FBPINN 求解具有多尺度源的 (2+1)D 波动方程
FBPINNs 与 PINNs 有何不同?
图 3:FBPINN 工作流程概览
为提升 PINN 对高频率/多尺度解的可扩展性:
- FBPINNs 将问题域划分为多个小的、相互重叠的子域(图 3)。
- 每个子域内放置一个神经网络,并将 PDE 的解定义为所有子域网络之和。
- 每个子域网络通过乘以一个光滑可微的窗口函数被局部限制在其子域内。
- 最后,每个网络的输入都会在其所属子域上进行单独归一化。
其假设是,这种“分而治之”的方法能够显著降低 PINN 优化问题的复杂度。此外,通过各子域的单独归一化,确保每个子域网络所面对的“有效”频率较低,从而减轻谱偏差的影响。
子域调度
图 4:使用时间步进子域调度器求解时变伯格斯方程
使用区域分解的另一个优势在于,我们可以控制在每一步训练中求解域的哪些部分。
这在需要控制边界条件如何在整个域内传播时非常有用。
例如,我们可以定义一个时间步进调度器来求解时变 PDE,并从一组初始条件开始按时间顺序逐步学习解(图 4)。
这是通过指定一个来自 fbpinns.schedulers 的子域调度器来实现的,该调度器会定义在每一步训练中哪些子域处于活跃训练状态,哪些子域的参数保持固定。
安装
fbpinns 运行仅需 Python 库即可。
JAX 被用作
fbpinns的主要计算引擎。
要安装 fbpinns,我们建议您创建一个新的 Python 环境,例如:
conda create -n fbpinns python=3 # 使用 conda
conda activate fbpinns
然后克隆本仓库:
git clone git@github.com:benmoseley/FBPINNs.git
并在 FBPINNs/ 根目录下运行以下命令(此命令也会安装所有依赖项):
pip install -e .
注意:此操作将以“可编辑模式”安装
fbpinns包——您可以对源代码进行修改,这些更改会立即反映在包中。
入门
通过执行以下步骤,可以定义并求解正向和反向的偏微分方程问题:
- 定义问题域,选择或自定义一个
fbpinns.domains.Domain类。 - 定义要求解的偏微分方程以及任何问题约束条件(如边界条件或数据约束),选择或自定义一个
fbpinns.problems.Problem类。 - 定义 FBPINN 使用的区域分解,选择或自定义一个
fbpinns.decompositions.Decomposition类。 - 定义放置在每个子域中的神经网络,选择或自定义一个
fbpinns.networks.Network类。 - 通过将这些类及其初始化参数传递给一个
fbpinns.constants.Constants对象,来跟踪所有的训练超参数。 - 使用
Constants对象实例化一个fbpinns.trainers.FBPINNTrainer,开始 FBPINN 的训练。
例如,要求解上文所示的 1D 谐振子问题(图 1):
import numpy as np
from fbpinns.domains import RectangularDomainND
from fbpinns.problems import HarmonicOscillator1D
from fbpinns.decompositions import RectangularDecompositionND
from fbpinns.networks import FCN
from fbpinns.constants import Constants
from fbpinns.trainers import FBPINNTrainer
c = Constants(
domain=RectangularDomainND, # 使用 1D 问题域 [0, 1]
domain_init_kwargs=dict(
xmin=np.array([0,]),
xmax=np.array([1,]),
),
problem=HarmonicOscillator1D, # 求解 1D 谐振子问题
problem_init_kwargs=dict(
d=2, w0=80, # 定义常微分方程的参数
),
decomposition=RectangularDecompositionND, # 使用矩形区域分解
decomposition_init_kwargs=dict(
subdomain_xs=[np.linspace(0,1,15)], # 使用 15 个等间距的子域
subdomain_ws=[0.15*np.ones((15,))], # 子域宽度为 0.15
unnorm=(0.,1.), # 定义子域网络的非归一化范围
),
network=FCN, # 在每个子域中放置一个全连接网络
network_init_kwargs=dict(
layer_sizes=[1,32,1], # 包含 2 层隐藏层
),
ns=((200,),), # 使用 200 个配点进行训练
n_test=(500,), # 使用 500 个点进行测试
n_steps=20000, # 训练步数
optimiser_kwargs=dict(learning_rate=1e-3),
show_figures=True, # 训练过程中显示图表
)
run = FBPINNTrainer(c)
run.train() # 开始训练 FBPINN
FBPINNTrainer 将自动输出训练统计信息、图表以及 TensorBoard 摘要。可以通过安装 TensorBoard 并运行 tensorboard --logdir results/summaries/ 来查看 TensorBoard 摘要。
与 PINN 的比较
使用上述相同的超参数,可以轻松训练一个 PINN,方法如下:
from fbpinns.trainers import PINNTrainer
c["network_init_kwargs"] = dict(layer_sizes=[1,64,64,1]) # 使用更大的神经网络
run = PINNTrainer(c)
run.train() # 开始在同一问题上训练 PINN
进一步学习
请参阅 examples 文件夹,其中包含更多高级示例,涵盖:
- 如何定义自己的
Problem类 - 如何使用硬边界约束
- 如何求解逆问题
- 如何使用子域调度
可扩展 PINN 和最小化 FBPINN 实现研讨会
请查看我们的 可扩展 PINN 研讨会,其中我们展示了如何在 JAX 中编写一个最小化的 FBPINN 和 ELM-FBPINN。
常见问题解答
安装
使用 Apple GPU 时,我收到错误:RuntimeError: This version of jaxlib was built using AVX instructions, which your CPU and/or operating system do not support.。
- 截至本次提交,JAX 仅对 Apple GPU 提供实验性支持。您可以从 源代码 构建 JAX,或者使用 conda 安装仅限 CPU 的版本:
pip uninstall jax jaxlib和conda install jax -c conda-forge。
使用 GPU
如何使用 GPU 训练 FBPINNs?
- 完全相同的代码应该可以在 GPU 上自动运行,无需任何修改。请确保已安装 GPU 版本的 JAX,并且 JAX 能够识别您的 GPU 设备(例如,通过检查
jax.devices())。
理解仓库
但我并不了解 JAX!?
- 我们强烈建议您熟悉 JAX——它是一个功能强大、通用的加速可微计算库。但即使您不想学习 JAX,也没关系——所有前端类(
Domain、Problem、Decomposition和Network)都可以仅基于对jax.numpy的基本理解来定义(而jax.numpy本质上与numpy相同)。
方法论
FBPINNs 与其他 PINN + 区域分解方法有何不同?
- 与其他 PINN + 区域分解方法(如 XPINNs)相比,FBPINNs 在数学构造上不需要在其损失函数中添加额外的界面项,并且其解在子域界面处是连续的。本质上,FBPINNs 可以被视为为 PINN 定义了一种自定义的神经网络架构——其他方面保持不变。
引用
如果您发现 FBPINNs 非常有用并在自己的工作中使用了它们,请使用以下引用:
@article{Moseley2023,
author = {Moseley, Ben and Markham, Andrew and Nissen-Meyer, Tarje},
doi = {10.1007/S10444-023-10065-9},
journal = {Advances in Computational Mathematics 2023 49:4},
month = {jul},
number = {4},
pages = {1--39},
publisher = {Springer},
title = {{有限基物理信息神经网络 (FBPINNs): 一种用于求解微分方程的可扩展区域分解方法}},
url = {https://link.springer.com/article/10.1007/s10444-023-10065-9},
volume = {49},
year = {2023}
}
@article{Dolean2024,
author = {Dolean, Victorita and Heinlein, Alexander and Mishra, Siddhartha and Moseley, Ben},
doi = {https://doi.org/10.1016/j.cma.2024.117116},
issn = {0045-7825},
journal = {Computer Methods in Applied Mechanics and Engineering},
pages = {117116},
title = {{基于多级区域分解的物理信息神经网络架构}},
url = {https://www.sciencedirect.com/science/article/pii/S0045782524003724},
volume = {429},
year = {2024}
}
@article{VanBeek2025,
author = {van Beek, Jan Willem and Dolean, Victorita and Moseley, Ben},
doi = {10.1016/J.CMA.2025.118583},
issn = {0045-7825},
journal = {Computer Methods in Applied Mechanics and Engineering},
pages = {118583},
title = {{用于可扩展且条件良好的随机特征方法的局部特征过滤}},
url = {https://www.sciencedirect.com/science/article/pii/S0045782525008552},
volume = {449},
year = {2025}
}
复现我们的论文
要复现我们原始 FBPINN 论文的精确结果:有限基物理信息神经网络(FBPINNs):一种用于求解微分方程的可扩展区域分解方法,B. Moseley、T. Nissen-Meyer 和 A. Markham,2023 年 7 月《计算数学进展》],您需要使用旧版的 PyTorch FBPINN 实现,该实现可在这一 提交记录 中找到。
要复现我们另一篇论文的结果:基于多级区域分解的物理信息神经网络架构,请参阅此 分支。
要复现我们第三篇论文的结果:用于可扩展且条件良好的区域分解随机特征方法的局部特征滤波,请参阅此 分支。
还有其他问题吗?
请在 GitHub 上提交 issue,或随时与我们联系。
版本历史
v0.2.02023/07/30常见问题
相似工具推荐
openclaw
OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
gemini-cli
gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。
markitdown
MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器