3. 单物理场PINN入门

物理信息神经网络(Physics-Informed Neural Networks, PINN)的核心思想是将物理方程作为软约束嵌入神经网络的损失函数中,使得网络输出不仅拟合观测数据,还严格满足控制方程。本章以最经典的热传导方程为例,从问题定义、网络构建、边界条件处理到训练验证,完整走通单物理场PINN的建模流程。热传导方程结构简单但物理意义明确,非常适合作为PINN入门的第一个完整案例。

PINN热传导求解流程与网络结构 控制方程 ∂u/∂t = α·∂²u/∂x² 热扩散系数 α 神经网络 N(x,t;θ) 输入: 空间坐标x, 时间t 隐藏层: 4层×20神经元 激活: tanh 输出: 温度场 û(x,t) 损失函数 L = L_PDE + L_BC + L_IC L_PDE: 控制方程残差 L_BC: 边界条件残差 L_IC: 初始条件残差 权重: λ_PDE=1, λ_BC=1, λ_IC=1 优化器 Adam + L-BFGS 学习率: 1e-3 → 1e-5 衰减 迭代: 5000步Adam + 2000步L-BFGS 反向传播更新θ 边界条件处理 Dirichlet: u(0,t)=u(L,t)=0 Neumann: ∂u/∂x=0 硬约束 vs 软约束 验证与评估 对比解析解 u(x,t) = Σ(2/L)·sin(nπx/L)·e^(-α(nπ/L)²t) | 计算L2相对误差 | 可视化温度场演化 检查: 损失收敛曲线、残差分布、边界满足度、物理一致性

3.1 热传导问题的数学描述与PINN建模框架

考虑一维无限长细杆中的瞬态热传导问题。设杆长为 L,温度分布为 u(x,t),热扩散系数为 α(单位 m²/s)。控制方程为抛物型偏微分方程:

∂u/∂t = α · ∂²u/∂x²,  x ∈ (0, L), t ∈ (0, T]

初始条件:u(x, 0) = u₀(x),描述 t=0 时刻的温度分布。边界条件常见三类:Dirichlet(第一类,给定边界温度)、Neumann(第二类,给定边界热流)、Robin(第三类,对流换热边界)。本章以最简单的 Dirichlet 边界为例:u(0,t) = u(L,t) = 0,初始温度取 u₀(x) = sin(πx/L),该问题存在解析解 u(x,t) = sin(πx/L)·e^(-α(π/L)²t),便于后续验证。

PINN 的核心思想是构造一个神经网络 û(x,t;θ),其中 θ 为网络权重和偏置。网络的输入为空间坐标 x 和时间 t,输出为温度预测值。与传统监督学习不同,PINN 的损失函数不依赖大量标注数据,而是由物理方程残差、边界条件残差和初始条件残差三部分加权组成。通过最小化总损失,网络在满足数据拟合的同时,也满足物理规律的约束。

关键设计原则:PINN 的损失函数本质上是将 PDE 的强形式转化为最小二乘问题。对于热传导方程,我们需要计算网络输出对输入的二阶导数 ∂²û/∂x² 和一阶导数 ∂û/∂t,这通过自动微分(Autograd)实现,无需手动推导梯度公式。

3.2 网络架构与采样策略

对于热传导这类光滑问题,全连接前馈网络(FNN)已足够。推荐配置如下:

超参数 推荐值 说明
隐藏层数 4~6 层 过浅欠拟合,过深训练不稳定
每层神经元数 20~50 与问题复杂度相关,热传导20即可
激活函数 tanh Smooth且二阶可导,适合PDE
权重初始化 Xavier 避免梯度消失/爆炸
采样点数(内部) 2000~5000 在 (0,L)×(0,T) 内随机采样
边界采样点 每边界100~200 在 x=0 和 x=L 处沿时间轴采样
初始采样点 100~200 在 t=0 处沿空间轴采样

采样策略直接影响训练效果。内部点(collocation points)用于计算 PDE 残差,边界点和初始点分别用于约束边界条件和初始条件。建议使用拉丁超立方采样(LHS)替代纯随机采样,以获得更均匀的空间覆盖。训练过程中还可以采用自适应采样:在残差较大的区域加密采样点,提高局部精度。

3.3 边界条件处理的三种方式

边界条件的处理是 PINN 建模中最关键的环节之一,直接影响解的精度和收敛速度。常用方法有三种:

  1. 软约束(Soft Constraint):将边界残差作为损失项加入总损失。损失函数为 L = L_PDE + λ_BC·L_BC + λ_IC·L_IC。优点是实现简单,适用于任意复杂边界;缺点是边界条件只能近似满足,且权重 λ 需要调参。
  2. 硬约束(Hard Constraint):通过修改网络输出结构,使输出自动满足边界条件。例如对于 u(0,t)=u(L,t)=0,可令 û(x,t) = x(L-x)·N(x,t;θ),其中 N 为原始网络输出。这样无论 N 取何值,边界条件恒成立。优点是边界精确满足,损失函数只需关注 PDE 和初始条件;缺点是仅适用于简单规则边界。
  3. 混合方法:对 Dirichlet 边界用硬约束,对 Neumann 或 Robin 边界用软约束。实际工程中常采用此策略。
常见误区:初学者往往忽略边界条件的权重平衡。若 λ_BC 设置过大,网络会过度拟合边界而忽略内部物理规律;若过小,则边界误差主导整体误差。建议初始设置 λ_PDE=1, λ_BC=1, λ_IC=1,然后根据训练曲线动态调整。另外,硬约束虽然精确,但会改变网络输出的分布范围,可能导致训练初期梯度异常,需要配合适当的输出缩放。

3.4 训练流程与损失函数设计

完整训练流程如下:

1. 定义网络结构 û(x,t;θ)
2. 生成采样点:
   - 内部点: (x_i, t_i) ~ U(0,L) × U(0,T), i=1..N_f
   - 边界点: (0, t_j), (L, t_j), j=1..N_b
   - 初始点: (x_k, 0), k=1..N_0
3. 构建损失函数:
   L = (1/N_f)·Σ|∂û/∂t - α·∂²û/∂x²|²
     + (1/N_b)·Σ|û(0,t) - 0|² + |û(L,t) - 0|²
     + (1/N_0)·Σ|û(x,0) - sin(πx/L)|²
4. 优化:
   - 阶段1: Adam优化器, lr=1e-3, 迭代3000次
   - 阶段2: L-BFGS优化器, 迭代1000次
5. 验证:计算相对L2误差, 可视化温度场

损失函数中各项的权重可以动态调整。一种常用策略是使用 GradNorm 或不确定性加权:根据各项损失的量级自动分配权重,避免某一项主导训练。对于热传导问题,由于温度量级通常在 [0,1] 之间,各项损失量级相近,固定权重即可获得良好效果。

3.5 案例拆解:一维热传导PINN完整实现

下面通过一个完整案例展示 PINN 的建模、训练与验证过程。设 L=1, α=0.01, T=1,初始温度 u₀(x)=sin(πx),边界温度恒为 0。

步骤1:网络定义与采样

import torch
import torch.nn as nn
import numpy as np

class PINN(nn.Module):
    def __init__(self):
        super().__init__()
        self.net = nn.Sequential(
            nn.Linear(2, 20), nn.Tanh(),
            nn.Linear(20, 20), nn.Tanh(),
            nn.Linear(20, 20), nn.Tanh(),
            nn.Linear(20, 20), nn.Tanh(),
            nn.Linear(20, 1)
        )
    def forward(self, x, t):
        return self.net(torch.cat([x, t], dim=1))

# 采样
N_f = 3000  # 内部点
N_b = 200   # 每边界点
N_0 = 200   # 初始点
x_f = torch.rand(N_f, 1) * L
t_f = torch.rand(N_f, 1) * T
x_b0 = torch.zeros(N_b, 1); t_b0 = torch.rand(N_b, 1) * T
x_bL = torch.ones(N_b, 1) * L; t_bL = torch.rand(N_b, 1) * T
x_0 = torch.rand(N_0, 1) * L; t_0 = torch.zeros(N_0, 1)

步骤2:损失函数与训练

def loss_pde(model, x, t):
    x.requires_grad_(True); t.requires_grad_(True)
    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]
    return torch.mean((u_t - alpha * u_xx)**2)

def train(model, optimizer, epochs):
    for epoch in range(epochs):
        optimizer.zero_grad()
        loss = loss_pde(model, x_f, t_f) \
             + torch.mean(model(x_b0, t_b0)**2) \
             + torch.mean(model(x_bL, t_bL)**2) \
             + torch.mean((model(x_0, t_0) - torch.sin(np.pi * x_0))**2)
        loss.backward()
        optimizer.step()
        if epoch % 500 == 0:
            print(f'Epoch {epoch}, Loss: {loss.item():.6f}')

步骤3:验证与结果分析

训练完成后,在均匀网格上对比 PINN 预测与解析解。计算相对 L2 误差:

# 解析解
def exact(x, t):
    return np.sin(np.pi * x) * np.exp(-alpha * np.pi**2 * t)

# 在测试网格上评估
x_test = np.linspace(0, L, 100)
t_test = np.linspace(0, T, 100)
X, T_mesh = np.meshgrid(x_test, t_test)
u_exact = exact(X, T_mesh)
u_pred = model(torch.tensor(X.flatten(), dtype=torch.float32).unsqueeze(1),
               torch.tensor(T_mesh.flatten(), dtype=torch.float32).unsqueeze(1)).detach().numpy().reshape(100, 100)
rel_l2 = np.linalg.norm(u_pred - u_exact) / np.linalg.norm(u_exact)
print(f'相对L2误差: {rel_l2:.4f}')

典型结果:经过 5000 步 Adam + 2000 步 L-BFGS 训练后,相对 L2 误差可达到 1e-3 量级。温度场演化呈现典型的热扩散特征:初始的正弦分布随时间推移逐渐衰减,边界温度始终为 0,内部温度趋于均匀。

案例复盘:训练初期损失下降较快,后期趋于平缓。若发现损失停滞在较高水平,可尝试:①增加内部采样点数量;②调整网络宽度;③使用学习率衰减策略;④检查边界条件权重是否平衡。本案例中,硬约束边界条件(令 û = x(1-x)·N)可将误差进一步降低至 1e-4 量级,但需要额外处理初始条件的匹配。

3.6 常见误区与调优策略

误区 现象 解决方案
激活函数选择不当 ReLU导致二阶导为零,PDE残差恒为零 使用tanh或sigmoid等光滑激活函数
采样点过少 局部区域残差大,解不光滑 增加采样点至5000以上,或使用自适应采样
权重不平衡 边界条件满足但内部物理规律偏差大 动态调整λ_BC/λ_IC,或使用不确定性加权
训练不充分 损失仍在下降但提前停止 增加迭代次数,或切换L-BFGS做精细优化
网络过深 梯度消失,训练不稳定 减少层数至4~5层,或添加残差连接

调优策略方面,推荐采用两阶段训练:先用 Adam 以较大学习率快速逼近最优区域,再用 L-BFGS 进行精确收敛。L-BFGS 利用二阶信息,在光滑损失面上收敛速度极快,但需要全批量梯度,内存开销较大。对于热传导这类小规模问题,L-BFGS 是首选的精调工具。

经验提醒:训练完成后务必检查 PDE 残差的空间分布,而不仅仅是总损失值。残差集中区域往往对应物理量变化剧烈的区域(如初始时刻附近),可针对性地加密采样点。此外,将网络输出与解析解做逐点对比,绘制误差热力图,能直观发现系统性偏差。

本章通过热传导方程完整演示了 PINN 的建模流程:从物理方程出发,构建网络结构,设计损失函数,处理边界条件,训练优化,最终验证精度。这一流程可推广至更复杂的单物理场问题,如波动方程、对流扩散方程等。核心要点在于:物理约束的嵌入方式、采样策略的合理性、以及边界条件的精确处理。掌握这些基础后,即可向多物理场耦合建模迈进。