import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC", "Microsoft YaHei"]
plt.rcParams["axes.unicode_minus"] = False
params = {
'mu_A': 0.5,
'k_a': 0.05,
'b_A': 0.05,
'K_NH': 1.0,
'K_OA': 0.4,
'Y_A': 0.24,
'i_XB': 0.086,
'q_in': 100.0,
'q_out': 100.0,
'V': 1000.0,
'S_NH_in': 30.0
}
def calc_rates_nh(S_NH, env_vars, params):
"""
计算与氨氮相关的反应过程速率 (Process Rates)
env_vars: 包含 [S_O, S_ND, X_BA, X_BH] 的环境常量
"""
S_O = env_vars['S_O']
S_ND = env_vars['S_ND']
X_BA = env_vars['X_BA']
X_BH = env_vars['X_BH']
monod_NH = S_NH / (params['K_NH'] + S_NH)
monod_O = S_O / (params['K_OA'] + S_O)
rho3 = (params['mu_A'] / 24.0) * monod_NH * monod_O * X_BA
rho6 = (params['k_a'] / 24.0) * S_ND * X_BH
consumption = (params['i_XB'] + 1.0 / params['Y_A']) * rho3
generation = rho6
r_NH = -consumption + generation
return rho3, rho6, r_NH
def nh_dynamics(t, y, env_vars, params):
"""氨氮浓度随时间变化的微分方程"""
S_NH = y[0]
if S_NH < 0:
S_NH = 0
_, _, r_NH = calc_rates_nh(S_NH, env_vars, params)
transport = (params['q_in'] * params['S_NH_in'] - params['q_out'] * S_NH) / params['V']
dSNH_dt = transport + r_NH
return [dSNH_dt]
env_vars = {
'S_O': 2.0,
'S_ND': 5.0,
'X_BA': 100.0,
'X_BH': 2000.0
}
S_NH_init = 20.0
t_span = (0, 24)
t_eval = np.linspace(0, 24, 200)
sol = solve_ivp(
fun=lambda t, y: nh_dynamics(t, y, env_vars, params),
t_span=t_span,
y0=[S_NH_init],
t_eval=t_eval,
method='RK45'
)
plt.figure(figsize=(10, 6))
plt.plot(sol.t, sol.y[0], 'b-', linewidth=2, label='氨氮浓度 (S_NH)')
plt.axhline(y=params['S_NH_in'], color='r', linestyle='--', alpha=0.6, label='进水浓度 (30 mg/L)')
plt.xlabel('时间 (小时)', fontsize=12)
plt.ylabel('氨氮浓度 (mg N/L)', fontsize=12)
plt.title(f'好氧池氨氮动态模拟 (DO={env_vars["S_O"]} mg/L)', fontsize=14)
plt.grid(alpha=0.3)
plt.legend(fontsize=10)
final_conc = sol.y[0][-1]
plt.text(0.6, 0.5, f'最终平衡浓度:{final_conc:.2f} mg/L', transform=plt.gca().transAxes, fontsize=10, bbox=dict(facecolor='white', alpha=0.8, edgecolor='gray'))
plt.tight_layout()
plt.show()
rho3_init, rho6_init, r_NH_init = calc_rates_nh(S_NH_init, env_vars, params)
print("--- 初始时刻 (t=0) 速率分析 ---")
print(f"1. 硝化反应速率 (rho3): {rho3_init:.4f} mg VSS/(L·h)")
print(f" -> 导致氨氮消耗:{(params['i_XB'] + 1/params['Y_A']) * rho3_init:.4f} mg N/(L·h)")
print(f"2. 氨化反应速率 (rho6): {rho6_init:.4f} mg N/(L·h)")
print(f"3. 净生化反应速率 (r_NH): {r_NH_init:.4f} mg N/(L·h) (正值代表生成,负值代表消耗)")
print(f"4. 物理稀释/积累速率:{(params['q_in']*(params['S_NH_in']-S_NH_init))/params['V']:.4f} mg N/(L·h)")