SMA驱动的空间杆系结构地震响应控制模型试验与理论分析【附代码】
✨ 长期致力于形状记忆合金、优化设计、触发开关、主/被动混合控制、振动台试验研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(1)加载速率与幅值修正的分段线性本构模型:
基于奥氏体SMA(NiTi)的循环拉伸试验,将应力-应变曲线分为四段:弹性段、相变起始段、相变平台段和硬化段。引入加载速率修正因子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_select=10): self.n = n_candidates self.n_select = n_select creator.create('FitnessMin', base.Fitness, weights=(-1.0,)) creator.create('Individual', list, fitness=creator.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, indpb=0.05) toolbox.register('select', tools.selTournament, tournsize=3) pop = toolbox.population(n=50) algorithms.eaSimple(pop, toolbox, cxpb=0.7, mutpb=0.2, ngen=50, verbose=False) best = tools.selBest(pop, 1)[0] return [i for i, val in enumerate(best) if val==1]