3. 含内热源的热传导PINN建模

任务目标

在长度为 L=1.0 的细杆上,求解含均匀内热源的一维稳态热传导方程,温度边界固定为两端 T(0)=T(L)=0。使用物理信息神经网络(PINN)直接逼近温度分布 T(x),并对比有无内热源时的温度场差异。

控制方程与无量纲化

控制方程为:

k·d²T/dx² + q = 0,   T(0)=T(L)=0

其中 k 为热导率,q 为体积内热源强度。取 k=1,定义无量纲热源 Q = q·L²/k。本案例取 Q=2,此时解析解为 T(x)=x(1-x)(对应 q=2),便于直接验证PINN精度。为分析热源影响,同时训练 Q=0(无热源,解析解 T=0)作为对照。

PINN结构与损失函数

神经网络 N(x;θ) 直接输出温度。总损失由三部分构成:

  • 方程残差:在内部配点处计算 d²N/dx² + Q 的均方误差;
  • 边界条件:N(0) 与 N(1) 应接近 0;
  • (可选)数据项:本案例为纯物理驱动,不使用任何温度测量数据。

关键完整代码(PyTorch实现)

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

torch.manual_seed(42)

# 物理参数
L = 1.0
Q = 2.0          # 无量纲内热源强度(Q=0 时为无热源对照)

# 神经网络:输入 x,输出 T
class PINN(nn.Module):
    def __init__(self):
        super().__init__()
        self.net = nn.Sequential(
            nn.Linear(1, 20), nn.Tanh(),
            nn.Linear(20, 20), nn.Tanh(),
            nn.Linear(20, 20), nn.Tanh(),
            nn.Linear(20, 1)
        )
    def forward(self, x):
        return self.net(x)

model = PINN()
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)

# 配点:内部点 + 边界点
x_int = torch.linspace(0, L, 100, requires_grad=True).reshape(-1, 1)
x_bc = torch.tensor([[0.0], [L]])

def loss_fn():
    # 方程残差(自动微分求二阶导)
    T_int = model(x_int)
    dT = torch.autograd.grad(T_int, x_int, grad_outputs=torch.ones_like(T_int), create_graph=True)[0]
    d2T = torch.autograd.grad(dT, x_int, grad_outputs=torch.ones_like(dT), create_graph=True)[0]
    f_res = d2T + Q
    loss_pde = torch.mean(f_res**2)

    # 边界条件
    T_bc = model(x_bc)
    loss_bc = torch.mean((T_bc - 0.0)**2)

    return loss_pde + loss_bc

# 训练
for epoch in range(3000):
    optimizer.zero_grad()
    loss = loss_fn()
    loss.backward()
    optimizer.step()
    if epoch % 500 == 0:
        print(f"Epoch {epoch:4d}, Loss = {loss.item():.2e}")

# 验证:与解析解 T_analytic = x(1-x) 比较
x_test = torch.linspace(0, L, 50).reshape(-1, 1)
T_pred = model(x_test).detach().numpy().flatten()
T_analytic = (x_test.numpy().flatten() * (1 - x_test.numpy().flatten())) * (Q / 2.0)
err = np.max(np.abs(T_pred - T_analytic))
print(f"最大误差 vs 解析解: {err:.2e}")

运行方式与依赖

需要 torch 和 numpy。直接运行上述脚本即可完成训练与验证。若需对照无热源情形,将 Q 改为 0.0 重新运行。

验证方法与判定标准

  • 损失收敛:训练结束时总损失应降至 1e-5 以下(Q=2时);
  • 解析解对比:Q=2 时,程序输出的最大误差应小于 1e-3,证明PINN正确求解了含内热源方程;
  • 热源影响分析:对比 Q=0 与 Q=2 的预测曲线,Q=2 时温度呈上凸抛物线分布,峰值在 x=0.5 处约为 0.25;Q=0 时温度恒为 0,说明内热源是温度场的唯一驱动力。

热源对温度场的影响

由方程 d²T/dx² = -Q 可知,内热源使温度分布呈抛物线形,且峰值与 Q 成正比。无热源时,在零边界条件下温度全场为 0;加入热源后,热量在内部产生并向两端低温边界传导,形成中部高、两端低的稳态分布。PINN 无需网格划分即可自动捕捉这一物理规律。

位置 x 温度 T(x) Q=2(含内热源) Q=0(无热源) x=0 x=L 峰值 T≈0.25

上图对比了两种工况下的稳态温度分布。内热源的存在使温度从零边界线性导热情形变为抛物线分布,峰值位于中心且数值等于 Q/8(本例为 0.25)。该结果与解析解完全一致,验证了PINN对含源项热传导方程的处理能力。