pdeSolver 工业 PDE 计算教程

本教程介绍 DolphinDB pdeSolver 系列函数在工业计算中的使用方法,适用于 DolphinDB 3.00.6.1 及以上版本。教程面向工业计算、物联网、科学计算及数值算法开发人员,覆盖一维和二维线性抛物型偏微分方程(Partial Differential Equation,PDE),并通过热传导、输运和源项等问题,讲解方程设置、边界条件处理及数值结果验证。具体行为以实际部署版本和官方文档为准。

1. 概览

本教程通过热传导、污染物输运和局部热源三个案例,介绍如何使用 DolphinDB pdeSolver 系列函数对工业问题进行建模和求解。教程从物理模型出发,依次讲解系数设置、网格与边界条件配置、方程求解和结果验证,帮助用户逐步掌握从实际问题到 DolphinDB 可运行代码的实现过程。

1.1 学习目标

阅读本教程后,用户应能够:

  • 将热传导、扩散和输运等实际问题转化为 PDE 模型;

  • 使用 pdeCoeff1D/2D 设置扩散、对流、反应和源项;

  • 根据问题需求设置 Dirichlet、Neumann 和 Robin 边界条件;

  • 合理选择网格、时间步和二维 ADI 求解方法;

  • 通过解析解、守恒量和网格收敛,验证计算结果的正确性。

1.2 典型场景

本教程涵盖以下工业计算场景:

  • 棒材瞬态热传导、持续热源和表面对流换热;

  • 封闭介质中的脉冲扩散与质量守恒;

  • 开放通道中的对流、扩散及吸附衰减;

  • 局部热点的二维非均匀网格计算;

  • 非负浓度羽流的二维平流扩散模拟。

1.3 适用范围

本教程主要介绍如何使用 pdeSolver 求解一维和二维线性抛物型 PDE,采用结构化网格和有限差分方法。对于二维问题,可以选择 Douglas、CS、MCS 和 HV 等 ADI 方案;对于对流项,可选择 central、upwind 或 hybrid 格式。

对于复杂几何、三维问题、强非线性问题、多场耦合问题、不可压 Navier–Stokes 方程,以及对严格的有限体积守恒性有要求的场景,应结合具体模型评估 pdeSolver 是否适用,必要时选择更合适的专用数值方法。

2. 工业 PDE 的守恒律与接口映射

本章从质量守恒和能量守恒等物理定律出发,说明扩散、对流、反应、源项和储存项在偏微分方程中的含义,并给出这些数学项与 pdeCoeff1D、pdeCoeff2D 参数之间的对应关系。

2.1 从物理守恒定律开始

给定热量或浓度 u、扩散系数 D>0、输运速度 v 、一级反应系数 k ≥ 0 和源项 s,守恒型模型为

∂ u ∂ t + ∇ · J = − k u + s , J = v u − D ∇ u

在 D 和速度为常量、 ∇ · v = 0 时,可化为

u t = D Δ u − v · ∇ u − k u + s

对于 J · n = 0 ,有 D ∂ n u = ( v · n ) u ;只有边界法向速度为零时才退化为 ∂ n u = 0 。

2.2 pdeCoeff1D 映射

一维标准形式: M u t = A u x x + B u x + C u + D 0 。

表 1. 表 2-1 一维 PDE 数学项与接口字段映射
数学项 接口字段 热传导与输运含义

M

mass

储存量/有效热容,须为正

A

diff

扩散或温度扩散率

B

conv

物理速度为 v>0 时,常取 -v

C

react

反应或衰减 -k

D 0

source

热源/污染源注入

变系数守恒形式 ∇ · ( D ∇ u ) 展开时会出现 ∇ D · ∇ u ,不能在 diff 输入 D ( x ) 后忽略这些一阶项而声称仍在解守恒形式。必须把该导数项并入 conv/x/y,或者明确采用非散度形式模型。

2.3 pdeCoeff2D 映射

二维时: M u t = A u x x + B u y y + C u x y + D u x + E u y + F u + G

正向输运速度 ( v x , v y ) 映射为 x = − v x , y = − v y ;各向异性扩散分别进入 xx 和 yy;若模型含混合导数,xy 需要使用完整混合导数系数。

2.4 初始条件、边界与单位检查

  • initial:在 tGrid[0] 的温度/浓度场;其单位要和 u 一致。

  • boundary:Dirichlet 指定函数值;Neumann 指定外法向导数;Robin 指定 α u + β ∂ n u = v a l u e 。

  • 对右侧一维端点, ∂ n u = u x ;对左侧端点, ∂ n u = − u x 。将通量转成 Robin 条件时必须逐边核对符号。

  • source 的单位应是 u / t i m e 乘上 mass 对应单位;时间、长度和速度必须换算到同一单位制。

  • 定温与初始值在 t=0 的边界节点应兼容;二维角点两个 Dirichlet 边界须一致。

2.5 无源无流条件下的守恒量

若 k=s=0 且四周 J · n = 0 ,有

d d t ∫ Ω u d Ω = 0

纯扩散问题的零 Neumann 满足这一条件;有穿流的对流扩散问题则不能直接借用该结论。数值求解是否严格保守还受非守恒型差分算子的离散特性影响,必须实际计算网格权重积分予以评估。

3. 核心函数概览

下面只列出函数职责和常用调用方式。参数类型、默认值、返回结构及版本差异,以官方函数文档为准。

3.1 接口速查

表 2. 表 3-1 pdeSolver 系列核心函数
函数 功能概述 参考调用 官方文档

pdeGrid1D

创建一维均匀、sinh/tanh/log 非均匀空间网格

pdeGrid1D(xMin, xMax, n, [gridType], [focus], [density])

pdeGrid1D

pdeDomain1D

构造一维空间计算域

pdeDomain1D(xGrid)

pdeDomain1D

pdeDomain2D

由 x/y 网格构造二维结构化计算域

pdeDomain2D(xGrid, yGrid)

pdeDomain2D

pdeCoeff1D

封装一维扩散、对流、反应、源项和质量项系数

pdeCoeff1D(diff, [conv], [react], [source], [mass])

pdeCoeff1D

pdeCoeff2D

封装二维扩散、交叉导数、漂移与反应项

pdeCoeff2D(xx, yy, [xy], [x], [y], [u], [source], [mass])

pdeCoeff2D

pdeSolver

结合系数、初值、计算域、时间网格和边界求解 PDE

pdeSolver(coeff, initial, domain, tGrid, [boundary], [method], [setting])

pdeSolver

pdeInfo

查看网格、系数和其他对象的诊断概要

pdeInfo(obj)

pdeInfo

3.2 建模与求解流程

图 1. 图 3-1 PDE 建模与求解流程

method 用于选择时间推进、对流离散、ADI/obstacle 及资源配置;setting 用于返回模式、时间层、插值、Greeks 和诊断。不要把这两种字典的字段混用。interpAt 应位于定义域内;resultMode="detail" 可在验证阶段配合 diagnostics=true 使用。

3.3 快速跑通

下面的例子求解一根两端定温、内部均匀发热的归一化棒材。先运行代码,再回头看第 4 章的方程和误差分析。

alpha = 0.2
xGrid = (0..100) / 100.0
tGrid = (0..400) * (10.0 / 400.0)

method = dict(STRING, ANY)
method["scheme"] = "implicit"
setting = dict(STRING, ANY)
setting["resultMode"] = "detail"

result = pdeSolver(
    pdeCoeff1D(diff=alpha, source=2.0 * alpha),
    0.0,
    pdeDomain1D(xGrid),
    tGrid,
    0.0,
    method,
    setting
)

reference = xGrid * (1.0 - xGrid)
maxError = max(abs(result["value"] - reference))
table([result["value"][50]] as centerValue, [maxError] as maxError)

运行后应看到中心温度接近 0.25,maxError 约为 1.1e-9。这段代码只涉及四个对象:系数 coeff、空间域 domain、时间网格 tGrid 和边界条件;后面的案例只是逐步加入对流、源项、二维网格和诊断信息。

4. 一维工业 PDE 案例

本章通过内部热源传导、对流—扩散—吸附、高斯脉冲扩散和钢制棒材传热四个案例,演示一维工业 PDE 从物理建模、系数配置、边界设置到结果验证的完整过程。

4.1 一维热传导:内部热源与稳态

4.1.1 模型与设置

长为 1 的均匀棒材,端点维持零温度基准,内部持续均匀加热。归一化方程为 u t = α u x x + 2 α ,初值为

u ( x , 0 ) = 0 ,端点为 u ( 0 , t ) = u ( 1 , t ) = 0 。

独立解析基准。在稳态 u x x = − 2 ,故 u * ( x ) = x ( 1 − x ) ,中心温度恰为 0.25。这是解析值,不是 pdeSolver 已运行输出。

设置为 pdeCoeff1D(diff=alpha, source=2*alpha),boundary=0.0,initial=0.0。固定终止时间和空间节点计算 L ∞ 误差,再分别加密 N x = 51 / 101 / 201 与 N t = 100 / 200 / 400 ,同时检查非负性和对称性。

4.1.2 DolphinDB 示例代码

完整代码见第 3.3 节“快速跑通”。本例只是将源项、边界和解析参考写成一个最小的一维热传导问题。

4.1.3 运行结果

运行结果:N_x=101、N_t=400 时,maxError=1.107879e-09,symmetryError=1.998401e-15。空间和时间收敛结果见第 7 章。

4.2 一维对流—扩散—吸附:入口与出口条件

4.2.1 模型与设置

通道内存在正向流速和内部源项,方程为 c t = D c x x − v c x − k c + s ( x ) 。在 pdeCoeff1D 中设置 conv=-v,与物理速度正方向相反。

总流量(单位截面)为 J = v c − D c x ,所以 c x = 0 只表示零扩散梯度,不表示零总通量。本例用入口 c ( 0 , t ) = 0 、出口 c x ( 1 , t ) = 0 近似开放通道。若边界封闭,应直接建模 v c − D c x = 0 ,再按 API 的外法向符号转换为 Robin 条件。

检查入口、出口、非负性、浓度峰和质心位移,并与 v=0 的结果对照。高 Peclet 数时优先试 upwind,但要通过网格加密评估其数值扩散。

4.2.2 DolphinDB 示例代码

def pollutantSource(x, t) {
    normalizedDistance = (x - 0.2) / 0.03
    return exp(-normalizedDistance * normalizedDistance)
}

xGrid = (0..100) / 100.0
domain = pdeDomain1D(xGrid)

outletZeroGradient = dict(STRING, ANY)
outletZeroGradient["type"] = "neumann"
outletZeroGradient["value"] = 0.0
boundary = [0.0, outletZeroGradient]  // xMin: 固定入口浓度; xMax: 零梯度近似出流

coeff = pdeCoeff1D(
    diff=0.003,
    conv=-0.3,
    react=-0.2,
    source=pollutantSource
)

method = dict(STRING, ANY)
method["convectionScheme"] = "upwind"

setting = dict(STRING, ANY)
setting["resultMode"] = "detail"

result = pdeSolver(
    coeff,
    0.0,
    domain,
    (0..200) * (0.5 / 200.0),
    boundary,
    method,
    setting
)

4.2.3 运行结果

运行结果:最终场浓度范围约为 [0.0, 0.154389]。该数值对应当前 upwind、网格和时间步;改变 Peclet 数或网格后应重新检查峰值和非负性。

4.3 一维高斯脉冲扩散:守恒验收

4.3.1 模型与设置

考虑封闭一维介质中的局部高斯脉冲,方程为 u t = D u x x 。端点没有对流,零法向导数同时表示零扩散通量和零总通量。

数学性质。积分质量 M ( t ) = ∫ 0 1 u ( x , t ) d x 常数;峰值不增加,空间分布逐渐平缓,质量归一化方差趋向均匀分布的极限。

用与网格匹配的积分权重计算 | M ( t ) − M ( 0 ) | / M ( 0 ) 。非均匀网格不能直接用节点值求和代替积分。

4.3.2 DolphinDB 示例代码

def gaussianPulse(x) {
    normalizedDistance = (x - 0.5) / 0.04
    return exp(-0.5 * normalizedDistance * normalizedDistance)
}

xGrid = (0..200) / 200.0
tGrid = (0..100) * (0.2 / 100.0)

zeroFlux = dict(STRING, ANY)
zeroFlux["type"] = "neumann"
zeroFlux["value"] = 0.0

setting = dict(STRING, ANY)
setting["resultMode"] = "detail"
setting["output"] = "all"

result = pdeSolver(
    pdeCoeff1D(diff=0.002),
    gaussianPulse,
    pdeDomain1D(xGrid),
    tGrid,
    [zeroFlux, zeroFlux],
    NULL,
    setting
)

4.3.3 运行结果

运行结果:output="all" 返回 201×101=20301 个网格—时间值。均匀网格梯形积分得到初始质量 0.100265、末时刻质量 0.100265,相对漂移 3.737095e-15。

4.4 工程案例:钢制棒材含体积热源与表面对流换热(SI 单位)

4.4.1 工程对象及假设

一根长度为 L = 0.20 m 的细长实心钢棒,横截面足够小,可采用一维轴向温度场 T ( x , t ) 近似。棒材取常数热物性,体内存在均匀体积热源,两端与环境发生对流换热。忽略辐射、横向温度梯度、材料相变及热物性随温度变化;这只是可复现的教学工程模型,不可未经校准用作具体设备设计结果。

表 3. 表 4-1 钢制棒材工程参数
工程参数 符号 数值 单位

棒长

L

0.20

m

密度

ρ m

7850

kg/m³

比热容

c p

470

J/(kg·K)

导热系数

k

45

W/(m·K)

均匀体积热源

Q

12000

W/m³

两端对流换热系数

h

25

W/(m²·K)

环境与初始温度

T ∞ = T 0

20

°C

求解终点

t f

86400

s

这里使用的是教学参数,不对应某种特定钢材或设备测量值。真实棒材若存在横向散热,应把侧壁散热折算为体积源/汇项,并使用实际横截面周长和面积。

4.4.2 从能量方程到 pdeCoeff1D

在常数物性和无轴向流动条件下:

ρ m c p ∂ T ∂ t = k ∂ 2 T ∂ x 2 + Q , x ∈ ( 0 , L ) .

其中 ρ m c p 的单位为 J/(m³·K), k T x x 和 Q 的单位均为 W/m³。直接以物理量作为 PDE 系数:mass=rho*cp,diff=k,source=Q,无需预先归一化。温度可以使用 °C,因为该模型只涉及温差和温度导数。

两端向环境散热: − k ∂ n T = h ( T − T ∞ ) ,即

h k ⏟ α T + 1 ⏟ β ∂ n T = h k T ∞ ⏟ v a l u e .

注意左端外法向为 -x,右端外法向为 +x;两端使用相同 Robin 字典的原因是 pdeSolver 的导数以外法向定义,而不是两端统一使用 + ∂ x 。初值 T ( x , 0 ) = T ∞ 在 t=0 满足两端边界。

4.4.3 DolphinDB 完整可执行示例

// 参数均采用 SI 单位:m, s, kg, J, W, K(温差);显示温度为摄氏度。
length = 0.20
rhoMaterial = 7850.0
heatCapacity = 470.0
conductivity = 45.0
volumetricHeatSource = 12000.0
heatTransferCoefficient = 25.0
ambientTemp = 20.0
simulationSeconds = 86400.0

xGrid = (0..120)*(length/120.0)
tGrid = (0..480)*(simulationSeconds/480.0)

// 原始量形式:rho*c_p*T_t = k*T_xx + Q
coeff = pdeCoeff1D(
    diff=conductivity,
    source=volumetricHeatSource,
    mass=rhoMaterial*heatCapacity
)

// Robin alpha*T + beta*dT/dn = value,外法向 n 随端点变化。
convectiveEnd = dict(STRING, ANY)
convectiveEnd["type"] = "robin"
convectiveEnd["alpha"] = heatTransferCoefficient/conductivity
convectiveEnd["beta"] = 1.0
convectiveEnd["value"] = (heatTransferCoefficient/conductivity)*ambientTemp
boundary = [convectiveEnd, convectiveEnd]

method = dict(STRING, ANY)
method["scheme"] = "implicit"
setting = dict(STRING, ANY)
setting["resultMode"] = "detail"
setting["interpAt"] = length/2.0
setting["diagnostics"] = true

result = pdeSolver(
    coeff, ambientTemp, pdeDomain1D(xGrid), tGrid,
    boundary, method, setting
)

// 解析稳态:仅作为长时极限基准,不应冒充 t_f 时刻的精确解。
steadyTemp = ambientTemp + volumetricHeatSource*length/(2.0*heatTransferCoefficient) + volumetricHeatSource*xGrid*(length-xGrid)/(2.0*conductivity)
steadyCenter = ambientTemp + volumetricHeatSource*length/(2.0*heatTransferCoefficient) + volumetricHeatSource*length*length/(8.0*conductivity)

summary = dict(STRING, ANY)
summary["tempCenterAtFinalTime"] = result["interpValue"]
summary["steadyCenterReference"] = steadyCenter
summary["maxDistanceToSteady"] = max(abs(result["value"]-steadyTemp))
summary

4.4.4 解析稳态与工程解释

长时间后 T t = 0 ,因此 k T ″ + Q = 0 ,结合两端对流 Robin 边界得到:

T s t e a d y ( x ) = T ∞ + Q L 2 h + Q x ( L − x ) 2 k

示例参数下,稳态两端温度为 68 ∘ C ,中心温度为 69.333333 ∘ C 。

独立 Python 有限体积(隐式 Euler)瞬态参考,t=86400 s:

表 4. 表 4-2 独立有限体积瞬态参考结果
空间节点 N x 时间步 N t 中心温度(°C) 端点温度(°C)

61

240

69.164906

67.836145

121

480

69.170469

67.841557

241

960

69.173214

67.844227

这些是独立 FVM 数值结果,不是 DolphinDB 运行结果,也不能代替时间趋于无穷时的解析稳态。实际 pdeSolver 精度验收应与同时间、同物性、同边界的参考瞬态比较,而非要求 24 小时结果严格等于稳态。

这两个数字是公式计算的解析稳态基准,不是 t = 86400 s 时 DolphinDB 的求解结果。瞬态结果应随时间趋近稳态,初始时刻严格为 20 ∘ C 。

4.4.5 独立数值验证、网格与生产边界

  • 单位:PDE 各项为 W/m³,Robin 左右两项为 K/m,热通量还要乘以 k。

  • 网格:至少比较 N x = 61 , 121 , 241 和对应时间步的中心温度、端点温度及稳态距离。

  • 参考:validation/reference_regression.py 使用独立 FVM 隐式推进;真实设备还需校准热物性、侧壁换热和不确定性。

验证结果:解析关系、独立 FVM 参考、DolphinDB 运行结果以及空间/时间收敛数据均已记录。更换部署版本后,应在相同时间点重新做 FVM 对照,并复核生产边界条件。

5. 二维工业 PDE 案例

本章将一维建模方法扩展到二维结构化网格,介绍局部热点和对流羽流两类典型问题。内容重点包括二维扩散与漂移系数的设置、局部聚焦网格的使用、开放流场边界的处理,以及通过插值值、浓度范围、质心移动和网格加密验证计算结果。

5.1 二维局部热点:聚焦网格与源项

5.1.1 模型与设置

在 (0.3,0.7) 附近持续注入窄高斯热源,方程为 u t = D x u x x + D y u y y + s ( x , y ) 。本例取 D x = D y = 0.002 ,四边定温为 0。

方法。构造 41×41 均匀网格和 41×41 双方向 sinh 聚焦网格,再以更细网格参考比较热点中心温度。局部加密提高关注区域精度,但不一定降低全域最大误差。

比较时保持两组网格的总节点数接近,记录聚焦区域的最小步长,并与细网格结果比较。时间步也要单独加密,避免把时间误差误认为网格收益。聚焦网格是否更准,以运行结果为准。

5.1.2 DolphinDB 示例代码

def hotspotSource(x, y, t) {
    scaledX = (x - 0.3) / 0.03
    scaledY = (y - 0.7) / 0.03
    return exp(-scaledX * scaledX - scaledY * scaledY)
}

finalTime = 0.05
tGrid = (0..100) * (finalTime / 100.0)

uniformGrid = (0..40) / 40.0
focusedX = pdeGrid1D(0.0, 1.0, 41, "sinh", 0.3, 3.0)
focusedY = pdeGrid1D(0.0, 1.0, 41, "sinh", 0.7, 3.0)
referenceGrid = (0..120) / 120.0

coeff = pdeCoeff2D(
    xx=0.002,
    yy=0.002,
    source=hotspotSource
)

setting = dict(STRING, ANY)
setting["resultMode"] = "detail"
setting["interpAt"] = 0.3 0.7

method = dict(STRING, ANY)
method["parallel"] = false

uniform = pdeSolver(
    coeff, 0.0,
    pdeDomain2D(uniformGrid, uniformGrid),
    tGrid, 0.0, method, setting
)

focused = pdeSolver(
    coeff, 0.0,
    pdeDomain2D(focusedX, focusedY),
    tGrid, 0.0, method, setting
)

reference = pdeSolver(
    coeff, 0.0,
    pdeDomain2D(referenceGrid, referenceGrid),
    tGrid, 0.0, method, setting
)

5.1.3 运行结果

运行结果:均匀网格、聚焦网格和参考网格的插值值分别为 0.043145、0.041562 和 0.041574。当前结果显示聚焦网格更接近参考值,正式网格仍应按同样方法复核。

5.2 二维高 Peclet 羽流:开放流场边界

5.2.1 模型与设置

考虑局部污染源和二维流场,方程为 c t = D x c x x + D y c y y − v x c x − v y c y + s ( x , y ) 。源点为 (0.2,0.5),比较 ( v x , v y ) = ( 1 , 0 ) 和 (1, 0.4)。

通量为 J = v c − D ∇ c 。有穿过边界的对流时, ∂ n c = 0 不等于 J · n = 0 。本例使用固定零浓度入口和零梯度出口,适用性取决于流向和截断域;真正的无流出壁面应满足 v · n = 0 或相应 Robin 通量条件。

把等效网格积分质量作为监测量,用浓度质心 x ¯ , y ¯ 判断输运方向。 v y > 0 时要检查上边界是否确实起到出口作用,并通过增加网格密度和域高度评估截断边界的影响。

5.2.2 DolphinDB 示例代码

def plumeSource(x, y, t) {
    scaledX = (x - 0.2) / 0.035
    scaledY = (y - 0.5) / 0.035
    return exp(-scaledX * scaledX - scaledY * scaledY)
}

xGrid = (0..60) / 60.0
yGrid = (0..40) / 40.0
tGrid = (0..120) * (0.3 / 120.0)
domain = pdeDomain2D(xGrid, yGrid)

outletZeroGradient = dict(STRING, ANY)
outletZeroGradient["type"] = "neumann"
outletZeroGradient["value"] = 0.0
boundary = [0.0, outletZeroGradient, 0.0, outletZeroGradient]  // 入口固定 0,出口零梯度近似

method = dict(STRING, ANY)
method["parallel"] = false
method["convectionScheme"] = "upwind"

reportSetting = dict(STRING, ANY)
reportSetting["resultMode"] = "detail"
reportSetting["diagnostics"] = true

axisAligned = pdeSolver(
    pdeCoeff2D(
        xx=0.001, yy=0.001,
        x=-1.0, y=0.0,
        source=plumeSource
    ),
    0.0, domain, tGrid,
    boundary, method,
    reportSetting
)

oblique = pdeSolver(
    pdeCoeff2D(
        xx=0.001, yy=0.001,
        x=-1.0, y=-0.4,
        source=plumeSource
    ),
    0.0, domain, tGrid,
    boundary, method,
    reportSetting
)

5.2.3 运行结果

在 3.00.6.2 上,两组代码均执行成功,diagnostics.success=true 且无告警。轴向流和斜向流的最终最大浓度分别为 0.056756 和 0.039527,最小值接近 0。边界适用性仍应结合流向和网格加密判断。

6. 数值方法与稳定性

本章介绍时间步、对流离散格式、交替方向隐式方法以及网格设置对求解稳定性和精度的影响。

6.1 时间步和对流格式

显式扩散通常要求 D Δ t / Δ x 2 ≲ 1 / 2 ;二维和非均匀网格还要考虑两个方向及最小网格间距。高 Peclet 数下 central 可能振荡,upwind 更稳健但会引入数值扩散。最终用网格加密检查峰值、非负性和误差。

6.2 一维、二维方法选择

一维平滑扩散可从 theta/CN 与 implicit 开始;不连续初值再考虑 Rannacher。二维问题使用 Douglas、CS、MCS 或 HV 等 ADI 方案,并单独检查交叉项和时间误差。

6.3 网格和生产设置

pdeGrid1D 的聚焦网格适合局部热点和边界层,二维域由两组一维坐标组成。生产环境通常只返回最终场或少量时间层;验证阶段再打开 detail/diagnostics。output="all"、precompute、JIT 和并行会影响内存或耗时,记录版本、硬件和线程设置后再比较。

7. 验证与工程验收

本章给出由快速合理性检查、解析解对照、守恒量检查、制造解验证和网格收敛分析组成的验证体系。除检查代码能否执行外,还应验证结果形状、边界行为、非负性、质量或通量、空间误差和时间误差,并记录目标软件版本、网格、时间步和数值配置,以支持工程验收和结果复现。

7.1 验证体系

先做四项快速检查:

  • 结果形状和坐标是否正确;

  • 边界值、非负性和单调趋势是否符合模型;

  • 质量或边界通量是否满足预期;

  • 加密空间网格和时间步后,误差是否下降。

有解析解时优先做解析对照;没有解析解时,用制造解、独立数值方法或守恒量交叉检查。不要只看一个节点的温度或浓度。

7.2 参考问题

表 5. 表 7-1 验证参考问题
参考问题 用途 对应位置

一维无源热方程

检查时间演化、边界和空间误差

案例包 IND-011

一维带源热方程

检查源项符号和稳态趋势

4.1

二维可分离热方程

检查二维矩阵方向和 ADI

案例包 IND-027

MMS 制造解

检查 source、初值和时空离散

案例包 IND-029

解析关系和完整代码保留在第 4 章及 ZIP 的 validation/ 目录;正文先看表格和运行结果即可。

7.3 收敛性怎么做

表 6. 表 7-2 收敛性测试设计
测试 固定项 扫描项 指标 脚本入口

空间收敛

N t 足够细、域固定

N x =51,101,

201,401

L ∞ 、

加权 L 2

validation/convergence_scans.dos

时间收敛

N x 固定较细

N t =50,100,200,

400,800

时间误差比率

validation/convergence_scans.dos

局部聚焦

总节点数相同

uniform / sinh / tanh

热点误差、局部步长

03_2D_Industrial/IND-033/example.dos

对流稳定性

模型与边界不变

central / upwind / hybrid

非负性、过冲、峰位

02_1D_Industrial/IND-021/example.dos、02_1D_Industrial/IND-022/example.dos、02_1D_Industrial/IND-023/example.dos

物理边界

物理参数不变

域扩张与 Robin/出口近似

质量、通量与质心变化

validation/robin_zero_flux.dos、03_2D_Industrial/IND-031/example.dos

7.4 运行结果

表 7. 表 7-3 目标版本运行结果
用例 参考 运行结果 关键指标

1D 热方程

e − α π 2 t sin ( π x )

代码通过,边界为 0、结果非负

maxError≈7.0e-6

均匀热源稳态

x(1-x),中心 0.25

代码通过且保持对称

maxError=1.107879e-09

1D 封闭扩散

M(t)=M(0)

返回 20301 个网格—时间值

质量漂移 3.737095e-15

2D 封闭扩散

M(t)=M(0)

IND-031 通过

质量漂移 6.5503158452884236e-15

2D 解析热方程

e − 2 α π 2 t sin ( π x ) sin ( π y )

中心值 0.673860

误差约 3.4e-05

2D plume

正向质心位移

轴向/斜向代码均通过

最大浓度 0.056756/0.039527

以上结果均来自目标版本 DolphinDB 3.00.6.2。

7.4.1 目标版本空间与时间收敛扫描

以下数据来自目标版本 3.00.6.2 Server,误差取终止时间的最大绝对误差或指定插值点误差。对应的批量脚本是 validation/convergence_scans.dos;二维制造解扫描使用 validation/mms_convergence.dos。换用生产网格后,按同样方式重新扫描。

一维解析热方程。空间扫描固定 N_t=800、theta 格式:

表 8. 表 7-4 一维解析热方程空间收敛结果
N x 51 101 201 401

L ∞ 误差

2.941e-5

7.354e-6

1.839e-6

4.595e-7

时间扫描固定 N_x=401、隐式 Euler:

表 9. 表 7-5 一维解析热方程时间收敛结果
N t 50 100 200 400 800

L ∞ 误差

8.860e-5

4.456e-5

2.252e-5

1.149e-5

5.975e-6

MMS 空间扫描由 validation/mms_convergence.dos 复现。固定 N_t=600 时,N_x=41/81/121/161 的误差为 7.539e-5/1.886e-5/8.382e-6/4.715e-6。validation/convergence_scans.dos 的二维 MCS 空间扫描固定 N_t=200,N=21/41/61/81 的误差为 3.330e-4/8.327e-5/3.701e-5/2.082e-5;二维时间扫描固定 N=81,N_t=50/100/200/400/800 的误差为 2.075e-5/2.080e-5/2.082e-5/2.082e-5/2.082e-5。时间步继续加密收益很小,当前配置主要受空间误差限制。

7.4.2 二维封闭扩散质量守恒专项

专项入口为 ZIP 中的 03_2D_Industrial/IND-031/example.dos。模型为

u t = 0.02 ( u x x + u y y ) , ( x , y ) ∈ [ 0 , 1 ] 2

初值为 1 + 0.2 cos ( π x ) cos ( π y ) ,四边采用零 Neumann 边界,空间网格为 41×41,终止时间为 0.5。解析解用于检查场值误差;二维梯形权重用于检查

M ( t ) = ∫ 0 1 ∫ 0 1 u ( x , y , t ) d x d y

目标生产版本 3.00.6.2 2026.09.18 LINUX x86_64 的运行结果如下:

表 10. 表 7-6 二维封闭扩散质量守恒结果
指标 结果

初始质量

1.000000

末时刻质量

0.999999

质量绝对漂移

-6.550316e-15

质量相对漂移

6.5503156e-15

解析解最大误差

1.064917e-05

四边法向导数残差

3.552714e-14

本专项在当前模型、均匀网格和边界条件下通过;它说明该配置的离散质量误差接近机器精度,但不能外推为所有对流、源项、反应或 Robin 边界问题都严格守恒。非均匀网格应使用对应的二维单元面积或梯形权重重新计算。

7.5 如何判断结果

  • 纯扩散零 Neumann:检查加权质量;非均匀网格使用对应的长度或面积权重。

  • 对流扩散:检查非负性、峰值、质心和出口边界,不能直接套用纯扩散的守恒结论。

  • 严格守恒要求:确认离散算子本身具有守恒结构,再用实际网格计算质量和通量。

  • 图表:解析图标为“参考/示意”;数值热力图必须来自目标环境,并标出单位、坐标和版本。

7.6 深入验证脚本

需要复核时间推进、MMS、二维 ADI 或 Robin 通量时,直接运行案例包中的对应脚本:

表 11. 表 7-7 深入验证脚本入口
检查 案例入口 主要用途

一维解析热方程

02_1D_Industrial/IND-011

时间演化、边界和空间误差

MMS 制造解

03_2D_Industrial/IND-029

源项、初值和时空离散

二维解析热方程

03_2D_Industrial/IND-027

矩阵方向和 ADI

Robin 边界

02_1D_Industrial/IND-015、validation/robin_zero_flux.dos

边界字段、外法向符号和零总通量

正文给出结论和验收指标,完整脚本、阈值及运行说明以 ZIP 为准。收敛表中的 validation/convergence_scans.dos 和 validation/mms_convergence.dos 可直接返回各网格级别的误差向量。

8. 输出与生产使用

本章说明 pdeSolver 不同输出模式的结构以及生产运行需要保留的复现信息。

8.1 输出怎么读

表 12. 表 8-1 pdeSolver 输出结构
输出 形状/含义

一维最终场

长度为 N x 的向量

二维最终场

N x × N y 矩阵,行对应 x、列对应 y

output="all"

返回全部时间层;二维结果会明显增大内存

interpAt

返回定义域内指定点的插值值

验证阶段可以打开 resultMode="detail" 和 diagnostics=true;生产运行通常只返回最终场或少量时间层。

8.2 工程运行结果与复现信息

每次运行至少记录方程、单位、物性参数、边界、网格、时间步、数值配置、软件版本、主要结果和告警。

运行环境为 DolphinDB 3.00.6.2 2026.09.18 LINUX x86_64。正文 6 个代码块均执行通过;深入验证脚本和阈值见案例包。生产模型按实际参数和部署版本复核。

表 13. 表 8-2 工程案例回归结果
回归范围 目标版本结果

一维热传导、对流扩散、脉冲扩散

代码执行通过;分别取得误差、浓度范围和完整时间层输出

钢棒 SI 单位案例

中心温度 69.1704619 °C;与稳态中心 69.3333333 °C 的差异符合瞬态解释

二维热点与高 Peclet 羽流

两组案例均 diagnostics.success=true,无告警

二维封闭扩散守恒专项

IND-031 通过;质量相对漂移 6.5503158452884236e-15,解析最大误差 1.0649170349985582e-05

解析热方程、MMS、二维解析解

收敛脚本入口分别为 validation/convergence_scans.dos、validation/mms_convergence.dos 和 03_2D_Industrial/IND-027/example.dos

Robin 零总通量映射

validation/robin_zero_flux.dos 通过;解最大误差 3.4513e-05,左右外法向通量残差分别为 1.1213e-14、2.6645e-14

8.3 生产使用前检查

解析图只能作为参考示意;发布数值热力图时,应从目标环境导出数据,并标出单位、坐标和版本。复杂几何、3D、强非线性、多场耦合或严格有限体积守恒问题,先确认 pdeSolver 的结构网格和线性方程假设是否适用。

9. 附录

本章提供与教程配套案例代码以及文中出现的专业术语及其释义。

9.1 配套案例包

pdeSolver_industrial_cases_v3.zip包含 55 个 example.dos,按 API 基础、一维工业案例、二维工业案例、数值方法、输出诊断和发布示例分组。正文重点案例对应如下:

表 14. 表 9-1 正文重点案例索引
案例 用途

IND-011

一维解析热方程

IND-015

Robin 对流换热边界

IND-022

高 Peclet 对流扩散

IND-027

二维解析热方程

IND-031

二维质量守恒专项

IND-055

钢棒 SI 单位工程案例

正文 6 个代码块和 ZIP 内 55 个案例均已在目标版本回归;收敛扫描和 Robin 专项脚本位于 ZIP 的 validation/ 目录。完整索引、脚本和阈值见 ZIP 根目录 README.md。

9.2 术语与缩写

表 15. 表 9-2 术语与缩写
术语 全称 / 英文 说明

PDE

Partial Differential Equation,偏微分方程

含多个自变量(如时间、空间)偏导数的方程。本文讨论线性、抛物型 PDE,例如热传导方程和对流—扩散方程。

FDM

Finite Difference Method,有限差分法

在网格节点上用差商近似导数。pdeSolver 用的就是这种方法。

FVM

Finite Volume Method,有限体积法

对每个控制体积分守恒方程的离散方法,天然满足离散守恒。本文用它做独立参考计算。

ADI

Alternating Direction Implicit,交替方向隐式法

二维问题中把 x、y 方向拆开,每次只在一个方向上隐式求解,降低计算量。

Douglas

Douglas 格式

最基础的 ADI 格式,以提出者 Jim Douglas 命名。

CS

Craig–Sneyd 格式

在 Douglas 格式基础上增加对交叉导数项(xy)的校正。

MCS

Modified Craig–Sneyd,改进 Craig–Sneyd 格式

对 CS 再加一步校正,含交叉项时稳定性和精度更好。

HV

Hundsdorfer–Verwer 格式

另一种二阶 ADI 格式,适合含交叉项或对流项的问题。

CN

Crank–Nicolson 格式

当前时间层和下一时间层各取一半的隐式格式,二阶精度。初值不光滑时可能产生振荡。

theta 格式

θ-scheme

显式与隐式的加权组合。θ=0 是显式,θ=1 是隐式 Euler,θ=0.5 就是 CN。

隐式 Euler

Implicit (Backward) Euler

完全隐式的一阶时间格式,稳定性好,精度较低。

Rannacher

Rannacher 启动(Rannacher time-stepping)

先用几步隐式 Euler 平滑不连续初值,再切换到 CN,用来抑制振荡。

Dirichlet 边界

Dirichlet boundary condition

在边界上直接指定函数值,例如定温。

Neumann 边界

Neumann boundary condition

在边界上指定外法向导数,例如绝热或零梯度。

Robin 边界

Robin boundary condition

指定函数值与外法向导数的线性组合,例如对流换热边界。

外法向

Outward normal

垂直于边界、指向计算域外部的方向。本文的边界导数都按外法向定义。

Peclet 数

Péclet number,Pe

对流强度与扩散强度之比,常写为 Pe = v·L/D(网格 Peclet 数中用 Δx 代替 L)。Pe 越大,对流越占主导,数值振荡风险越高。

central / upwind / hybrid

中心差分 / 迎风格式 / 混合格式

对流项的离散方式。中心差分精度高但可能振荡;迎风格式更稳定,但会引入数值扩散;混合格式按局部 Peclet 数在两者之间切换。

MMS

Method of Manufactured Solutions,制造解方法

先设定一个解析解,反推需要的源项,再检验数值解的误差和收敛阶。

SI

International System of Units,国际单位制

本文的工程案例使用 m、s、kg、J、W、K 等单位。

JIT

Just-In-Time Compilation,即时编译

运行时把用户函数(如源项函数)编译后执行,影响计算耗时。

Navier–Stokes

Navier–Stokes 方程

描述黏性流体运动的非线性方程组,超出 pdeSolver 的适用范围。