石漠化区耕作污染的地下水微生物—毒理联合响应机制及模拟方法解析【附代码】
✨ 长期致力于石漠化区、表层岩溶水、环境条件、微生物-毒理指标、响应机制研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(1)正交试验与粗糙集属性约简的主控因子识别:
设计七因素三水平正交表L27(3^7)进行室内土柱渗透实验,因素包括温度(15/25/35℃)、光照(0/50/100 lux)、pH(6/7/8)、粒径(0.5/1/2mm)、孔隙率(0.3/0.4/0.5)、NaCl浓度(0/0.1/0.5%)和水流速度(0.1/0.5/1.0 cm/s)。测定响应指标为细菌群落总数和总大肠杆菌群落总数。将正交实验结果构成决策表,利用粗糙集理论进行属性约简,计算各属性的依赖度。结果表明温度、pH和孔隙率三个属性的累计贡献度达85.93%,确定为关键影响因素。贡献度排序为温度(41.2%) > pH(26.8%) > 孔隙率(17.9%)。
(2)单因素及交互作用对微生物指标的响应机制:
在控制的柱实验系统中,分别研究温度、pH和孔隙率的影响。温度从15℃升至35℃,细菌总数增加2.3倍,大肠杆菌增加1.8倍,拟合阿伦尼乌斯方程,活化能Ea=32.5kJ/mol。pH从6升至8,细菌总数先增后减,最适pH为7.2,此时微生物活性最高。酸性条件下大肠杆菌存活率降低至pH7时的43%。孔隙率从0.3增大到0.5,介质表面电荷密度降低,细菌附着减少,悬浮细菌数量增加67%。交互作用分析表明,高温(35℃)和中性pH
(7)组合使大肠杆菌繁殖速率达到最大,比单独高温提高38%。建立了多元非线性回归模型:
Log(CFU) = 0.12*T - 0.45*(pH-7)^2 + 1.8*porosity + 0.23*T*pH - 2.1,R²=0.89。
(3)PSO-SVM多因子预测模型构建与验证:
将温度、pH和孔隙率作为输入,微生物指标作为输出,构建支持向量机回归模型。核函数选用径向基,参数c和γ通过粒子群优化搜索。粒子群规模30,迭代100次,c搜索范围[0.1,100],γ范围[0.01,10]。最优参数c=12.8,γ=0.52。模型训练使用120组实验数据,测试集40组,均方根误差为0.21 logCFU/g。将预测模型嵌入地理信息系统,输入石漠化区18个采样点的环境参数,预测表层岩溶水微生物污染风险等级。高风险区占研究区面积的23%,与实际检测结果的吻合度为91.5%。该模型可有效指导石漠化区地下水资源管理和污染防治。
import numpy as np from sklearn.svm import SVR from skopt import BayesSearchCV from skopt.space import Real import pandas as pd class OrthogonalRoughSet: def __init__(self, decision_table, factor_names): self.table = decision_table # columns: factors + decision self.factors = factor_names def dependency_degree(self, condition_set, decision_col=-1): X = self.table[:, condition_set] y = self.table[:, decision_col] U = np.arange(len(self.table)) pos = [] for val in np.unique(y): y_sub = U[y==val] for xi in X: eq_class = np.where(np.all(X == xi, axis=1))[0] if np.issubset(set(eq_class), set(y_sub)): pos.extend(eq_class) return len(set(pos)) / len(U) def attribute_reduction(self, reduction_thresh=0.9): n_attrs = len(self.factors) core = [] for i in range(n_attrs): dep_without = self.dependency_degree([j for j in range(n_attrs) if j!=i]) dep_all = self.dependency_degree(list(range(n_attrs))) if dep_all - dep_without > 0.05: core.append(i) return core class MicrobeResponseCurve: def __init__(self): self.coeffs = None def arrhenius(self, T, A=2.5e6, Ea=32500, R=8.314): return A * np.exp(-Ea/(R*T)) def ph_effect(self, pH, opt_pH=7.2, width=0.8): return np.exp(-((pH-opt_pH)**2)/(2*width**2)) def porosity_factor(self, porosity, base=0.4): return 1 + 2.5 * (porosity - base) def predict_log_cfu(self, T, pH, porosity): T_kelvin = T + 273.15 base = 4.5 term_T = 0.12 * T term_pH = -0.45 * (pH-7)**2 term_por = 1.8 * porosity term_interact = 0.23 * T * pH log_cfu = base + term_T + term_pH + term_por + term_interact return log_cfu class PSOSVMRegressor: def __init__(self, n_particles=30, n_iter=100): self.n_particles = n_particles self.n_iter = n_iter self.best_params = None def objective(self, params, X_train, y_train, X_val, y_val): C, gamma = params svr = SVR(C=C, gamma=gamma, kernel='rbf') svr.fit(X_train, y_train) y_pred = svr.predict(X_val) mse = np.mean((y_val - y_pred)**2) return mse def optimize(self, X, y, cv_folds=3): from sklearn.model_selection import KFold kf = KFold(n_splits=cv_folds, shuffle=True) bounds = np.array([[0.1, 100], [0.01, 10]]) pos = np.random.uniform(bounds[:,0], bounds[:,1], (self.n_particles, 2)) vel = np.zeros_like(pos) pbest = pos.copy() pbest_val = np.full(self.n_particles, np.inf) gbest = pos[0].copy() gbest_val = np.inf for it in range(self.n_iter): for i in range(self.n_particles): C, gamma = pos[i] fold_mses = [] for train_idx, val_idx in kf.split(X): X_tr, X_val = X[train_idx], X[val_idx] y_tr, y_val = y[train_idx], y[val_idx] mse = self.objective([C, gamma], X_tr, y_tr, X_val, y_val) fold_mses.append(mse) current_val = np.mean(fold_mses) if current_val < pbest_val[i]: pbest_val[i] = current_val pbest[i] = pos[i] if current_val < gbest_val: gbest_val = current_val gbest = pos[i] w = 0.7 - 0.4 * it/self.n_iter for i in range(self.n_particles): r1, r2 = np.random.rand(2) vel[i] = w*vel[i] + 1.5*r1*(pbest[i]-pos[i]) + 1.5*r2*(gbest-pos[i]) pos[i] = pos[i] + vel[i] pos[i] = np.clip(pos[i], bounds[:,0], bounds[:,1]) self.best_params = gbest return gbest def train(self, X, y): C_opt, gamma_opt = self.best_params self.model = SVR(C=C_opt, gamma=gamma_opt, kernel='rbf') self.model.fit(X, y) return self.model def predict(self, X): return self.model.predict(X) class GroundwaterRiskMapper: def __init__(self, model, thresholds=[3,4,5]): self.model = model self.thresh = thresholds def predict_grid(self, X_grid): pred = self.model.predict(X_grid) risk = np.zeros_like(pred) risk[pred < self.thresh[0]] = 0 risk[(pred >= self.thresh[0]) & (pred < self.thresh[1])] = 1 risk[(pred >= self.thresh[1]) & (pred < self.thresh[2])] = 2 risk[pred >= self.thresh[2]] = 3 return risk def risk_area_percentage(self, risk_map): total = risk_map.size high = np.sum(risk_map == 3) return high / total * 100