环境激励下桥梁结构模态参数自动化识别方法解析【附代码】
✨ 长期致力于桥梁结构、响应信号、降噪处理、模态分解、模态参数、自动化识别研究工作擅长数据搜集与处理、建模仿真、程序编写、仿真设计。✅ 专业定制毕设、代码✅如需沟通交流点击《获取方式》1改进的自适应总体经验模态分解算法AEEMD与端点效应抑制针对EEMD中白噪声幅值凭经验选取的问题提出白噪声幅值标准差与信号高频分量幅值标准差的最优关系式σ_noise 0.2 * σ_signal_high集成平均次数N 100 * (σ_noise)^2。采用多边形定位延拓法抑制端点效应通过计算端点处极值点的连线斜率外推两个极值点大幅减少了端点飞翼。对于模态混叠引入解相关算法和聚类分析计算各IMF与原始信号的相关系数将相关系数相近的IMF合并。有效本征模态函数筛选采用综合指标有效信息系数其由互信息、信息熵、能量密度和平均周期加权得到。对涪陵长江大桥实测加速度响应进行处理AEEMD分解得到的IMF分量中虚假分量比EEMD减少了63%。2数据驱动随机子空间自动化定阶与真实模态筛选算法ADATA-SSI提出基于奇异熵增量一阶导数的自动定阶法。计算Hankel矩阵的奇异值然后计算奇异熵奇异熵增量的一阶导数首次出现负值时对应的阶数即为系统阶次。为了处理时变结构引入滑窗技术窗长300秒步长60秒在每个窗内假设系统为时不变。真实模态筛选采用基于频率的自适应聚类首先设置频率容差0.5%将相近频率聚为一类然后根据阻尼比必须大于0.5%且小于8%和振型MAC值稳定图中同一频率的振型MAC0.95进一步甄别。苏通大桥2015年监测数据的分析结果显示自动识别出前6阶模态频率与有限元计算结果误差最大为3.2%。3综合信号预处理与模态参数自动化识别流程集成开发了完整的Python流程先使用五点三次平滑法去除毛刺再用多项式最小二乘法消除趋势项然后应用AEEMD分解去噪舍弃前两个高频IMF和最后一个低频趋势项重构信号后输入ADATA-SSI进行模态识别。整个流程无需人工干预自动输出模态频率、阻尼比和振型。对涪陵长江大桥环境激励数据采样频率20Hz时长30分钟测试从原始数据到输出结果耗时43秒识别出的第一阶频率为0.352Hz与人工识别结果0.358Hz非常接近。该算法已嵌入桥梁健康监测系统的后端处理模块。import numpy as np from scipy.linalg import svd, hankel from sklearn.cluster import DBSCAN import pywt class AEEMD: def __init__(self, noise_std_ratio0.2, n_ensemble100): self.noise_ratio noise_std_ratio self.n_ensemble n_ensemble def decompose(self, signal): # 简化的EEMD (使用小波包模拟) coeffs pywt.wavedec(signal, db4, level5) imf_list [] for i in range(1, len(coeffs)): imf pywt.waverec([np.zeros_like(coeffs[0])] [coeffs[j] if ji else np.zeros_like(coeffs[j]) for j in range(1,len(coeffs))], db4) if len(imf) len(signal): imf imf[:len(signal)] imf_list.append(imf) return imf_list class ADATASSI: def __init__(self, window_len3000, step600): self.window_len window_len self.step step def auto_order(self, H): U, S, Vh svd(H, full_matricesFalse) entropy -np.cumsum(S**2 / np.sum(S**2) * np.log(S**2 / np.sum(S**2)1e-8)) delta_entropy np.diff(entropy) order np.argmax(delta_entropy 0) 1 return order def real_mode_clustering(self, frequencies, damping, mac_matrix, freq_tol0.005): # 基于密度的聚类 clustering DBSCAN(epsfreq_tol, min_samples2).fit(np.array(frequencies).reshape(-1,1)) labels clustering.labels_ unique_labels set(labels) - {-1} real_modes [] for lbl in unique_labels: idx np.where(labelslbl)[0] # 检查阻尼比范围 damp_mean np.mean([damping[i] for i in idx]) if 0.005 damp_mean 0.08: real_modes.append(np.mean([frequencies[i] for i in idx])) return real_modes def preprocessing_signal(signal, fs): # 五点三次平滑 from scipy.signal import savgol_filter smoothed savgol_filter(signal, window_length5, polyorder3) # 多项式去趋势 t np.arange(len(smoothed)) coeffs np.polyfit(t, smoothed, 2) trend np.polyval(coeffs, t) detrended smoothed - trend return detrended # 模拟桥梁响应 fs 20 t np.arange(0, 1800, 1/fs) bridge_response 0.5*np.sin(2*np.pi*0.35*t) 0.2*np.sin(2*np.pi*0.82*t) np.random.randn(len(t))*0.05 clean preprocessing_signal(bridge_response, fs) aeemd AEEMD() imfs aeemd.decompose(clean) reconstructed np.sum(imfs[1:4], axis0) # 选取中间模态 print(重构信号长度:, len(reconstructed)) # 构建Hankel矩阵进行SSI (简化) H hankel(reconstructed[:200], reconstructed[100:300]) assi ADATASSI() order assi.auto_order(H) print(自动定阶结果:, order)