You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

圆柱坐标系填充床反应器传热传质PDE离散与求解咨询

带吸热反应的填充床反应器二维模型问题解决方案

1. 能量守恒方程离散时反应项的处理

必须将含T[i,j]的反应项移至左侧作为未知项的一部分,原因如下:

  • 吸热反应的反应速率是温度T的非线性函数(通常随温度升高加快),能量方程中的反应热项与反应速率直接耦合,属于隐式非线性项。
  • 若将反应项留在右侧作为已知源项,相当于采用显式格式,会导致迭代稳定性极差(稳态问题中显式迭代极易发散),无法准确捕捉温度与反应速率的耦合反馈。
  • 移至左侧后,可将其与T[i,j]的主系数合并,形成适用于隐式求解的线性化方程组(每次迭代固定反应速率的线性近似,逐步更新),这是稳态耦合问题的标准处理方式。

2. Python中Neumann边界条件的设置

针对圆柱坐标系下的两类Neumann边界,采用镜像虚拟节点法推导离散格式,具体实现如下:

(1)中心对称边界(r=0处,∂T/∂r=0、∂C/∂r=0)

利用对称性构造虚拟节点i=-1,令其温度/浓度等于相邻实节点i=1的数值,代入径向差分格式化简:

import numpy as np

Nr, Nz = 20, 50  # 径向、轴向节点数
R = 0.1  # 反应器半径
dr = R / (Nr - 1)  # 径向步长

# 以能量方程径向项处理为例(稀疏矩阵A存储离散系数)
A = lil_matrix((Nr*Nz, Nr*Nz))
for j in range(Nz):
    row = 0 * Nz + j
    # 基于虚拟节点推导的中心节点系数
    A[row, row] += 1 / dr**2
    A[row, 1*Nz + j] -= 2 / dr**2
    A[row, 2*Nz + j] += 1 / dr**2

(2)出口无梯度边界(z=L处,∂T/∂z=0、∂C/∂z=0)

构造虚拟节点j=Nz,令其数值等于j=Nz-2的数值,代入轴向差分格式:

L = 1.0  # 反应器轴向长度
dz = L / (Nz - 1)  # 轴向步长

for i in range(Nr):
    row = i * Nz + (Nz - 1)
    # 出口节点的轴向差分系数调整
    A[row, row] += 1 / dz**2
    A[row, i*Nz + (Nz - 2)] -= 2 / dz**2
    A[row, i*Nz + (Nz - 3)] += 1 / dz**2

注:若追求简化,也可直接令T[:, Nz-1] = T[:, Nz-2],但这种方式精度低于二阶差分的虚拟节点法,仅适用于粗网格场景。

3. 耦合方程的迭代求解逻辑与代码修正

稳态耦合问题的核心是处理质量守恒、能量守恒与反应速率的相互反馈,推荐采用带松弛因子的顺序迭代法,步骤及代码如下:

标准迭代流程

  1. 初始化场变量:以进口浓度C_inlet、进口温度T_inlet作为初始场。
  2. 计算反应速率:基于当前C和T,调用自定义反应速率函数r = f(C, T)(注意吸热反应的反应热符号为负,即从体系吸收热量)。
  3. 求解质量守恒方程:固定r,求解离散后的线性方程组,得到新浓度场C_new。
  4. 求解能量守恒方程:固定r和C_new,求解离散后的线性方程组,得到新温度场T_new。
  5. 残差判断与场更新:计算C_new与C、T_new与T的最大残差,若残差小于阈值则收敛;否则加入松弛因子更新场变量,重复迭代。

Python核心代码示例

import numpy as np
from scipy.sparse.linalg import spsolve
from scipy.sparse import lil_matrix

# 自定义吸热反应速率函数
def reaction_rate(C, T):
    k0 = 1e8  # 指前因子
    Ea = 8e4  # 活化能
    Rg = 8.314  # 气体常数
    Q = -2e5  # 吸热反应热(负号表示从体系吸热)
    r = k0 * C * np.exp(-Ea / (Rg * T))
    return r, Q

# 求解质量守恒方程
def solve_mass(C, r, dr, dz, Nr, Nz, D):
    A = lil_matrix((Nr*Nz, Nr*Nz))
    b = np.zeros(Nr*Nz)
    # 内部节点离散(圆柱坐标系质量守恒)
    for i in range(1, Nr-1):
        for j in range(1, Nz-1):
            row = i*Nz + j
            A[row, row] = D*(1/(dr**2) + 1/(i*dr*dr) + 1/(dz**2)) + r[i,j]
            A[row, (i-1)*Nz + j] = -D*(1/(2*dr**2) - 1/(2*i*dr*dr))
            A[row, (i+1)*Nz + j] = -D*(1/(2*dr**2) + 1/(2*i*dr*dr))
            A[row, i*Nz + j-1] = -D/(dz**2)
            A[row, i*Nz + j+1] = -D/(dz**2)
    # 补充进口、壁面等边界条件(此处省略)
    C_new = spsolve(A.tocsr(), b)
    return C_new.reshape(Nr, Nz)

# 求解能量守恒方程(反应项移至左侧)
def solve_energy(T, r, Q, dr, dz, Nr, Nz, k):
    A = lil_matrix((Nr*Nz, Nr*Nz))
    b = np.zeros(Nr*Nz)
    # 内部节点离散(圆柱坐标系能量守恒)
    for i in range(1, Nr-1):
        for j in range(1, Nz-1):
            row = i*Nz + j
            A[row, row] = k*(1/(dr**2) + 1/(i*dr*dr) + 1/(dz**2)) - Q*r[i,j]
            A[row, (i-1)*Nz + j] = -k*(1/(2*dr**2) - 1/(2*i*dr*dr))
            A[row, (i+1)*Nz + j] = -k*(1/(2*dr**2) + 1/(2*i*dr*dr))
            A[row, i*Nz + j-1] = -k/(dz**2)
            A[row, i*Nz + j+1] = -k/(dz**2)
    # 补充中心对称、出口无梯度等边界条件(此处省略)
    T_new = spsolve(A.tocsr(), b)
    return T_new.reshape(Nr, Nz)

# 主迭代逻辑
def main():
    R, L = 0.1, 1.0
    Nr, Nz = 20, 50
    dr, dz = R/(Nr-1), L/(Nz-1)
    C_inlet, T_inlet = 1.0, 300.0
    D, k = 1e-5, 0.2
    tol = 1e-6
    alpha = 0.7  # 松弛因子,防止迭代振荡
    
    # 初始化场
    C = np.ones((Nr, Nz)) * C_inlet
    T = np.ones((Nr, Nz)) * T_inlet
    residual = 1e6
    
    while residual > tol:
        r, Q = reaction_rate(C, T)
        C_new = solve_mass(C, r, dr, dz, Nr, Nz, D)
        T_new = solve_energy(T, r, Q, dr, dz, Nr, Nz, k)
        
        # 计算残差
        res_C = np.max(np.abs(C_new - C))
        res_T = np.max(np.abs(T_new - T))
        residual = max(res_C, res_T)
        
        # 带松弛更新场
        C = alpha * C_new + (1 - alpha) * C
        T = alpha * T_new + (1 - alpha) * T
        print(f"当前残差: {residual:.8f}")
    
    np.save("浓度场.npy", C)
    np.save("温度场.npy", T)

if __name__ == "__main__":
    main()

常见错误修正点

  • 圆柱坐标系权重遗漏:径向差分必须考虑1/r和d/dr(r d/dr)的权重,否则径向项离散完全错误。
  • 反应热符号错误:吸热反应的反应热Q为负,若符号反了会导致结果完全偏离物理规律。
  • 无松弛因子:耦合迭代时直接替换场变量易导致振荡发散,加入α∈(0.5,0.9)的松弛因子可大幅提升收敛性。
  • 边界条件错误:中心对称和出口无梯度的差分格式需严格推导,避免直接赋值导致的精度损失或数值不稳定。

内容的提问来源于stack exchange,提问作者Taylor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 13:47:03