Python 实现活性污泥模型 ASM2d 参数校准与优化
活性污泥模型(ASM2d)是污水处理工艺模拟的核心工具。在实际工程中,模型参数的准确性直接决定了仿真结果的可信度。本文基于 QSDSAN 库与 Optuna 框架,详细解析如何从零开始实现 ASM2d 的参数校准流程。我们将通过 Python 代码复现论文中的参数调优方法,涵盖进水浓度修正、灵敏度分析筛选、单目标优化及动态仿真等关键环节。
1. 进水浓度调整
在运行仿真前,必须确保输入的水质数据与模型内部计算一致。由于 ASM2d 组分复杂,直接输入的 COD/TN/TP 往往无法直接映射到具体的组分浓度。我们需要通过迭代调整 WasteStream 的浓度输入,使得计算得到的实际值与目标值在小数位上保持一致。
核心逻辑如下:
- 设定初始调整值为目标值。
- 构建 WasteStream 并计算实际 COD/TN/TP。
- 比较计算值与目标值的差异。
- 若未收敛,则根据误差更新调整值,继续循环。
import qsdsan as qs
from qsdsan import WasteStream
def Adjusting_influent_concentration(first_inflow_value, input_COD_value, input_TN_value, input_TP_value):
"""
目的:根据用户输入的目标进水 COD/TN/TP 值,迭代调整 WasteStream 的浓度输入,
使得通过 WasteStream 计算得到的实际 COD/TN/TP 与目标值一致。
"""
adjusting_COD_value = input_COD_value
adjusting_TN_value = input_TN_value
adjusting_TP_value = input_TP_value
def simulate_influent_internal(first_inflow_value, adjusting_COD_value, adjusting_TN_value, adjusting_TP_value):
Q_inf = first_inflow_value
Temp = 273.15 + 20
influent = WasteStream('influent', T=Temp)
default_inf_kwargs = {
'concentrations': {
'S_I': 0, 'X_I': 0, 'S_F': 0, 'S_A': 0,
'X_S': adjusting_COD_value,
'S_NH4': 0, 'S_N2': 0, 'S_NO3': adjusting_TN_value,
'S_PO4': adjusting_TP_value,
: , : , : ,
: , : , : * ,
},
: (, ),
}
influent.set_flow_by_concentration(Q_inf, **default_inf_kwargs)
(influent.COD, ), (influent.TN, ), (influent.TP, )
iteration_count =
:
iteration_count +=
simulate_influent_COD, simulate_influent_TN, simulate_influent_TP = simulate_influent_internal(
first_inflow_value, adjusting_COD_value, adjusting_TN_value, adjusting_TP_value)
((simulate_influent_COD, ) == (input_COD_value, )
(simulate_influent_TN, ) == (input_TN_value, )
(simulate_influent_TP, ) == (input_TP_value, )):
difference_COD = input_COD_value - simulate_influent_COD
adjusting_COD_value += difference_COD
difference_TN = input_TN_value - simulate_influent_TN
adjusting_TN_value += difference_TN
difference_TP = input_TP_value - simulate_influent_TP
adjusting_TP_value += difference_TP
iteration_count > :
()
adjusting_COD_value, adjusting_TN_value, adjusting_TP_value


