|
|
@@ -0,0 +1,61 @@
|
|
|
+import torch
|
|
|
+import numpy as np
|
|
|
+
|
|
|
+# ===== 膜阻力上升模型 =====
|
|
|
+class ResistanceIncreaseModel(torch.nn.Module):
|
|
|
+ def __init__(self):
|
|
|
+ super().__init__()
|
|
|
+
|
|
|
+ def forward(self, p, L_s):
|
|
|
+ """
|
|
|
+ 计算膜阻力上升量 ΔR
|
|
|
+ """
|
|
|
+ A = 128 * 40.0
|
|
|
+ J = p.q_UF / A / 3600
|
|
|
+ # 膜阻力上升模型(已缩放)
|
|
|
+ dR = p.nuK * J * L_s
|
|
|
+ return float(dR)
|
|
|
+
|
|
|
+
|
|
|
+# ===== 膜阻力下降模型 =====
|
|
|
+class ResistanceDecreaseModel(torch.nn.Module):
|
|
|
+ def __init__(self):
|
|
|
+ super().__init__()
|
|
|
+
|
|
|
+ def forward(self, p, R0, R_end, L_h_start, L_h_next_start, t_bw_s):
|
|
|
+ """
|
|
|
+ 计算物理反冲洗污染去除比例(受反洗时间影响),最大可去除的可逆膜阻力(受过滤时间影响)
|
|
|
+ """
|
|
|
+
|
|
|
+ # 计算单次不可逆膜阻力(线性依赖于进水时间)
|
|
|
+ # 周期起点和下次起点的理论阻力
|
|
|
+ R_start = R0 + p.slope * (L_h_start ** p.power)
|
|
|
+ R_next_start = R0 + p.slope * (L_h_next_start ** p.power)
|
|
|
+
|
|
|
+ # 不可逆污染(反洗后残余增加量)
|
|
|
+ irreversible_R = max(R_next_start - R_start, 0.0)
|
|
|
+
|
|
|
+ # 本周期的总污染增长量
|
|
|
+ total_increase = max(R_end - R_start, 0.0)
|
|
|
+
|
|
|
+ # 可逆污染量 = 本周期总增长 - 不可逆残留
|
|
|
+ reversible_R = max(total_increase - irreversible_R, 0.0)
|
|
|
+
|
|
|
+ # 时间因子:反洗时间越长,效果越充分
|
|
|
+ time_gain = 1.0 - np.exp(- (t_bw_s / p.tau_bw_s))
|
|
|
+
|
|
|
+ # 实际去除的膜阻力(随机在可去除区间内,乘以时间因子)
|
|
|
+ dR_bw = reversible_R * time_gain
|
|
|
+
|
|
|
+ return float(np.clip(dR_bw, 0.0, reversible_R))
|
|
|
+
|
|
|
+
|
|
|
+# ===== 主程序 =====
|
|
|
+if __name__ == "__main__":
|
|
|
+ model_fp = ResistanceIncreaseModel()
|
|
|
+ model_bw = ResistanceDecreaseModel()
|
|
|
+
|
|
|
+ torch.save(model_fp.state_dict(), "resistance_model_fp.pth")
|
|
|
+ torch.save(model_bw.state_dict(), "resistance_model_bw.pth")
|
|
|
+
|
|
|
+ print("模型已安全保存为 resistance_model_fp.pth、resistance_model_bw.pth")
|