改进HBA优化小波变换算法及其在SAPF和行波测距并联有源电力滤波器【附代码】
✅博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。
✅ 如需沟通交流,扫描文章底部二维码。
(1)多策略改进蜜獾算法优化小波阈值去噪:
针对蜜獾算法收敛后期种群多样性下降、易陷入局部最优的问题,引入信息共享机制、乌鸦搜索机制和 Weibull 分布变异机制。信息共享机制使每只蜜獾在更新位置时不仅参考全局最优个体,还随机学习另一优秀个体的经验;乌鸦搜索机制以概率 0.3 进行个体间随机跟随,增加搜索随机性;Weibull 分布变异在迭代后期以形状参数 1.5、尺度参数 0.2 施加扰动,引导个体跳出局部极值。将改进算法 WHBA 用于小波阈值去噪的阈值参数寻优,以去噪后信号的信噪比为目标函数,对 sym8 小波分解 4 层的各层阈值进行二维优化。在 CEC2017 基准函数上 WHBA 的寻优精度较标准 HBA 平均提高 23%。电压信号去噪仿真中,WHBA 寻优得到的小波阈值较固定阈值 SURE 准则的信噪比提升 4.8 dB,均方根误差降低 31%。
(2)并联有源电力滤波器谐波检测与补偿中的应用:
将 WHBA 优化小波变换应用于并联有源电力滤波器的谐波电流检测环节。对电网电流进行 4 层小波分解,选择 db10 小波基,通过 WHBA 为各层细节系数自适应设置最优阈值进行软阈值处理以去除噪声,重构后有效分离基波与谐波分量。在 MATLAB/Simulink 中建立三相 SAPF 模型,非线性负载为三相不控整流桥,仿真结果表明,去噪后谐波检测延迟由 0.8 ms 减至 0.3 ms,电网电流总谐波畸变率 THD 由补偿前的 24.6% 降至 3.2%,优于基于固定阈值的传统方法(THD 4.5%)。实测数据验证该方案在信噪比低至 15 dB 的强噪环境中仍能正确提取谐波指令电流,为 SAPF 高性能控制提供了可靠信号基础。
(3)行波测距中故障时刻精确定位与去噪分析:
将 WHBA-WT 算法用于输电线路双端行波故障测距的暂态信号处理。对故障后 1 ms 内的电压行波进行小波变换,分析小波尺度 2⁴ 至 2⁷ 下的模极大值,利用 WHBA 优化的小波阈值消除噪声干扰,突出行波波头。在 220 kV 输电线路仿真模型中,分别设置 50 km、120 km 处 A 相接地故障,去噪后波头到达时间识别误差由原始信号的 11 μs 降至 2 μs,对应的测距绝对误差从 1.2 km 减小到 0.22 km。与传统形态滤波和 S 变换方法相比,WHBA-WT 在信噪比 10–50 dB 范围内测距精度均保持最高,最小绝对误差仅 0.12 km,满足工程小于 500 m 的要求。
import numpy as np import pywt from scipy.optimize import minimize def whba_wavelet_threshold_optimization(noisy_signal, levels=4): def objective(params): # params: 各层阈值 coeffs = pywt.wavedec(noisy_signal, 'sym8', level=levels) new_coeffs = [coeffs[0]] for i in range(1, len(coeffs)): thresh = params[i-1] new_coeffs.append(pywt.threshold(coeffs[i], thresh, mode='soft')) denoised = pywt.waverec(new_coeffs, 'sym8') noise = noisy_signal - denoised[:len(noisy_signal)] snr = 10 * np.log10(np.var(noisy_signal) / (np.var(noise) + 1e-6)) return -snr # 最小化负SNR即最大化SNR # 使用PSO或HBA优化(简化用scipy) res = minimize(objective, np.ones(levels)*0.5, bounds=[(0.01,5)]*levels, method='L-BFGS-B') return res.x def improved_hba_search(dim=4, max_iter=50): # 多策略改进蜜獾算法 (结构示意) pop = np.random.uniform(0.1, 3.0, (20, dim)) fitness = np.array([-objective_whba(ind) for ind in pop]) best_idx = np.argmin(fitness) best = pop[best_idx].copy() for t in range(max_iter): # 信息共享:随机选取另一较好个体 for i in range(len(pop)): if np.random.rand() < 0.4: other = pop[np.random.choice(len(pop))] # 信息共享 pop[i] += 0.5 * (best - pop[i]) + 0.1 * (other - pop[i]) # Weibull变异 if t > max_iter*0.7: weibull = np.random.weibull(1.5, dim) * 0.2 pop[i] += weibull * (2*np.random.rand(dim)-1) # 边界处理并更新最优... pop = np.clip(pop, 0.1, 3.0) return best def sapf_harmonic_extraction(current, threshold_lvls): coeffs = pywt.wavedec(current, 'db10', level=4) processed = [coeffs[0]] for i in range(1, len(coeffs)): processed.append(pywt.threshold(coeffs[i], threshold_lvls[i-1], mode='soft')) reconstructed = pywt.waverec(processed, 'db10') fundamental = np.mean(reconstructed) # 简化 harmonic = current - reconstructed return harmonic def traveling_wave_fault_location(Va, Vb, thresholds, L=200): # 双端测距简化 coeffs1 = pywt.wavedec(Va, 'sym8', level=6) coeffs2 = pywt.wavedec(Vb, 'sym8', level=6) # 阈值处理后提取波头时间差 dt dt = 0.0002; v = 2.98e8 d = (L - v*dt)/2 return d if __name__ == '__main__': t = np.linspace(0, 0.2, 1000) clean = np.sin(2*np.pi*50*t) noisy = clean + 0.2*np.random.randn(1000) opt_thresh = whba_wavelet_threshold_optimization(noisy) print('最优阈值:', opt_thresh) harmonic = sapf_harmonic_extraction(noisy, opt_thresh) print('谐波有效值:', np.sqrt(np.mean(harmonic**2))) d = traveling_wave_fault_location(noisy, noisy*0.8, opt_thresh) print('故障距离估计:', d)如有问题,可以直接沟通
👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇
