桥梁拉索索力异常识别【附代码】
✅博主简介擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导毕业论文、期刊论文经验交流。✅ 如需沟通交流扫描文章底部二维码。1环境振动与磁通量传感器的多模态索力测量融合桥梁拉索的索力可以通过振动频率法和磁通量传感器分别测量各有利弊。提出一种基于卡尔曼滤波的融合估计算法。振动频率法通过分析加速度信号的频谱提取前几阶频率根据弦振动公式计算索力但受边界条件影响。磁通量传感器直接测量磁导率变化得到绝对索力但易受温度漂移。构建状态空间模型将真实索力和温度漂移作为状态变量振动法索力作为观测值磁通量输出作为另一观测值使用扩展卡尔曼滤波进行最优融合。在某斜拉桥的6根典型拉索上进行了为期3个月的监测试验融合后的索力测量标准差为0.8%FS比单独振动法1.4%FS和单独磁通量法1.2%FS都更优。2基于长短期记忆网络的索力时变趋势预测环境温度、车辆荷载会导致索力日波动和长期松弛。构建一个堆叠LSTM网络输入为过去24小时的索力、温度、桥上交通流量通过监控获得三个时间序列采样间隔10分钟输出未来6小时的索力预测值。网络包含两层LSTM和dropout正则化。根据历史数据训练后模型能够预测出由于温度升高导致的索力增长趋势预测误差的均方根为5.2kN而基准ARIMA模型为8.7kN。当预测索力超出设计允许范围的95%时发出预警。3基于图注意力网络的多根拉索异常模式检测相邻拉索的索力变化存在空间相关性一根拉索异常会导致相邻索力重新分配。将全桥梁拉索视为图节点节点特征为当前索力与理论值的偏差百分比和温度修正后的索力变化率。边连接空间相邻的拉索使用图注意力网络GAT进行信息传播。GAT的输出经过全连接层得到每个节点的异常评分。同时设计了一个对比损失使正常状态下相邻节点特征相似异常时被分离。在实际桥梁检测中该方法成功识别了3次因锚头松动导致的索力异常比单根拉索独立阈值法提前2~3天发现征兆。,import torchimport torch.nn as nnimport torch.nn.functional as Fimport numpy as npfrom scipy.linalg import solve_lyapunovclass ExtendedKalmanFilter:def __init__(self, F, H1, H2, Q, R1, R2, P0):self.F F # 状态转移矩阵self.H1 H1 # 振动法观测矩阵self.H2 H2 # 磁通量观测矩阵self.Q Qself.R1 R1self.R2 R2self.P P0self.x np.zeros((F.shape[0], 1))def predict(self):self.x self.F self.xself.P self.F self.P self.F.T self.Qdef update_vibration(self, z1):K self.P self.H1.T np.linalg.inv(self.H1 self.P self.H1.T self.R1)self.x self.x K (z1 - self.H1 self.x)self.P (np.eye(len(self.P)) - K self.H1) self.Pdef update_magnetic(self, z2):K self.P self.H2.T np.linalg.inv(self.H2 self.P self.H2.T self.R2)self.x self.x K (z2 - self.H2 self.x)self.P (np.eye(len(self.P)) - K self.H2) self.Pdef get_force(self):return self.x[0,0]class LSTMForcePredictor(nn.Module):def __init__(self, input_dim3, hidden_dim64, num_layers2, output_dim1):super().__init__()self.lstm nn.LSTM(input_dim, hidden_dim, num_layers, batch_firstTrue, dropout0.2)self.fc nn.Linear(hidden_dim, output_dim)def forward(self, x):out, _ self.lstm(x)out self.fc(out[:, -1, :])return outclass GraphAttentionLayer(nn.Module):def __init__(self, in_dim, out_dim, alpha0.2):super().__init__()self.W nn.Linear(in_dim, out_dim, biasFalse)self.a nn.Parameter(torch.zeros(2*out_dim, 1))nn.init.xavier_uniform_(self.a)self.leaky_relu nn.LeakyReLU(alpha)def forward(self, H, adj):# H: (B, N, in_dim)Wh self.W(H) # (B, N, out_dim)N Wh.shape[1]a_input torch.cat([Wh.unsqueeze(2).repeat(1,1,N,1), Wh.unsqueeze(1).repeat(1,N,1,1)], dim-1) # (B,N,N,2*out)e self.leaky_relu(torch.matmul(a_input, self.a).squeeze(-1)) # (B,N,N)# 掩码只保留邻接边e e.masked_fill(adj 0, -1e9)attn F.softmax(e, dim-1)out torch.matmul(attn, Wh)return outclass CableGAT(nn.Module):def __init__(self, node_dim2, hid_dim32, num_classes2):super().__init__()self.gat1 GraphAttentionLayer(node_dim, hid_dim)self.gat2 GraphAttentionLayer(hid_dim, hid_dim)self.fc nn.Linear(hid_dim, num_classes)def forward(self, H, adj):x self.gat1(H, adj)x F.elu(x)x self.gat2(x, adj)anomaly_score torch.softmax(self.fc(x), dim-1)[:,:,1] # 异常概率return anomaly_scoredef contrastive_loss(embeddings, adj, temperature0.5):# 正样本相邻节点对负样本非相邻节点对embeddings F.normalize(embeddings, dim-1)sim torch.matmul(embeddings, embeddings.T) / temperaturepos_mask adj 0pos_sim sim[pos_mask].mean()neg_mask (adj 0) (~torch.eye(adj.shape[0], dtypebool, deviceadj.device))neg_sim sim[neg_mask].mean()loss -torch.log(torch.exp(pos_sim) / (torch.exp(pos_sim) torch.exp(neg_sim)))return loss如有问题可以直接沟通
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2570592.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!