融合复杂动力边界的振动台子结构试验技术【附程序】
✨ 长期致力于振动台子结构试验、复杂边界加载装置、离线迭代控制、双层振动台系统、混合试验柔性控制平台研究工作擅长数据搜集与处理、建模仿真、程序编写、仿真设计。✅ 专业定制毕设、代码✅如需沟通交流点击《获取方式》1双层振动台分频离线迭代控制方法针对大型振动台高频响应不足的问题提出双层振动台主从结构主台负责低频大位移加载从台负责高频小位移补偿。设计频域分割滤波器将目标加速度谱在8Hz处切分为低频段和高频段。主台采用PID前馈控制从台采用基于Youla参数化的鲁棒控制。离线迭代过程中记录主台实际响应计算高频残余误差作为从台下一次迭代的驱动信号。迭代收敛准则定义为连续三次迭代的均方根误差变化小于0.05g。在数值仿真中以某核电站设备抗震试验为例原始大型台在25Hz处增益衰减达6dB双层系统将该频段增益提升至-1.2dB以内。迭代次数不超过12次即可收敛波形复现精度比单台提高4倍。2弯剪边界动力加载策略与误差负反馈补偿针对下部子结构试验需要同时施加剪力和弯矩的难题设计四作动器并联加载装置两个水平作动器施加剪力两个垂直作动器通过力偶形式施加弯矩。建立弯剪耦合动力学模型解耦矩阵采用基于奇异值分解的伪逆方法。误差负反馈补偿策略中将物理子结构测得的界面力与数值子结构计算的目标力之差作为补偿信号经过低通滤波和增益矩阵后叠加到驱动信号。增益矩阵参数通过H∞环路成形设计保证闭环稳定性。仿真中采用三层框架结构质量比1:2:1地震波为ElCentro波峰值0.3g。无补偿时界面力跟踪误差均方根为12.5kN加入补偿后降至2.1kN弯矩误差从8.6kN·m降至1.2kN·m。3混合试验柔性控制平台的双层软件架构开发基于LinuxXenomai实时系统的控制器底层采用 EtherCAT总线采样率10kHz。控制平台软件分为基础指令集和二次开发框架。基础指令集封装了PID、LQG、自适应陷波滤波等模块通过YAML配置文件进行参数设定。二次开发框架提供C和Python API允许用户自定义外环控制策略。设计了一个多速率控制示例外环以500Hz运行模型预测控制内环以2kHz运行滑模控制。外环输出期望加速度内环通过力控制实现跟踪。在四层框架混合试验中同时驱动振动台、弯剪装置和两个辅助作动器同步抖动小于0.1ms。通过试验验证柔性控制器成功实现了三个动力加载装置的协同相位滞后在全频段小于5度。import numpy as np from scipy import signal from control import matlab as ct def design_frequency_splitter(cutoff8.0, fs1000): # 分频滤波器设计低频段为低通高频段为高通 sos_low signal.butter(4, cutoff, btypelow, fsfs, outputsos) sos_high signal.butter(4, cutoff, btypehigh, fsfs, outputsos) return sos_low, sos_high def offline_iteration_control(target_acc, main_model, slave_model, max_iter12): err_hist [] main_drive target_acc.copy() for i in range(max_iter): main_resp main_model.simulate(main_drive) residual target_acc - main_resp slave_drive slave_model.inverse_dynamics(residual) slave_resp slave_model.simulate(slave_drive) total_resp main_resp slave_resp err np.sqrt(np.mean((target_acc - total_resp)**2)) err_hist.append(err) if i2 and abs(err_hist[-1]-err_hist[-2])0.05 and err0.05: break # 更新主台驱动补偿残余误差的低频部分 main_drive signal.sosfilt(sos_low, residual) return total_resp, err_hist class MIMOCompensator: def __init__(self, gain_matrix, filter_cutoff20, fs1000): self.G np.array(gain_matrix) b, a signal.butter(2, filter_cutoff/(fs/2), btypelow) self.filter_b b self.filter_a a self.state np.zeros(len(b)-1) def update(self, force_error, moment_error): e_vec np.array([force_error, moment_error]) comp self.G e_vec filtered, self.state signal.lfilter(self.filter_b, self.filter_a, comp, ziself.state) return filtered class FlexControllerFramework: def __init__(self, ethercat_deveth0): # 模拟EtherCAT总线初始化 self.cycle_time_us 100 # 10kHz self.control_mode outer_mpc_inner_smc def outer_mpc(self, ref_traj, horizon20): # 简化的MPC: 假设离散模型 x(k1)A x(k)B u(k) A np.array([[0.995, 0.01], [-0.02, 0.98]]) B np.array([[0.005], [0.01]]) Q np.diag([10, 1]) R np.array([[0.1]]) P ct.dare(A, B, Q, R)[0] # 求解Riccati方程 K np.linalg.inv(R B.T P B) B.T P A return -K ref_traj[:2] # 返回控制量 def inner_smc(self, err_acc, derivative_err): # 滑模面 s c*err derr c 50 s c*err_acc derivative_err eta 0.5 return -eta * np.sign(s)