Python 实现活性污泥模型 ASM2d 参数校准与优化
本文基于论文《Calibrating activated sludge models through hyperparameter optimization: a new framework for wastewater treatment plant simulation》,使用 Python 完整复现并简化了 ASM2d 模型的参数校准流程。原文涉及多种参数选择(OSA, TSA, FP)和调参方法(OT, MO_OT, 传统随机搜索),为便于理解和实战,本教程聚焦于 OSA 参数选择 结合 Optuna 单目标优化 的实现方案。
我们将通过以下核心模块逐步构建整个系统:
- 进水浓度调整逻辑
- 基于灵敏度的参数选择 (OSA)
- 单目标优化 (Optuna)
- 仿真函数构建
- 主流程整合
1. 进水浓度调整
在污水处理模型中,直接输入的 COD/TN/TP 往往无法精确对应模型内部组分的计算值。我们需要一个迭代过程,根据用户输入的目标值,反向调整 WasteStream 的组分浓度,使得模型计算出的实际出水指标与目标一致。
核心逻辑
该函数接收进水流量和目标污染物浓度,通过循环迭代调整可降解有机物 (X_S)、硝酸盐 (S_NO3) 和磷酸盐 (S_PO4) 的初始设定值,直到计算误差收敛到小数点后三位。
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 # 温度设置为 20°C
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, # 可降解有机物近似表示为 X_S -> COD
: , : ,
: adjusting_TN_value,
: 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


