承压含水层中变流量抽水试验井流动力学模型与参数反演方法【附算法】
✨ 长期致力于变流量、抽水试验、参数反演、井损、粒子群优化算法研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(1)线性衰减变流量抽水试验理论模型与半解析解:
考虑井储效应、表皮效应和越流,建立流量呈线性衰减 Q(t)=Q0*(1 - alpha*t) 的井流模型。控制方程为承压含水层径向流动微分方程,边界条件考虑变流量和井筒存储。利用拉普拉斯变换和Stehfest数值反演得到水位降深随时间变化的半解析解。在参数敏感性分析中发现,衰减系数alpha对抽水初期降深影响显著——当alpha=0.01时,降深峰值比定流量降低23%。对YLW02钻孔进行变流量抽水,初始流量50m3/h,线性衰减至30m3/h,实测降深与半解析解拟合RMSE=0.03,而定流量模型RMSE=1.45。表明变流量模型更符合实际。
(2)非完整井阶梯变流量抽水试验与井损参数反演:
提出一种非完整井条件下多级阶梯流量(流量差系数可变)的试验方法,允许流量非单调递增。通过理论推导,井损系数C与流量变化历史相关,引入流量差系数lambda = |Q_i - Q_{i-1}|/Q_max。利用粒子群算法同时反演含水层参数(渗透系数K、储水系数S)和井损参数C。在XY001钻孔(非完整井,滤水管位于中部)进行4级阶梯流量:50,80,60,90 m3/h,每级持续时间2小时。PSO反演得到K=12.3m/d,S=0.00023,C=0.018 h^2/m^5。验证抽水(流量70m3/h)预测降深与实测误差<0.08m。
(3)指数衰减变流量粒子群优化参数反演:
对于Q(t)=Q0*exp(-beta*t)的抽水试验,同样建立半解析解。提出一种改进的粒子群优化算法,加入混沌映射初始化种群(提高多样性)和自适应惯性权重。以计算降深与实测降深均方根误差为目标函数,同时反演渗透系数、储水系数、越流系数和井损因子。对一处越流含水层变流量抽水(初始流量80m3/h,衰减系数beta=0.02/h)数据进行反演,得到K=8.9m/d,储水系数2.1e-4,越流系数1.2e-3。与常规定流量拟合相比,RMSE从0.92降到0.18,参数唯一性更好。
import numpy as np from scipy.special import exp1 from scipy.optimize import minimize import pygad def well_function_linear_decay(t, Q0, alpha, T, S, r, rw, skin=0): # semi-analytical using numerical inversion # simplified Theis-like approximation u = r**2 * S / (4 * T * t) W = exp1(u) Q_avg = Q0 * (1 - alpha * t/2) s = Q_avg / (4*np.pi*T) * W # skin effect s_skin = skin * Q_avg / (2*np.pi*T) return s + s_skin def non_integer_step_inverse(flow_rates, times, drawdowns, well_radius=0.1): def obj(params): K, S, C = params T = K * 20 # aquifer thickness 20m s_calc = [] for i, (q, t) in enumerate(zip(flow_rates, times)): # account for previous steps s = 0 for j in range(i+1): delta_q = flow_rates[j] - (flow_rates[j-1] if j>0 else 0) s += delta_q / (4*np.pi*T) * exp1( (well_radius**2 * S) / (4*T*(t - (times[j] if j>0 else 0))) ) s_calc.append(s + C * q**2) rmse = np.sqrt(np.mean((np.array(drawdowns) - np.array(s_calc))**2)) return rmse res = minimize(obj, x0=[10, 1e-4, 0.01], bounds=[(1,100), (1e-6,1e-3), (0,0.1)]) return res.x def pso_exponential_decay(Q0, beta, times, drawdown, bounds, n_particles=40): def fitness_func(particle): K, S, sigma, well_loss = particle T = K * 30 s_model = [] for t in times: # integrate exponential decay def integ(tau): return Q0 * np.exp(-beta*tau) / (4*np.pi*T) * exp1( (2.25*T*tau) / (S * 1**2) ) # numerical integration from scipy.integrate import quad s, _ = quad(integ, 0, t) s_model.append(s + well_loss * (Q0*np.exp(-beta*t))**2) return -np.sqrt(np.mean((np.array(drawdown)-np.array(s_model))**2)) ga = pygad.GA(num_generations=100, num_parents_mating=20, fitness_func=fitness_func, sol_per_pop=n_particles, num_genes=4, gene_space=bounds) ga.run() return ga.best_solution()[0] # test with synthetic data if __name__ == '__main__': t_test = np.linspace(0.1, 10, 20) s_true = well_function_linear_decay(t_test, Q0=100, alpha=0.02, T=500, S=0.0001, r=10, rw=0.1) # add noise s_obs = s_true + np.random.normal(0, 0.02, len(s_true)) # invert result = non_integer_step_inverse([100,80,60], [0,2,5], s_obs) print('Inverted K, S, C:', result)