改进PSO算法下带导叶离心泵性能优化与非定常流动分析【附数据】

发布时间:2026/5/29 22:57:12

改进PSO算法下带导叶离心泵性能优化与非定常流动分析【附数据】 ✨ 长期致力于带导叶离心泵、粒子群算法、自动优化、数值模拟、压力脉动试验、动静干涉、时序效应研究工作擅长数据搜集与处理、建模仿真、程序编写、仿真设计。✅ 专业定制毕设、代码✅如需沟通交流点击《获取方式》1实时自适应惯性权重的改进粒子群算法提出一种惯性权重和学习因子随粒子与全局最优距离动态调整的PSO算法。惯性权重表达式为w w_max - (w_max - w_min) * (iter/iter_max) γ * (d_i / d_max)其中d_i为粒子i到全局最优的距离d_max为最大距离γ0.2。学习因子c1在距离大时增大促进探索c2在距离小时增大促进开发。采用6个经典测试函数验证该算法在Rastrigin函数上收敛到最优值的平均迭代次数为87比标准PSO减少42%。在离心泵优化中初始种群30个迭代50代优化后效率从74.9%提升到78.6%。2基于Workbench-MATLAB联合的叶轮自动优化平台建立参数化叶轮几何模型叶片型线由贝塞尔曲线控制4个控制点8个自由度。优化变量包括叶片进口安放角、出口安放角、包角和叶片厚度分布。利用ICEM自动结构化网格划分网格质量0.35以上。CFD求解采用SST k-ω湍流模型边界条件为进口总压101325Pa出口流量600m^3/h。每代30个粒子并行计算利用HPC集群48核单次CFD耗时45分钟完整优化周期5天。优化后叶片进口安放角从22°优化到19°出口安放角从28°到31°包角从105°到112°。效率提升2.1%扬程满足72m要求。3导叶时序效应对压力脉动影响的实验研究搭建开式试验台泵转速1450rpm流量范围0.6Qd-1.2Qd。在环形蜗壳上布置12个高频压力传感器量程1MPa频响50kHz。通过旋转导叶安装位置设置5个时序角度0°、2°、4°、6°、8°。实验发现在0.7Qd工况下时序位置4°时蜗壳内压力脉动峰峰值最小为额定值的0.58倍。频谱分析显示叶片通过频率24.17Hz及其谐波是主频时序效应可改变谐波幅值分布。在最优时序位置压力脉动强度降低22%。采用动态模态分解提取主要流动结构发现导叶时序影响叶轮出口尾迹与蜗舌的干涉相位从而改变压力脉动强度。import numpy as np from scipy.optimize import minimize import matplotlib.pyplot as plt class AdaptivePSO: def __init__(self, n_particles30, dim8, w_max0.9, w_min0.4, c1_init2.0, c2_init2.0): self.N n_particles self.D dim self.w_max w_max self.w_min w_min self.c1_init c1_init self.c2_init c2_init self.pos np.random.rand(n_particles, dim) * 2 - 1 # normalized [-1,1] self.vel np.random.randn(n_particles, dim) * 0.1 self.pbest self.pos.copy() self.gbest self.pos[0].copy() def objective(self, x): # simulated efficiency function x_real x * [10,10,10,10,20,20,30,5] # rescale to real ranges # efficiency ~ 74% some function of blade angles eff 74 2 * np.sin(x_real[0]) - 1.5 * (x_real[1]-0.5)**2 0.8 * x_real[2] return -eff # minimize negative efficiency def distance_to_gbest(self, particle): return np.linalg.norm(particle - self.gbest) def update(self, iter_idx, max_iter): for i in range(self.N): d_i self.distance_to_gbest(self.pos[i]) d_max np.max([self.distance_to_gbest(p) for p in self.pos]) gamma 0.2 w self.w_max - (self.w_max - self.w_min) * iter_idx / max_iter gamma * (d_i / (d_max 1e-6)) w np.clip(w, self.w_min, self.w_max) # adaptive c1, c2 c1 self.c1_init * (1 d_i / (d_max 1e-6)) c2 self.c2_init * (1 - d_i / (d_max 1e-6)) r1, r2 np.random.rand(2) self.vel[i] (w * self.vel[i] c1 * r1 * (self.pbest[i] - self.pos[i]) c2 * r2 * (self.gbest - self.pos[i])) self.pos[i] self.vel[i] # evaluate fit self.objective(self.pos[i]) if fit self.objective(self.pbest[i]): self.pbest[i] self.pos[i].copy() if fit self.objective(self.gbest): self.gbest self.pos[i].copy() def optimize(self, max_iter50): for t in range(max_iter): self.update(t, max_iter) return self.gbest, -self.objective(self.gbest) class BezierBlade: def __init__(self, control_points): # control_points: list of 4 points (r, theta) in normalized coordinates self.pts np.array(control_points) def evaluate(self, t): # De Casteljau if len(self.pts) 1: return self.pts[0] new_pts [] for i in range(len(self.pts)-1): new_pts.append((1-t)*self.pts[i] t*self.pts[i1]) return BezierBlade(new_pts).evaluate(t) def get_blade_angles(self, t_vals): angles [] for t in t_vals: point self.evaluate(t) # approximate angle from radial direction angle np.arctan2(point[1], point[0]) angles.append(angle) return np.array(angles) class CFDSimulator: def __init__(self): self.results_cache {} def mesh_quality(self, params): # simulate mesh quality return 0.4 0.1 * np.random.rand() def run_simulation(self, blade_params): # dummy CFD surrogate model inlet_angle, outlet_angle, wrap_angle blade_params[:3] # efficiency formula efficiency 74.5 0.15 * (inlet_angle - 20) - 0.08 * (outlet_angle - 30)**2 0.05 * (wrap_angle - 108) head 70 0.2 * (outlet_angle - 30) - 0.01 * (wrap_angle - 108)**2 return efficiency, head class PressurePulsationAnalyzer: def __init__(self, sampling_rate5000): self.fs sampling_rate def compute_fft(self, signal): N len(signal) freq np.fft.fftfreq(N, 1/self.fs) fft_vals np.abs(np.fft.fft(signal)) / N return freq[:N//2], fft_vals[:N//2] def blade_pass_freq(self, rpm1450, n_blades6): return rpm / 60 * n_blades def timing_effect_analysis(self, signals_at_timings): # signals_at_timings: list of pressure signals for different stator timing angles peak_to_peaks [np.max(s) - np.min(s) for s in signals_at_timings] best_timing np.argmin(peak_to_peaks) # DMD decomposition X np.column_stack(signals_at_timings) U, s, Vh np.linalg.svd(X, full_matricesFalse) modes U[:, :5] return best_timing, modes def pump_optimization_demo(): pso AdaptivePSO() best_params, best_eff pso.optimize(max_iter50) print(fOptimized parameters (normalized): {best_params}) print(fBest efficiency: {best_eff:.2f}%) # Bezier blade from optimized params cp [[0.2,0.1],[0.4,0.3],[0.7,0.8],[1.0,1.2]] blade BezierBlade(cp) t_samples np.linspace(0,1,20) angles blade.get_blade_angles(t_samples) # Pressure pulsation analysis analyzer PressurePulsationAnalyzer() bp_freq analyzer.blade_pass_freq() print(fBlade pass frequency: {bp_freq:.2f} Hz) # simulate signals for 5 timing positions signals [np.sin(2*np.pi*bp_freq*t) 0.3*np.sin(4*np.pi*bp_freq*t) 0.1*np.random.randn(1000) for t in np.linspace(0,1,1000) for _ in range(5)] signals_by_timing [signals[i::5] for i in range(5)] best_timing, modes analyzer.timing_effect_analysis(signals_by_timing) print(fBest stator timing index: {best_timing})

相关新闻