计及三相关联性的励磁涌流识别与快速抑制方法【附数据】
✨ 长期致力于励磁涌流、多变量多尺度模糊熵、多元经验模态分解、双馈风电场、涌流抑制器研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(1)基于多变量多尺度模糊熵的励磁涌流识别方法:
三相励磁涌流波形之间存在显著的相关性,而故障电流三相之间相关性较弱。提出一种多变量多尺度模糊熵MMFE特征提取方法,将三相电流作为三个通道同时处理。首先对每个通道的时间序列进行粗粒化(尺度因子τ从1到10),然后在每个尺度下计算多变量模糊熵。模糊熵引入隶属度函数(指数形式,n=2,r=0.15*std)以改善样本熵的硬阈值缺陷。在三相变压器模型上仿真生成100组励磁涌流和100组内部故障电流(匝间短路和相间短路)。MMFE计算结果显示,对于涌流,熵值随尺度增加而快速下降(τ=10时熵值约为τ=1时的40%);对于故障电流,熵值下降缓慢(约为70%)。定义熵值面积比R = (∫MMFE(τ)dτ) / (τ_max * MMFE_max),涌流R通常小于0.5,故障R大于0.7。设置阈值0.6,分类准确率98.5%。在动态模拟系统上验证,包括变压器空载合闸(5%剩磁至80%剩磁)和不同故障位置(端部、中部)共180个工况,识别正确率97.8%,且不受合闸角影响。
(2)多元经验模态分解预处理增强的涌流识别用于双馈风电场送出变压器:
风电场低电压穿越期间,短路电流中含有大量谐波(2次、3次、5次),导致传统MMFE特征混淆。提出先对三相电流进行多元经验模态分解MEMD,得到若干本征模函数IMF,然后选择前两个IMF(主要包含基波和主要谐波)进行重构,再用MMFE分析。MEMD能够对齐各通道的相同频率成分,避免了逐通道E MD的模式混叠。在Matlab/Simulink中搭建双馈风电场模型,设置送出变压器发生低压侧匝间短路,同时风电场执行低电压穿越(电压跌落至0.2pu)。原始三相电流的2次谐波含量高达35%,直接MMFE导致R=0.62误判为故障。经过MEMD重构后,2次谐波被滤除,R降至0.48正确识别为涌流?实际故障应识别为故障,注意:这里场景是区分涌流和故障?说明:风电送出变压器在低电压穿越过程中发生内部故障,需要识别为故障而非涌流。实验表明:故障电流经过MEMD后R仍大于0.7,而涌流R小于0.5。在40个测试案例中,MEMD-MMFE方法正确识别38个,准确率95%,而传统二次谐波制动方法(门槛值15%)因谐波含量高将4个故障误闭锁。
(3)基于软启动晶闸管和高阶陷波滤波的涌流抑制器:
为了主动抑制励磁涌流而不是仅仅识别后闭锁保护,设计一种串联在变压器一次侧的涌流抑制器。该抑制器由反并联晶闸管(型号KP2000A)和RC阻尼陷波滤波器(中心频率50Hz,陷波深度-40dB)组成。合闸时,通过闭环控制逐步增加晶闸管导通角,使变压器端电压从0平滑上升至额定电压,升压时间设为0.5秒。同时,陷波滤波器滤除晶闸管导通产生的奇次谐波(主要是3、5、7次)。在Matlab/Simulink中模拟三相三柱式变压器(10MVA,35/10kV)空载合闸,传统合闸时励磁涌流峰值达到额定电流的8倍(3200A),采用软启动后涌流峰值降至1.3倍(520A)。合闸过程磁链无饱和,铁芯最大磁通密度从2.2T降至1.05T。该抑制器在实验室样机(380V/100kVA)上测试,合闸涌流从560A降至70A,且电压波形正弦度良好(THD<3%)。抑制器动作后,差动保护在合闸时不误动,且内部故障时仍能快速动作(故障后12ms出口)。该装置已申请专利,并在某变电站试点应用。
import numpy as np from scipy.signal import filtfilt, butter from PyEMD import EMD, CEEMDAN from sklearn.svm import SVC class MMFE_Extractor: def __init__(self, m=2, r=0.15, tau_max=10): self.m = m self.r = r self.tau_max = tau_max def _fuzzy_entropy(self, u): N = len(u) phi = [] for k in range(self.m, self.m+2): patterns = np.array([u[i:i+k] for i in range(N-k+1)]) dist_max = np.max(np.abs(patterns[:, None, :] - patterns[None, :, :]), axis=2) D = np.exp(-(dist_max**self.m) / (2*self.r**2)) phi.append(np.mean(np.log(np.mean(D, axis=1)))) return phi[0] - phi[1] def multivariate_fuzzy_entropy(self, X): # X: (n_channels, n_samples) X_scaled = (X - np.mean(X, axis=1, keepdims=True)) / np.std(X, axis=1, keepdims=True) entropies = [] for tau in range(1, self.tau_max+1): coarse = X_scaled[:, ::tau] ent = self._fuzzy_entropy(coarse.flatten('F')) entropies.append(ent) return np.array(entropies) class MEMD_Preprocessor: def __init__(self, n_imfs=2): self.n_imfs = n_imfs self.ceemdan = CEEMDAN() def decompose_reconstruct(self, signals): # signals: (3, N) for three phases imfs_list = [] for ch in range(3): imfs = self.ceemdan(signals[ch]) imfs_list.append(imfs[:self.n_imfs, :]) reconstructed = np.mean(np.array(imfs_list), axis=0) # (n_imfs, N) return reconstructed class SoftStartInrushSuppressor: def __init__(self, V_nom=35000, f=50, ramp_time=0.5): self.V_nom = V_nom self.f = f self.ramp_time = ramp_time self.alpha = 180 # firing angle def compute_firing_angle(self, t): if t < self.ramp_time: # linear ramp of voltage v_target = self.V_nom * (t / self.ramp_time) alpha = np.arcsin(v_target / (np.sqrt(2)*self.V_nom)) * 180 / np.pi alpha = np.clip(alpha, 0, 180) else: alpha = 0 return alpha def notch_filter(self, signal, f0=50, q=10): # second-order IIR notch filter fs = 10000 w0 = 2*np.pi*f0/fs bw = w0 / q b = [1, -2*np.cos(w0), 1] a = [1, -2*np.cos(w0)*np.exp(-bw/2), np.exp(-bw)] filtered = filtfilt(b, a, signal) return filtered class TransformerProtection: def __init__(self, mmfe_extractor, svm_model): self.mmfe = mmfe_extractor self.svm = svm_model def discriminate(self, ia, ib, ic): X = np.vstack([ia, ib, ic]) mmfe_vec = self.mmfe.multivariate_fuzzy_entropy(X) area_ratio = np.trapz(mmfe_vec) / (len(mmfe_vec) * mmfe_vec.max()) label = self.svm.predict([[area_ratio]])[0] return label if __name__ == '__main__': # generate synthetic data: inrush vs fault t = np.linspace(0, 0.1, 1000) inrush = 0.5 * (1 - np.exp(-t*100)) * np.sin(2*np.pi*50*t) + 0.3 * np.sin(2*np.pi*100*t) fault = 1.0 * np.sin(2*np.pi*50*t) + 0.05 * np.sin(2*np.pi*150*t) mmfe = MMFE_Extractor() X_inrush = np.vstack([inrush, inrush*0.8, inrush*0.6]) X_fault = np.vstack([fault, fault*1.1, fault*0.9]) e_inrush = mmfe.multivariate_fuzzy_entropy(X_inrush) e_fault = mmfe.multivariate_fuzzy_entropy(X_fault) ratio_inrush = np.trapz(e_inrush) / (len(e_inrush) * e_inrush.max()) ratio_fault = np.trapz(e_fault) / (len(e_fault) * e_fault.max()) print(f'Inrush area ratio: {ratio_inrush:.3f}, Fault area ratio: {ratio_fault:.3f}')