☰
从炉温曲线到最大过炉速度:一维热传导隐式差分与参数反演
2026/10/31 9:25:13 网站建设 项目流程

简介:这份讲评材料围绕2020年数学建模A题「炉温曲线」展开,面向参赛学生、指导教师及需要复盘该赛题的建模学习者,重点讲清如何把工业生产中的炉温控制问题转化为可求解的数学模型,并完成参数确定与优化设计。压缩包内为1个PDF文件,大小约26.94MB,篇幅完整,便于按目录顺序阅读和检索。内容从问题提出入手,依次覆盖炉温曲线模型、隐式差分格式、参数确定、常微分方程模型与对称处理,再延伸到传送带最大过炉速度、面积最小的最优炉温曲线和区域对称的最优炉温曲线等求解任务,最后附竞赛论文评述。读者可据此梳理热传导建模、数值离散、参数辨识与优化算法的组合思路,理解约束条件如何影响结果,也能借助论文评述反思建模表达与结果检验中的常见问题。已有4559人学习。

1. 炉温曲线:为什么炉子里的空气温度不等于焊点温度

「炉温曲线」这四个字容易让人以为画的是炉子的温度,其实真正决定焊接质量的那条曲线,画的是板子自己的温度。回焊炉里各温区的空气温度是提前设定好的,板子被传送带匀速送进去,从预热、恒温、回流一路走到冷却。炉内空气温度在空间上是一段一段的折线,而板子中心测到的温度却是平滑、滞后、被削掉峰值的曲线。两者之间隔着一层热传导,这层传导带来延迟、衰减和相位滞后,是个典型的低通滤波。

这道建模题的核心矛盾就建立在这里:空气温度已知,板子温度未知,中间是偏微分方程加对流边界。搞懂它,等于搞懂「给定外部激励,如何求一个受热物体的内部响应」这一类问题的完整链路:建模、离散、稳定性、参数反演、约束优化。下面按这条链路一层层往下走。

2. 一维热传导方程:把三维炉膛压成一条厚度方向的能量账本

2.1 为什么敢把三维炉膛压成一维

板子的长宽通常是厚度的几十倍到上百倍,长宽几百毫米,厚度在亚毫米到一毫米多的量级。热量从上下表面进入,沿厚度方向传导的距离最短,温度梯度最大;面内方向的导热路径长得多,梯度小。在这种尺度悬殊的结构里,把温度场近似成只随厚度方向和时间的函数 $T(x,t)$,是工程上非常自然的降维。代价是丢掉了面内导热:板子上如果有大块铜箔、连接器、局部器件,面内导热其实不可忽略,一维模型在这些位置会失准。但题目只给了一个测点的实测数据,模型复杂度必须和数据量匹配,一维是有依据的克制。

真正让计算量再砍一半的是对称性。板子的上下表面同处一个炉膛气氛,换热条件相同,于是温度场关于中面镜像对称。对称的数学表达不是「中面温度等于某个值」,而是中面热流为零:

$$\left.\frac{\partial T}{\partial x}\right|_{x=d/2} = 0$$

这是一条 Neumann 齐次边界。有了它,只需在 $[0, d/2]$ 这半个厚度上求解,计算量减半;而且求解域的末端节点正好就是板中心,输出直接可用。判断能不能用对称,依据是边界条件是否对称,几何形状本身反倒次要。如果板子一面贴着治具、一面暴露在炉膛里,上下换热系数不同,对称假设立刻失效,必须算全厚度。这条判据很多人只记住了「对称可以省计算」,却忘了先确认对称的前提。

2.2 边界条件才是真正的「炉子」

热传导方程本身是普适的:

$$\rho c \frac{\partial T}{\partial t} = \lambda \frac{\partial^2 T}{\partial x^2}$$

密度 $\rho$、比热 $c$、导热系数 $\lambda$ 描述的是板材,和炉子无关。炉子的全部信息都从边界条件进来,形式是 Robin 边界(第三类边界条件):

$$-\lambda \left.\frac{\partial T}{\partial x}\right|{x=0} = h\left(T{\text{air}}(t) - T(0,t)\right)$$

左边是傅里叶定律给出的导热热流,右边是牛顿冷却定律给出的对流热流,两者在表面必须相等。$h$ 是对流换热系数,$T_{\text{air}}(t)$ 是板子当前所在位置的炉内空气温度。

这里有个容易被忽略的转换:炉内空气温度本质上是位置 $s$ 的函数 $f(s)$,而传送带速度 $v$ 把位置换成时间,$s = vt$,于是 $T_{\text{air}}(t) = f(vt)$。这意味着传送带速度不是方程里的系数,而是边界条件的时间尺度。速度提高一倍,整条空气温度曲线在时间轴上被压缩一半,板子经历的高温段变短、峰值下降。所以后面求「最大过炉速度」时,改的是边界条件的自变量映射,方程本身一个字都不用动。理解这一点,就不会在优化时去错误地修改材料参数。

$h$ 的物理含义也值得展开。它不是材料的属性,而是流场和表面状态的综合结果:风速、空气密度、表面粗糙度、板子姿态都会影响它。工程上很少能直接算出 $h$,通常靠实验标定,这正是后面要做参数反演的原因。常见的实现思路是把 $h$ 当成常数处理,或者按温区分段取不同值;更精细的做法是让 $h$ 随温度变化,但那会让反演的自由度上升,得不偿失。

2.3 集总参数模型:什么时候可以用常微分方程代替偏微分方程

如果板子内部温差远小于表面与空气的温差,可以假设整个厚度上温度均匀,只有一个 $T(t)$。这时对控制体积做能量平衡:

$$\rho c V \frac{dT}{dt} = hA\left(T_{\text{air}}(t) - T\right)$$

$V$ 是体积,$A$ 是换热面积。这是一阶线性常微分方程,写成标准形式 $dT/dt + kT = k T_{\text{air}}(t)$,其中 $k = hA/(\rho c V)$。它的解是空气温度曲线与指数核的卷积:

$$T(t) = T(0)e^{-kt} + k\int_0^t e^{-k(t-\tau)}T_{\text{air}}(\tau),d\tau$$

这个表达式一眼就能看出低通滤波的本质:时间常数 $1/k$ 越大,跟随越慢,峰值削得越狠。

判断能不能用集总模型的标准是毕渥数:

$$Bi = \frac{hL}{\lambda}$$

$L$ 取特征长度(半厚)。经验上 $Bi < 0.1$ 时内部温差不到表面温差的 10%,集总近似可以接受。对薄板加热,$h$ 在几十到几百 $\text{W}/(\text{m}^2\cdot\text{K})$ 量级,$\lambda$ 在 $0.3\ \text{W}/(\text{m}\cdot\text{K})$ 量级,若半厚取 0.5 mm,$Bi$ 大约在 0.1 到 0.5 之间,属于灰色地带。

灰色地带意味着模型选择会直接影响结论。集总模型的参数少、算得快、还能做解析分析,但它丢掉了厚度方向的梯度,升降温速率会被系统性低估,峰值也会被削平。一个常见做法是用集总模型去拟合实测曲线,拟合效果看着不错,因为反演出来的 $h$ 会把结构误差悄悄吸收进去。这种用参数补偿结构误差的做法在拟合区间内几乎看不出问题,一旦外推到别的传送带速度就原形毕露。分辨的办法很简单:换一组不同速度的实测数据再反演一次,如果 $h$ 变化很大,说明模型结构不对,参数在替模型背锅。

3. 隐式差分格式:显式格式为什么会一步炸开

3.1 显式格式的稳定性红线

偏微分方程有了,接下来要数值求解。最直观的离散是显式差分:空间二阶中心差、时间前向欧拉。

$$\frac{T_i^{n+1}-T_i^n}{\Delta t} = \alpha\frac{T_{i+1}^n - 2T_i^n + T_{i-1}^n}{\Delta x^2}$$

其中 $\alpha = \lambda/(\rho c)$ 是热扩散率。整理一下:

$$T_i^{n+1} = T_i^n + r\left(T_{i+1}^n - 2T_i^n + T_{i-1}^n\right),\qquad r = \frac{\alpha\Delta t}{\Delta x^2}$$

这个格式完全不需要解方程组,每个节点独立更新,写起来十几行代码就能跑。问题是 $r$ 有硬性上限。做 von Neumann 稳定性分析,把误差写成傅里叶模态 $e^{i\theta i}$,放大因子是:

$$G = 1 - 4r\sin^2\frac{\theta}{2}$$

要求 $|G| \le 1$ 对所有 $\theta$ 成立,最坏情况 $\sin^2(\theta/2)=1$,得到 $r \le 1/2$。这就是显式格式的稳定性红线。

把数量代进去看这条线有多紧。FR4 类板材厚度方向的热扩散率大约 $10^{-7}\ \text{m}^2/\text{s}$ 量级,如果空间步长取 0.1 mm,$\Delta x^2 = 10^{-8}\ \text{m}^2$,则 $\Delta t \le 0.05\ \text{s}$。整条炉温曲线历时几百秒,就要算上万步。如果为了看清表面附近的陡梯度把 $\Delta x$ 减半,$\Delta t$ 要缩到四分之一,步数翻四倍。网格加密的代价是平方级的,三维问题或者精细网格下,显式格式很快就会变得不可接受。

还有一点:$r > 1/2$ 时不是慢慢失真,而是几步之内出现交替正负的振荡并迅速放大,曲线变成锯齿,看起来像程序写错了。这是踩坑率最高的现象之一——明明方程和边界都对,结果就是发散,问题出在时间步长。

3.2 隐式格式的矩阵组装与追赶法

把时间导数用后向欧拉,右端空间项取新时刻的值:

$$\frac{T_i^{n+1}-T_i^n}{\Delta t} = \alpha\frac{T_{i+1}^{n+1} - 2T_i^{n+1} + T_{i-1}^{n+1}}{\Delta x^2}$$

整理成线性方程组的形式:

$$-rT_{i-1}^{n+1} + (1+2r)T_i^{n+1} - rT_{i+1}^{n+1} = T_i^n$$

每个时间步都要解一个三对角线性系统。它的放大因子是 $G = 1/(1 + 4r\sin^2(\theta/2))$,分母恒大于等于 1,所以对任意 $r > 0$ 都满足 $|G| \le 1$。这就是「无条件稳定」的含义:时间步长不再受稳定性约束,只受精度约束。

边界条件怎么进矩阵是关键细节。表面节点用虚拟节点法做二阶离散:设 $x=0$ 左侧有一个虚拟节点 $T_{-1}$,中心差分给出

$$\frac{T_1 - T_{-1}}{2\Delta x} = -\frac{h}{\lambda}\left(T_{\text{air}} - T_0\right)$$

移项解出 $T_{-1}$,代回 $i=0$ 的内点方程,消掉虚拟节点,第一行就变成带源项的修正形式。中面节点用 $T_{nx+1} = T_{nx-1}$ 消去越界项,最后一行系数变成 $-2r$ 和 $1+2r$。

import numpy as np from scipy.linalg import solve_banded def simulate(T_air, alpha, h, lam, d, nx, dt, nstep, T0=25.0): """ 一维隐式(后向欧拉)热传导,求解域为半厚 [0, d]。 x=0 为板表面(Robin 边界),x=d 为中面(绝热对称边界)。 T_air: callable, t -> 该时刻板所在位置的炉内空气温度 alpha: 热扩散率 lambda/(rho*c) h: 对流换热系数 lam: 导热系数 nx: 空间区间数,节点数为 nx+1 """ dx = d / nx r = alpha * dt / dx**2 # 网格傅里叶数,隐式格式下无上限 bi = h * dx / lam # 网格毕渥数,边界行的修正系数 n = nx + 1 T = np.full(n, T0) # 三对角系数:lo 下对角,di 主对角,up 上对角 lo = np.full(n, -r) di = np.full(n, 1 + 2 * r) up = np.full(n, -r) # 表面节点 i=0:虚拟节点消元后的二阶精度 Robin 边界 di[0] = 1 + 2 * r + 2 * r * bi up[0] = -2 * r lo[0] = 0.0 # 中面节点 i=nx:dT/dx=0,用 T[nx+1]=T[nx-1] 消去越界项 di[-1] = 1 + 2 * r lo[-1] = -2 * r up[-1] = 0.0 # 打包成 solve_banded 需要的 (1,1) 带状存储 ab = np.zeros((3, n)) ab[0, 1:] = up[:-1] # 上对角 ab[1, :] = di # 主对角 ab[2, :-1] = lo[1:] # 下对角 out = np.empty(nstep) for k in range(nstep): t = (k + 1) * dt rhs = T.copy() rhs[0] += 2 * r * bi * T_air(t) # 边界源项,把空气温度注入 T = solve_banded((1, 1), ab, rhs) out[k] = T[-1] # 中面温度即板中心温度 return out

代码里有几个点值得单独说明。r在隐式格式里可以取任何正数,但精度会随它增大而下降,工程上一般控制在 1 到 10 之间,既能吃到无条件稳定的好处,又不至于把时间精度丢太多。bi = h*dx/lam反映的是一个网格内导热热阻与对流热阻的比值,它只出现在第一行,是边界条件进入离散系统的唯一通道;h变了,只有这一行变,内点方程纹丝不动。表面行的右端项2*r*bi*T_air(t)是空气温度的作用点,如果这里漏了或者符号写反,整条曲线会整体偏高或偏低,而且形状看起来还很「合理」,属于最难查的一类 bug。

rhs = T.copy()然后只改第 0 个元素,这个写法保证了内点方程的右端就是上一时刻的温度,不做任何多余处理。中面那一行的lo[-1] = -2*r是两倍的 $-r$,因为对称边界把左右两个邻居的温度合并成了同一个未知量。

3.3 网格无关性与时间步长验证

隐式格式无条件稳定,但「稳定」不等于「准确」。步长选多大,必须用收敛性验证说话。

做法是固定其他参数,把空间节点数从 20、40、80、160 逐级加倍,时间步长同步减半,观察两个积分量:峰值温度,和超过液相线温度(比如 217℃)的累计时长。判据可以定得具体些:峰值变化小于 0.1℃,超温时长变化小于 0.5 秒,就算收敛。只看曲线形状是不够的,两条曲线肉眼看着重合,积分面积可能差好几个百分点,而工艺约束恰恰都是积分量或斜率类的量。

时间方向上,后向欧拉是一阶精度,收敛偏慢,想提速可以换 Crank-Nicolson(时间二阶)。但这里有个反直觉的地方:$T_{\text{air}}(t)$ 在温区交界处是折线,导数不连续,Crank-Nicolson 在这种不光滑的激励下会在折点附近产生非物理振荡,尤其是冷却段温度骤降的位置。后向欧拉是 L-stable 的,对刚性段更钝,反而更稳。这是一个典型的「精度更高的格式未必给出更好的结果」的例子,格式的阶数要和输入的光滑性匹配。

还有一个实操细节:温区交界处空气温度梯度最大,如果网格是均匀的,交界附近的离散误差会主导整体误差。常见做法是在交界处局部加密,或者把空气温度曲线做一次平滑(物理上炉内也确实存在混合过渡区,不是理想的阶跃)。做平滑要小心,平滑过度等于篡改了输入,会系统性低估升降温速率。

4. 参数反演与工艺优化:从一条实测曲线走到可行域边界

4.1 正问题与反问题:同一个方程,两个方向

正问题是给定 $\lambda$、$\rho c$、$h$ 和 $T_{\text{air}}(t)$,求 $T(t)$,这是适定的,解存在唯一且连续依赖初边值。反问题是给定实测的 $T_{\text{obs}}(t)$,反推 $h$ 甚至 $\alpha$,这是典型的不适定问题:解可能不唯一,且对观测噪声极其敏感。

为什么不唯一,从物理上能看明白。$h$ 增大,表面更快跟随空气温度;$\alpha$ 增大,内部更快把表面的热量传进来。这两个变化在中心温度曲线上产生的效果高度相似,都是「响应变快」。单靠一条中心温度曲线,很难把两者的贡献完全分开。这就是参数可辨识性问题,不是算法不够好,是信息量不够。

工程上的标准解法是降维:把 $\rho c$ 和 $\lambda$ 按文献值固定,只反演 $h$ 这一个参数。固定的依据是板材的热物性相对稳定,而 $h$ 受流场影响大、最不确定。降维之后问题从病态变成良态,代价是引入了一点模型偏差——如果文献值和真实板材差得多,反演出的 $h$ 会偏离物理真值。这个偏差在拟合区间内不可见,是这类做法的隐性成本。

4.2 最小二乘目标函数与搜索实现

反演的目标函数取均方残差:

$$J(h) = \frac{1}{M}\sum_{k=1}^{M}\left[T_{\text{sim}}(t_k; h) - T_{\text{obs}}(t_k)\right]^2$$

$t_k$ 是实测采样时刻,$T_{\text{sim}}$ 是在这些时刻插值出来的模拟值。一次正问题求解要几十毫秒,高维梯度法需要数值求梯度,每次迭代要算好几遍正问题,成本很快上去。一维问题就直接用有界搜索。

import numpy as np from scipy.optimize import minimize_scalar def make_residual(t_obs, T_obs, alpha, lam, d, nx, dt, nstep, T_air): t_grid = np.arange(1, nstep + 1) * dt def residual(log_h): h = np.exp(log_h) # 对数参数化,保证 h 恒为正 T_sim = simulate(T_air, alpha, h, lam, d, nx, dt, nstep) T_at = np.interp(t_obs, t_grid, T_sim) # 模拟网格与实测时刻不对齐,需插值 return np.mean((T_at - T_obs) ** 2) return residual # 在 [50, 500] W/(m^2*K) 范围内搜索,对数尺度让区间更均匀 res = minimize_scalar(make_residual(...), bounds=(np.log(50), np.log(500)), method='bounded', options={'xatol': 1e-3}) h_best = np.exp(res.x)

对数参数化的作用不只是保证正性,它还让搜索在数量级上均匀——$h$ 从 50 到 100 和从 250 到 500 在对数尺度上是等距的,有界搜索的收敛行为更一致。插值那一步容易被忽略:模拟输出的时间网格是均匀的 $k\Delta t$,实测数据的采样时刻通常不规则,直接按下标对齐会引入系统性错位,表现为残差降不下去但曲线看着「差不多」。

如果要同时反演两个参数,用 Nelder-Mead 或差分进化都可以,但先做敏感性分析更划算。固定一个参数、扰动另一个,看目标函数和曲线的变化幅度:$h$ 变化 20% 通常会让峰值移动好几度,$\alpha$ 变化 20% 对中心温度的影响则小得多,因为厚度方向的热阻本来就不是主导项。敏感性差距大,说明只有一个参数真正可辨识,硬反演两个只会得到一组互相补偿、物理上没意义的解。

4.3 最大过炉速度:为什么要靠单调性而不是梯度

工艺上有几条硬约束,通常是这四类:峰值温度必须落在某个区间内;超过液相线温度的累计时长有上下限;升温段斜率不能太陡(防止热冲击和飞溅);降温段斜率不能太缓也不能太陡(影响晶粒组织)。这些约束把可行域切得很窄。

传送带速度 $v$ 对曲线的影响是单调的:$v$ 增大,板子在每个温区的停留时间缩短,峰值下降,超温时长缩短,升温斜率变陡。于是「超温时长不低于下限」「峰值不低于下限」这类约束关于 $v$ 单调,可行域是一段区间,求最大 $v$ 就等价于求某个约束函数的根。既然单调,二分是天然的选择,而且二分只依赖可行性判定,不要求目标函数可微。

import numpy as np def feasible(v, simulate, params, dt=0.1): """v 单位 mm/s;返回该速度下是否满足全部制程约束""" T = simulate(v, **params) peak = T.max() t_liquid = np.sum(T > 217.0) * dt # 超液相线时长 slope_up = np.max(np.diff(T) / dt) # 最大升温斜率 slope_down = np.min(np.diff(T) / dt) # 最小降温斜率(负值) ok = True ok &= (235.0 <= peak <= 250.0) # 峰值窗口,示意值 ok &= (40.0 <= t_liquid <= 90.0) # 超温时长窗口,示意值 ok &= (slope_up <= 3.0) # 升温斜率上限 ok &= (slope_down >= -6.0) # 降温斜率下限 return ok lo, hi = 5.0, 30.0 # 速度搜索区间,示意 for _ in range(45): # 45 次二分,精度远小于 0.01 mm/s mid = 0.5 * (lo + hi <p> <a href="https://download.csdn.net/download/tcliuxq02/13458214" style="color:#ec7500;font-size:14px;"> 本文还有配套的精品资源,点击获取 </a> <img alt="menu-r.4af5f7ec.gif" src="https://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif" style="width:16px;margin-left:4px;vertical-align:text-bottom;cursor:text;"> </p>

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询