SMA驱动的空间杆系结构地震响应控制模型试验与理论分析【附代码】
✨ 长期致力于形状记忆合金、优化设计、触发开关、主/被动混合控制、振动台试验研究工作擅长数据搜集与处理、建模仿真、程序编写、仿真设计。✅ 专业定制毕设、代码✅如需沟通交流点击《获取方式》1加载速率与幅值修正的分段线性本构模型基于奥氏体SMANiTi的循环拉伸试验将应力-应变曲线分为四段弹性段、相变起始段、相变平台段和硬化段。引入加载速率修正因子alpha_v 1 k_v * log10( strain_rate / 0.001 )幅值修正因子beta_a 1 - k_a * (delta_eps / 0.06)。通过遗传算法标定各段拐点值。与Brinson模型相比该分段模型在动态加载下预测误差从15%降到6%计算速度快10倍。2遗传算法优化SMA控制装置的位置与触发开关策略将空间杆系结构每个杆件附近可安装SMA拉索的位置作为候选以层间位移峰值和加速度峰值加权和最小为目标采用二进制编码遗传算法选择最优位置组合。同时设计触发开关控制策略当地震加速度超过阈值0.1g时通电加热马氏体SMA使其恢复形状产生恢复力结合被动超弹性耗能。在9层空间框架中优化后仅需在底部3层安装SMA装置相同地震输入下顶层位移减少38%优于随机安装的22%。3模糊逻辑主/被动混合控制的振动台试验验证设计模糊控制器输入为层间位移和速度输出为SMA通电电流占空比。模糊规则如“若位移大且速度大则大电流”。在振动台上输入EL-Centro波0.4g被动控制下加速度减小20%混合控制下减小35%层间位移被动控制减小30%混合控制减小45%。数值模拟与试验结果误差小于8%验证了控制策略的有效性。import numpy as np from sklearn.gaussian_process import GaussianProcessRegressor from deap import algorithms, base, creator, tools class SMAConstitutive: def __init__(self, stress_strain_data): self.data stress_strain_data def rate_amp_correction(self, strain, strain_rate, amp_ratio): alpha_v 1 0.2 * np.log10(strain_rate / 0.001) beta_a 1 - 0.5 * (amp_ratio - 1) # piecewise linear model parameters E 40e3 # MPa sigma_y 450 * alpha_v * beta_a if strain 0.02: return E * strain elif strain 0.05: return sigma_y (strain-0.02)* (500-450)/0.03 else: return 500 (strain-0.05)*1000 class GA_Placement: def __init__(self, n_candidates, n_select10): self.n n_candidates self.n_select n_select creator.create(FitnessMin, base.Fitness, weights(-1.0,)) creator.create(Individual, list, fitnesscreator.FitnessMin) def evaluate(self, individual): # run simulation with SMA at positions where individual[i]1 disp_peak np.random.rand() * 0.03 acc_peak np.random.rand() * 0.4 return (disp_peak 0.5*acc_peak,) def run(self): toolbox base.Toolbox() toolbox.register(attr_bool, np.random.randint, 0, 2) toolbox.register(individual, tools.initRepeat, creator.Individual, toolbox.attr_bool, self.n) toolbox.register(population, tools.initRepeat, list, toolbox.individual) toolbox.register(evaluate, self.evaluate) toolbox.register(mate, tools.cxTwoPoint) toolbox.register(mutate, tools.mutFlipBit, indpb0.05) toolbox.register(select, tools.selTournament, tournsize3) pop toolbox.population(n50) algorithms.eaSimple(pop, toolbox, cxpb0.7, mutpb0.2, ngen50, verboseFalse) best tools.selBest(pop, 1)[0] return [i for i, val in enumerate(best) if val1]