mcpField
J
jax-pde

jax-pde

github.com/tondevrel其他2471 次安装39 周前更新
代码仓库

关于 jax-pde

jax-pde 是面向研究人员的指南,介绍如何用 JAX 构建可微物理模拟和 PDE 模型,涵盖求解器求导、PINN、参数并行及反问题。

主要功能

  1. 01对数值求解器进行求导
  2. 02构建物理信息神经网络
  3. 03用 vmap 并行运行
  4. 04采用伴随式梯度计算
  5. 05实现有限差分求解器

适用场景

  1. 01求解热、波或流体方程
  2. 02根据观测推断物理参数
  3. 03分析物理系统的敏感性
  4. 04构建可微分模拟

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/tondevrel/scientific-agent-skills --skill jax-pde

安装后在 Claude Code 中输入/jax-pde确认已加载。

详细介绍

JAX - 可微分物理与 PDE

JAX 特别适用于物理计算,因为它可以对数值求解器进行求导。本指南介绍如何实现适合优化的传统 PDE 求解器,以及如何构建神经网络混合物理模型。

适用场景

  • 在 GPU 上求解 Navier-Stokes、Wave 或 Heat 方程。
  • 实现物理信息神经网络(PINN)。
  • 执行逆向设计(根据观测结果求出材料属性)。
  • 为机器人或气候建模创建可微分模拟。
  • 对物理系统进行灵敏度分析。

核心原则

1. 对求解器求导

在 JAX 中,如果使用 jax.numpy 编写 Euler 或 Runge-Kutta 积分器,就可以自动计算 ∂Result/∂InitialCondition 或 ∂Result/∂Viscosity。

2. 交错网格与 Vmap

物理场(速度、压力)通常存储在网格上。JAX 的 vmap 可以让你立即针对不同边界条件或参数集并行运行求解器。

3. 伴随方法

对于非常大的系统,JAX 的反向模式自动微分有效地实现了传统 CFD/地球物理学中用于梯度计算的“伴随状态法”。

实现模式

1. PINN(物理信息神经网络)
import jax.numpy as jnp
from jax import grad, vmap

# A simple MLP representing the solution u(x, t)
def model(params, x, t):
    # standard neural net logic...
    return result

# Residual of the PDE: u_t + u*u_x - nu*u_xx = 0 (Burgers Equation)
def pde_loss(params, x, t, nu):
    u = lambda x, t: model(params, x, t)
    
    # Automatic derivatives of the MODEL
    u_t = grad(u, argnums=1)(x, t)
    u_x = grad(u, argnums=0)(x, t)
    u_xx = grad(grad(u, argnums=0), argnums=0)(x, t)
    
    return jnp.mean((u_t + u * u_x - nu * u_xx)**2)
2. 可微分有限差分求解器
@jit
def update_step(u, dt, dx, nu):
    """One step of a diffusion solver."""
    # Vectorized Laplacian using shifts (Zero-copy views)
    u_left = jnp.roll(u, -1)
    u_right = jnp.roll(u, 1)
    laplacian = (u_left + u_right - 2*u) / (dx**2)
    return u + dt * nu * laplacian

# We can now differentiate this solver!
def loss(initial_u, target_u):
    final_u = integrate_pde(initial_u) # Loop of update_step
    return jnp.sum((final_u - target_u)**2)

grad_initial_condition = grad(loss)(initial_u, target_u)

关键规则

✅ 应该做
  • 使用 jax.lax.scan 编写时间循环 - 标准 Python for 循环会创建庞大的 XLA 计算图。scan 会将循环编译成单个高效内核。
  • 对网格进行归一化 - 与机器学习类似,如果将 x、t 缩放到 [0,1] 或 [-1,1],PINN 的收敛速度会更快。
  • 结合数据与物理规律 - 在有一些传感器数据和物理定律的情况下使用 PINN,以“填补空缺”。
  • 物理计算使用双精度 - 对于对精度敏感的数值求解器,使用 jax.config.update("jax_enable_x64", True)。
❌ 不应该做
  • 不要什么问题都用 PINN - 对于“正向”问题,传统求解器(FDM/FEM)速度快得多。PINN 更适合“逆向”问题。
  • 不要忽略边界条件(BC) - 在 PINN 中,必须将 BC 加入损失函数:Loss = PDE_loss + BC_loss。
  • 不要忘记“幽灵单元” - 实现 FDM 时要谨慎处理边界,避免产生伪影。

实用工作流:逆问题

根据流体视频求出黏度
def objective(nu_guess):
    # 1. Run simulation with nu_guess
    final_state = run_simulation(initial_state, nu_guess)
    # 2. Compare with experimental data
    return jnp.mean((final_state - experimental_frame)**2)

# Gradient descent to find the real physical property
optimal_nu = optimize(grad(objective))

JAX PDE 将物理计算从静态模拟转变为动态、可优化的空间。研究人员可以借此询问“哪些物理参数产生了这个结果?”,并通过梯度的力量找到答案。

评论

支持 Markdown