🌞欢迎来到机器学习的世界 🌈博客主页:卿云阁
💌欢迎关注🎉点赞👍收藏⭐️留言📝
🌟本文由卿云阁原创!
🌠本阶段属于练气阶段,希望各位仙友顺利完成突破
📆首发时间:🌹2021年3月12日🌹
✉️希望可以和大家一起完成进阶之路!
🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢!
目录
📜第一部分:工艺认知篇
💡了解污水厂大致的运行
💡了解 AAO 工艺的大致流程原理
📜第二部分:ASM1 理论篇
💡ASM 1模型的状态变量(13个)
💡ASM 1模型的生化动力学反应(8个)
💡化学计量常数(5个)
💡动力学参数(15个)
💡反应过程图解
反应速率
各组分转化速率
📜第三部分:单个池子单个组分的手动计算和代码实现

📜第一部分:工艺认知篇
💡了解污水厂大致的运行
需要建立“进水 -> 物理处理 -> 生物处理 -> 深度处理 -> 出水”的宏观概念。
生物池(BiologicalTank)是核心,也是我们模拟的对象。
关键流向: 进水 (Influent)格栅 沉砂池 初沉池 生物反应池 二沉池 消毒/排放。
伴随流向: 污泥回流 (RAS) 和 剩余污泥排放 (WAS)。

💡了解 AAO 工艺的大致流程原理
AAO (Anaerobic-Anoxic-Oxic) 是脱氮除磷的经典工艺。
三个区的环境与功能:
厌氧区 (Anaerobic)(DO=0): 释磷(PAOs释放磷,吸收VFA)。
聚磷菌释磷,易降解有机物 (VFA)并将其转化为体内的储能物质 PHB(类似人类存脂肪)【大分
子有机物变成小分子有机物】
宏观现象: 这一步,水里的磷浓度不降反升(细菌把体内的磷吐出来了),COD 开始下降。
如果你发现厌氧池出水磷浓度比进水还高,说明释磷效果好,是好事!
缺氧区 (Anoxic)(DO<0.5): 反硝化脱氮(将硝酸盐还原为氮气)。
反硝化菌吃掉水里的有机物 (COD),扒掉硝酸盐里的氧,把剩下的氮元素变成氮气。(这一步
需要外加C源)
好氧区 (Oxic)(DO>2.0): 硝化(氨氮转硝酸盐)、吸磷、去除BOD。
硝化菌 (自养菌)从氨变成了硝酸盐,普通异养菌会把小分子的有机物变成CO2和水,聚磷菌
(PAOs)超量吸收磷
两条关键回流线:
内回流 (Internal Recycle): 好氧末端 缺氧前端(带回硝酸盐)。
外回流 (Sludge Return): 二沉池 厌氧前端(补充活性污泥)。

建模视角的AAO: 它就是三个串联的反应器(CSTR),每个反应器有不同的溶解氧(DO)设
定。
控制参数
| 参数名称 | 专业术语 | 作用位置 | AI 调节逻辑 (Objective Function) |
| 溶解氧 | DO (Dissolved Oxygen) | 好氧池 |
这是最关键的能耗控制点。
❌ 过高 (>3.0): 浪费电;还会把氧气带回缺氧池,破坏反硝化环境。
❌ 过低 (<1.0): 硝化菌停止工作,氨氮超标;易诱发污泥膨胀。
✅ 目标: 维持在 2.0 mg/L 左右。 |
| 内回流比 | IR (Internal Recycle Ratio) | 好氧 缺氧 |
控制脱氮效率。
通常是进水流量的 200%-300%。
❌ 过小: 硝酸盐排走了,脱氮不彻底。
❌ 过大: 带来太多 DO,破坏缺氧环境,且浪费泵的电费。 |
| 外回流比 | R (Return Sludge Ratio) | 二沉 厌氧 |
控制系统泥量平衡。
通常是进水流量的 50%-100%。
❌ 过小: 生化池细菌不够用。
❌ 过大: 稀释了进水浓度,且把硝酸盐带回厌氧池,导致厌氧释磷失败(反硝化菌抢了聚磷菌的饭)。 |
| 剩余污泥排放 | Q_was (Waste Sludge) | 二沉池 |
控制污泥龄 (SRT)。
通过排泥,把吸饱了磷的细菌排走,这是除磷的唯一出口。
❌ 排多了: 硝化菌长得慢,会被洗出系统(氨氮超标)。
❌ 排少了: 污泥老化,活性差,水质浑浊。 |
生化池(厌氧+缺氧+好氧)并没有把污染物真的从水里“拿出来”,而是把它们“转移”到了细菌
体内。
📜第二部分:ASM1 理论篇
如果说 AAO 工艺是污水处理厂的“硬件架构”,那么 ASM1 模型就是运行在其中的“软件内核”。
它用一组微分方程 (ODEs) 精确描述了:什么细菌 (Who),在什么环境 (Where),以多快的速度
(How Fast),吃掉了多少污染物 (How Much)。
💡ASM 1模型的状态变量(13个)
| 有机物相关(食物 / 剩饭) | Si | 溶解性惰性有机物浓度 | 溶于水的 “不可消化小分子垃圾”,细菌吃不动,不参与反应,最终随出水或污泥排出 |
| Xi | 颗粒惰性有机物浓度 | 不溶于水的 “不可消化大块垃圾”(如泥沙、纤维),细菌无法分解,最终沉降到污泥中排出 | |
| Ss | 溶解性可生化降解基质浓度 | 溶于水的 “细菌美食”(如乙酸、葡萄糖),是异养菌分解 COD 的主要口粮,好氧 / 缺氧池会被大量消耗 | |
| Xs | 颗粒性可生化降解基质浓度 | 颗粒状 “带包装的食物”(如淀粉、蛋白质颗粒),需先被水解成小分子(Ss),才能被细菌消化 | |
| XP | 微生物衰减产生的污泥颗粒浓度 | 细菌老化、死亡后的 “尸体”,惰性强不参与反应,最终随剩余污泥排出 | |
| 细菌本身(干活的工人) | XBH | 活性异养菌生物污泥浓度 | 分解 COD、参与脱氮的 “主力工人”(含反硝化菌),好氧用氧气、缺氧用硝酸盐当燃料,吃有机物存活 |
| XBA | 活性自养菌生物污泥浓度 | 处理氨氮的 “专业工人”(硝化细菌),仅好氧环境干活,以氨氮为食,将其转化为硝酸盐 | |
| 氮相关(脱氮原料 / 产物) | SNH | 氨氮浓度(NH3 + NH4+) | 污水中含氮污染物(如尿液、粪便中的氮),自养菌的专属食物,是水体富营养化的元凶之一 |
| SNO | 硝酸盐氮与亚硝酸盐氮浓度 | 自养菌的 “产物”、反硝化菌的 “替代燃料”,最终被反硝化菌转化为氮气排到空气中 | |
| SND | 降解有机氮浓度溶解性可生物 | 溶于水的 “隐藏氮源”(如氨基酸),会被细菌分解释放氨氮,再参与硝化 – 反硝化循环 | |
| XND | 颗粒性可生物降解有机氮浓度 | 颗粒状的 “打包氮源”(如蛋白质颗粒中的氮),需先拆分成小分子(SND),再释放氨氮参与反应 | |
| 反应环境条件 | So | 溶解氧浓度(单位:-COD) | 水里的氧气含量,好氧池需充足(供异养菌、自养菌干活),缺氧池需极低(避免抑制反硝化) |
| SALK | 碱度(摩尔单位) | 水里的 “缓冲剂”,稳定 pH 值,避免硝化反应导致水变酸杀死细菌 |
💡ASM 1模型的生化动力学反应(8个)
| 细菌增长反应 | 异养菌好氧增长 | 活性异养菌(XBH) | 好氧池(充足溶解氧 So) | 异养菌用氧气分解溶解性有机物(Ss),降解 COD 的同时繁殖(XBH 增多),产生少量细菌尸体(XP) |
| 异养菌缺氧增长 | 活性异养菌(XBH) | 缺氧池(无 So,有硝酸盐 SNO) | 异养菌用硝酸盐替代氧气分解 Ss,降解 COD、繁殖(XBH 增多),同时将 SNO 转化为氮气 | |
| 自养菌的好氧增长 | 活性自养菌(XBA) | 好氧池(充足 So + 碱度 SALK) | 自养菌分解氨氮(SNH),转化为硝酸盐(SNO),同时繁殖(XBA 增多),消耗碱度、产生 XP | |
| 细菌衰亡反应 | 异养菌的衰亡 | 活性异养菌(XBH) | 所有池体(速率不同) | 异养菌因食物不足、环境不适老化死亡,转化为 XP,少量分解为溶解性惰性有机物(Si) |
| 自养菌的衰亡 | 活性自养菌(XBA) | 主要在好氧池 | 自养菌因氨氮 / 碱度不足老化死亡,转化为 XP,少量分解为 Si | |
| 预处理反应 | 溶解性有机氮的氨化反应 | 活性异养菌(XBH) | 所有池体(好氧速率更快) | 异养菌分解溶解性有机氮(SND),释放氨氮(SNH) |
| 有机质的 “水解” 反应 | 活性异养菌(XBH) | 主要在厌氧 / 缺氧池 | 异养菌分泌酶,将颗粒性有机物(Xs)拆解为小分子溶解性有机物(Ss) | |
| 有机氮的 “水解” 反应 | 活性异养菌(XBH) | 主要在厌氧 / 缺氧池 | 异养菌分泌酶,将颗粒性有机氮(XND)拆解为小分子溶解性有机氮(SND) |
💡化学计量常数(5个)
化学计量常数” 理解成 反应里各物质的‘定量配方’—— 就像做饭时 “1 份米配 2 份水” 的比例,
它规定了生物反应中 “反应物消耗多少、产物生成多少” 的定量关系。 举个例子: 异养菌吃 1g COD(反应物),能长多少 g 生物量(产物)?这个比例就是化学计量常
| YH(异养菌产率) | 衡量异养菌 “吃多少 COD 长多少肉” 的效率。比如 Y_H 高,说明异养菌吃一点 COD 就能长很多生物量,处理 COD 的同时污泥也多;Y_H 低则相反。 |
| YA(自养菌产率) | 衡量自养菌 “吃多少氨氮长多少肉” 的效率。Y_A 高,自养菌吃少量氨氮就长很多,硝化氨氮时污泥产量大;Y_A 低则硝化相同氨氮产生的污泥少。 |
| fP(颗粒性衰减产物比例) | 表示细菌死了之后,有多少比例变成 “惰性颗粒污泥”。f_P 高,细菌衰减后产生的惰性污泥多,剩余污泥总量大;f_P 低则惰性污泥少。 |
| iXB(生物量中 N 的比例) | 说明细菌体内 “氮占自身重量的多少”。比如 i_XB 高,细菌每长一点生物量,消耗的氮多,同时硝化等反应消耗的碱度也多(因为氮代谢和碱度相关)。 |
| iXP(生物量产物 COD 中 N 的比例) | 表示细菌死后变成的污泥里,“氮在污泥 COD 里占多少”。i_XP 高,说明污泥里氮含量高,这些氮如果没处理好,可能影响出水总氮。 |
💡动力学参数(15个)
“动力学” 研究的是 “反应速度规律”,这些参数就是用来量化微生物反应 “有多快” 的 —— 比如细
菌繁殖多快、底物降解多快、环境变化对反应速度的影响有多大。就像给生物反应装了个 “速度仪
表盘”,所以叫 “动力学参数”。
| μH,KS,KO,H,KNO,bH | 描述异养菌的生长和衰减:- μH:异养菌 “繁殖速度的上限”;- KS:异养菌吃底物的 “半饱和浓度”(底物浓度达到这个值,生长速度减半);- KO,H:异养菌用好氧呼吸的 “氧气半饱和浓度”;- KNO:异养菌缺氧呼吸的 “硝酸盐半饱和浓度”;- bH:异养菌 “自然死亡的速度”。 |
| μA,KNH,KO,A,bA | 描述自养菌(硝化菌)的生长和衰减:- μA:自养菌 “繁殖速度的上限”;- KNH:自养菌吃氨氮的 “半饱和浓度”;- KO,A:自养菌用好氧呼吸的 “氧气半饱和浓度”;- bA:自养菌 “自然死亡的速度”。 |
| ηg | 异养菌缺氧生长的 “效率修正系数”:缺氧时异养菌用硝酸盐呼吸的效率比用好氧呼吸低,这个系数用来调整缺氧生长的速度。 |
| ka | 氨化反应的 “速度常数”:溶解性有机氮被异养菌分解成氨氮的 “快慢程度”。 |
| kh,KX | 水解反应的 “速度常数和半饱和系数”:- kh:颗粒性有机物被分解成溶解性有机物的 “速度”;- KX:水解反应的 “半饱和浓度”(颗粒性有机物浓度达到这个值,水解速度减半)。 |
| ηh | 缺氧水解的 “效率修正系数”:缺氧时颗粒性有机物水解的效率比好氧时低,这个系数用来调整缺氧水解的速度。 |
| 异养菌生长与衰减 | μH | 异养菌 “繁殖速度的天花板”,数值越大,异养菌生娃越快 |
| KS | 异养菌吃底物的 “半饱点”,底物浓度到这,生长速度减半 | |
| KO,H | 异养菌用好氧呼吸的 “氧气半饱点”,氧气浓度到这,好氧生长速度减半 | |
| KNO | 异养菌用硝酸盐呼吸的 “硝酸盐半饱点”,硝酸盐浓度到这,缺氧生长速度减半 | |
| bH | 异养菌 “自然死亡的速度”,数值越大,死得越快 | |
| 自养菌生长与衰减 | μA | 自养菌(硝化菌)“繁殖速度的天花板”,数值越大,硝化菌生娃越快 |
| KNH | 自养菌吃氨氮的 “半饱点”,氨氮浓度到这,硝化速度减半 | |
| KO,A | 自养菌用好氧呼吸的 “氧气半饱点”,氧气浓度到这,硝化速度减半 | |
| bA | 自养菌 “自然死亡的速度”,数值越大,死得越快 | |
| 缺氧生长修正 | ηg | 异养菌缺氧时 “干活效率的折扣”,数值小于 1,说明缺氧生长比好氧慢 |
| 氨化反应 | ka | 溶解性有机氮 “变成氨氮的速度”,数值越大,氨化越快 |
| 水解反应 | kh | 颗粒有机物 “变成溶解性有机物的速度”,数值越大,水解越快 |
| KX | 水解反应的 “半饱点”,颗粒有机物浓度到这,水解速度减半 | |
| ηh | 缺氧时水解 “干活效率的折扣”,数值小于 1,说明缺氧水解比好氧慢 |
💡反应过程图解

反应速率

异养菌的好氧生长

异养菌在好氧环境下,根据溶解性底物和溶解氧的浓度,按照 “底物越多、氧气越充足,生长
速度越快” 的规律繁殖,公式里的μ H是繁殖速度上限,K S和K O,H是半饱和浓度(到这个浓度时
生长速度减半),最后乘以异养菌浓度(X B,H)得到生长速率。
异养菌的缺氧生长

异养菌在缺氧环境下,用硝酸盐(S NO)代替氧气,同样根据底物(S S)浓度繁殖,但此时
氧气浓度(S O)越低、硝酸盐浓度越高,生长速度越快,η g是缺氧生长的效率修正系数,最后乘
以异养菌浓度得到生长速率。
自养菌的好氧生长
自养菌(硝化菌)在好氧环境下,根据氨氮(S NH)和溶解氧(S O)的浓度繁殖, μ H是繁殖速度上限,K NH和K O,A是半饱和浓度,乘以自养菌浓度(X B,A)得到生长速率。

异养菌的衰减

异养菌自然死亡的速率,由衰减系数(b H)和异养菌浓度(X B,H)决定,衰减系数越大、菌浓度越高,死亡速度越快。
自养菌的衰减

自养菌自然死亡的速率,由衰减系数和自养菌浓度决定,逻辑同异养菌衰减。
溶解性有机氮氨化

溶解性有机氮(S ND)被异养菌分解成氨氮的速率,由氨化速率常数(k a)、有机氮浓度和异养
菌浓度决定,速率常数越大、有机氮和菌浓度越高,氨化越快。
慢速可生物降解有机物的水解

颗粒性有机物(X S)被分解成溶解性有机物的速率,受底物浓度(X S与X B,H的比值)、溶解氧
(S O )、硝酸盐(S NO)浓度影响,好氧时水解快,缺氧时需乘以修正系数(η h),最后乘以
异养菌浓度得到水解速率。
颗粒性可生物降解有机氮的水解

颗粒性有机氮(X ND)的水解速率,是慢速有机物水解速率(ρ 7)乘以有机氮与有机物的比例
(X ND/X S),逻辑是有机氮水解规律和有机物水解一致,只是比例不同。
各组分转化速率

S I(溶解性惰性有机物):不变,因为细菌不吃它。 S S(溶解性可生化底物):异养菌好氧、缺氧吃的量,减去水解生成的量,就是它的变化。 X I(颗粒惰性有机物):不变,细菌也不吃它。 X S(颗粒可生化底物):异养菌、自养菌死了产生的颗粒底物,减去水解成溶解性底物的量,就是它的变化。 X BH(活性异养菌):异养菌好氧、缺氧繁殖的量,减去自己死亡的量,就是它的变化。 X BA(活性自养菌):自养菌繁殖的量,减去自己死亡的量,就是它的变化。 X P(微生物衰减污泥颗粒):异养菌、自养菌死了变成的惰性污泥,死得越多它越多。 S O(溶解氧):异养菌好氧、自养菌硝化消耗的氧气,消耗越多它越少。 S NO(硝酸盐氮):异养菌缺氧消耗的量,减去自养菌硝化生成的量,就是它的变化。 S NH(氨氮):异养菌、自养菌消耗的量,加上有机氮氨化生成的量,就是它的变化。 S ND(溶解性可生物降解有机氮):氨化消耗的量,减去有机氮水解生成的量,就是它的变化。 X ND(颗粒性可生物降解有机氮):细菌死了产生的颗粒有机氮,减去水解成溶解性有机氮的量,就是它的变化。 S ALK(碱度):异养菌、自养菌反应消耗或生成的碱度,加上氨化生成的碱度,就是它的变化。
生化反应池模型的建立

| SI(溶解性惰性有机物) | 变化速率 = (进水带进来的量 – 出水带走的量)÷ 反应器体积 + 反应中自身的变化(r1,这里r1=0,所以只看进出水) |
| SS(溶解性可生化底物) | 变化速率 = (进水带进来的量 – 出水带走的量)÷ 反应器体积 + 反应中被异养菌吃、水解生成的变化(r2) |
| XI(颗粒惰性有机物) | 变化速率 = (进水带进来的量 – 出水带走的量)÷ 反应器体积 + 反应中自身的变化(r3=0,只看进出水) |
| XS(颗粒可生化底物) | 变化速率 = (进水带进来的量 – 出水带走的量)÷ 反应器体积 + 细菌衰减生成、水解消耗的变化(r4) |
| XBH(活性异养菌) | 变化速率 = (进水带进来的量 – 出水带走的量)÷ 反应器体积 + 异养菌生长、衰减的变化(r5) |
| XBA(活性自养菌) | 变化速率 = (进水带进来的量 – 出水带走的量)÷ 反应器体积 + 自养菌生长、衰减的变化(r6) |
| XP(微生物衰减污泥颗粒) | 变化速率 = (进水带进来的量 – 出水带走的量)÷ 反应器体积 + 细菌衰减生成的变化(r7) |
| SO(溶解氧) | 变化速率 = (进水带进来的量 – 出水带走的量)÷ 反应器体积 + 曝气溶解的氧(KLa(SO∗−SO)) + 反应中消耗的变化(r8) |
| SNO(硝酸盐氮) | 变化速率 = (进水带进来的量 – 出水带走的量)÷ 反应器体积 + 反硝化消耗、硝化生成的变化(r9) |
| SNH(氨氮) | 变化速率 = (进水带进来的量 – 出水带走的量)÷ 反应器体积 + 硝化消耗、氨化生成的变化(r10) |
| SND(溶解性可生物降解有机氮) | 变化速率 = (进水带进来的量 – 出水带走的量)÷ 反应器体积 + 氨化消耗、水解生成的变化(r11) |
| XND(颗粒性可生物降解有机氮) | 变化速率 = (进水带进来的量 – 出水带走的量)÷ 反应器体积 + 细菌衰减生成、水解消耗的变化(r12) |
| SALK(碱度) | 变化速率 = (进水带进来的量 – 出水带走的量)÷ 反应器体积 + 各反应消耗 / 生成的变化(r13) |
📜第三部分:单个池子单个组分的手动计算和代码实现
以氨氮为例:
假设我们有一个曝气池(CSTR完全混合反应器),我们需要计算当前时刻氨氮的反应速率和浓度
变化。

水质组分(状态变量)当前浓度:

动力学参数 (ASM1 典型值):

第一步:计算动力学过程速率



第二步:计算氨氮的反应速率

第三步:计算质量平衡


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
# ————————–
# 1. 参数设置(ASM1标准,20℃)
# ————————–
params = {
# — 动力学参数 (单位: /d) —
'mu_A': 0.5, # 自养菌最大比生长速率 (1/d)
'k_a': 0.05, # 氨化速率 (m³/(g COD·d))
'b_A': 0.05, # 自养菌衰减系数 (1/d)
# — 半饱和常数 (单位: mg/L) —
'K_NH': 1.0, # 氨氮半饱和常数
'K_OA': 0.4, # 自养菌氧半饱和常数
# — 化学计量参数 —
'Y_A': 0.24, # 自养菌产率 (g VSS/g N)
'i_XB': 0.086, # 生物体含氮量 (g N/g VSS)
# — 水力与环境参数 —
'q_in': 100.0, # 进水流量 (m³/h)
'q_out': 100.0, # 出水流量 (m³/h)
'V': 1000.0, # 反应池容积 (m³)
# — 进水条件 —
'S_NH_in': 30.0 # 进水氨氮浓度 (mg N/L)
}
# ————————–
# 2. 辅助函数:计算反应速率
# ————————–
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'] # 异养菌 (用于氨化)
# — j=3: 自养菌好氧生长 (硝化作用) —
# 公式: rho3 = mu_A * (S_NH/(K_NH+S_NH)) * (S_O/(K_OA+S_O)) * X_BA
# 注意:params['mu_A'] 是 /d,需除以 24 转换为 /h
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
# — j=6: 溶解性有机氮氨化 —
# 公式: rho6 = k_a * S_ND * X_BH
rho6 = (params['k_a'] / 24.0) * S_ND * X_BH
# — 计算氨氮的总反应速率 r_NH (mg N/(L·h)) —
# r_NH = -消耗 + 生成
# 消耗 = (i_XB + 1/Y_A) * rho3 (细菌组成氮 + 氧化产能消耗的氮)
# 生成 = rho6 (有机氮水解)
consumption = (params['i_XB'] + 1.0 / params['Y_A']) * rho3
generation = rho6
r_NH = -consumption + generation
return rho3, rho6, r_NH
# ————————–
# 3. 氨氮动态模型
# ————————–
def nh_dynamics(t, y, env_vars, params):
"""氨氮浓度随时间变化的微分方程"""
S_NH = y[0]
# 边界保护:浓度不能为负
if S_NH < 0: S_NH = 0
# 1. 计算生化反应项 (r_NH)
_, _, r_NH = calc_rates_nh(S_NH, env_vars, params)
# 2. 计算物理输运项 (Transport)
# 公式: (Qin * Sin – Qout * S) / V
transport = (params['q_in'] * params['S_NH_in'] – params['q_out'] * S_NH) / params['V']
# 3. 总变化率 dS_NH/dt
dSNH_dt = transport + r_NH
return [dSNH_dt]
# ————————–
# 4. 模拟设置与运行
# ————————–
# 设定环境常量 (假设在短时间内相对稳定)
env_vars = {
'S_O': 2.0, # 溶解氧 (mg/L)
'S_ND': 5.0, # 有机氮 (mg/L)
'X_BA': 100.0, # 自养菌浓度 (mg/L) – 恒定
'X_BH': 2000.0 # 异养菌浓度 (mg/L) – 恒定
}
# 初始状态
S_NH_init = 20.0 # 初始氨氮 (mg/L)
# 模拟时间 (模拟 24 小时)
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'
)
# ————————–
# 5. 结果可视化
# ————————–
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()
# ————————–
# 6. 关键速率输出 (t=0时刻)
# ————————–
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)")





