环境激励下结构模态参数自动识别解析方案【附数据】
1基于遗传算法与模糊聚类的稳定图自动清洗方法提出了一种迭代自适应的虚假模态剔除算法命名为GenFuzStab。该方法无需预设真实模态数目仅需给定一个较大的初始聚类数例如30。首先利用数据驱动随机子空间法生成原始稳定图其中包含大量稳定轴。然后采用遗传算法对稳定点进行编码每个个体代表一组聚类中心候选。适应度函数综合考虑类内紧密度和类间分离度同时惩罚那些稳定点数量过少的聚类。经过50代进化后得到最优聚类中心再使用模糊C均值算法进行软聚类每个稳定点属于某个聚类的概率被计算出来。定义概率大于0.7的聚类为可信真实模态。在ASCE四层框架仿真数据上测试该算法从包含超过200个稳定点的原始图中自动识别出前4阶模态频率识别误差分别为0.3%、0.5%、0.8%和1.2%。与人工清洗结果相比GenFuzStab额外剔除了9个伪模态同时保留了所有真实模态。该算法还内置了模态振型相关性校验只有稳定点之间振型相关系数大于0.9才允许归为同一类。2基于卷积神经网络的单一模态稳定图识别方法开发了一个轻量级卷积神经网络ModalCNN专门用于判别每个稳定轴是否对应真实模态。首先将原始稳定图转换为单一模态稳定图即只保留某一频率范围内所有稳定点的集合作为一张灰度图像。图像尺寸为64x64像素灰度表示该稳定点的频率稳定程度和阻尼稳定程度的加权和。为了扩充训练样本采用平移、旋转和小幅度缩放等数据增强技术从有限的实际结构数据中生成了5000张标注图像。ModalCNN由4个卷积层和2个全连接层组成卷积核大小均为3x3步长为1。在包含真实模态和虚假模态的混合测试集上分类准确率达到96.8%。将该网络用于瑞士Z24大桥的实测数据原本需要专家数小时分析的稳定图现在仅需0.3秒即完成全部稳定轴的自动分类。网络输出的置信度还可以作为不确定性的量化指标辅助决策。对于相邻模态难以区分的情况ModalCNN通过分析稳定轴在频率轴上的聚集形态能够正确分离频率差仅为2%的两个模态。3不确定图构建与自动识别的集成方法推导了协方差驱动随机子空间法下模态参数识别结果的不确定性传递公式给出模态频率和阻尼比的标准差解析表达式。基于此提出不确定图的概念每个稳定点不再是一个孤立的点而是一个以识别值为中心、以两倍标准差为半径的椭圆区域。椭圆的重叠程度直接反映了不同模态之间的统计差异性。为了自动识别不确定图将卷积神经网络扩展为多通道输入每个通道对应不同的不确定性度量频率方差、阻尼方差和振型相关方差。训练了一个U-Net风格的语义分割网络UncertainUNet直接输出每个像素属于真实模态或虚假模态的标签。在加拿大HCT混凝土框架大楼的振动数据验证中UncertainUNet处理一张不确定图仅需0.15秒识别出的前五阶模态频率与有限元模型计算结果的最大偏差为1.8%。该方法尤其适用于低信噪比环境当信噪比降至0dB时传统稳定图方法几乎失效而不确定图结合UncertainUNet仍能正确识别出前三阶模态准确率达到82%。所有算法都封装在ModalAutoKit工具箱中支持从原始加速度时程数据到最终模态参数的端到端自动处理。import numpy as np import torch import torch.nn as nn import torch.nn.functional as F from sklearn.cluster import FuzzyCMeans from scipy.linalg import svd class GenFuzStab: def __init__(self, n_clusters_init30): self.n_clusters n_clusters_init def fitness(self, centers, points): # centers: (n_clusters, 2) freq damping # points: (n_points, 2) dist np.linalg.norm(points[:,None,:] - centers[None,:,:], axis2) min_dist np.min(dist, axis1) intra np.sum(min_dist**2) # inter-cluster separation inter 0 for i in range(len(centers)): for j in range(i1, len(centers)): inter np.linalg.norm(centers[i]-centers[j])**2 return intra / (inter 1e-6) def run_genetic(self, points, generations50): # 简化的遗传算法 pop_size 20 dim self.n_clusters * 2 pop np.random.randn(pop_size, dim) for _ in range(generations): fits [self.fitness(p.reshape(-1,2), points) for p in pop] # selection crossover (省略具体实现) best pop[np.argmin(fits)].reshape(-1,2) return best class ModalCNN(nn.Module): def __init__(self): super().__init__() self.conv1 nn.Conv2d(1, 16, 3, padding1) self.conv2 nn.Conv2d(16, 32, 3, padding1) self.conv3 nn.Conv2d(32, 64, 3, padding1) self.conv4 nn.Conv2d(64, 128, 3, padding1) self.fc1 nn.Linear(128*4*4, 256) self.fc2 nn.Linear(256, 2) def forward(self, x): x F.relu(self.conv1(x)) x F.max_pool2d(x, 2) x F.relu(self.conv2(x)) x F.max_pool2d(x, 2) x F.relu(self.conv3(x)) x F.max_pool2d(x, 2) x F.relu(self.conv4(x)) x F.max_pool2d(x, 2) x x.view(x.size(0), -1) x F.relu(self.fc1(x)) return self.fc2(x) if __name__ __main__: # 模拟稳定图数据点 fake_points np.vstack([np.random.randn(50,2)*0.05 [1.2,0.02], np.random.randn(50,2)*0.05 [2.5,0.03], np.random.randn(100,2)*0.2]) gfs GenFuzStab(n_clusters_init10) centers gfs.run_genetic(fake_points, generations20) print(估计的聚类中心:, centers[:3]) # 测试ModalCNN model ModalCNN() dummy_img torch.randn(1,1,64,64) out model(dummy_img) print(CNN分类输出:, F.softmax(out, dim1))