什么是响应谱分析?
响应谱分析是一种近似评估结构在短暂的瞬时冲击事件下所能产生的极值响应的响应分析方法。由于响应谱分析是基于模态分析的结果进行线性叠加,其计算代价远低于瞬态冲击时程分析,因此被广泛应用于建筑抗震,公路桥梁,航天器类产品,车载产品设计中。
之前我在技术邻的课程中已经有针对建筑抗震的响应谱分析(基于Abaqus)。
对于仿真而言,响应谱分析的设置是极其简单的,但仅仅会做仿真操作,则知其然不知其所以然。尤其在电子产品行业(例如机载设备,车载设备等),因为不同行业的标准有所不同,以及对响应谱本身的理解还是比较模糊,我还是经常收到一些提问。因此,本文尝试做一些总结——从响应谱的原理到如何获得响应谱曲线,其中有任何错误,请随意吐槽。
更通俗的理解响应谱分析
对于产品设计者而言,最终关心的是产品本身能否承受特定的冲击碰撞,但真实的冲击无论是试验还是仿真都难以实现,响应谱分析就是一种快速廉价的产品抗冲击性能评估手段。也方便制定标准以评估来自不同厂家的设备,因此现实生活中,响应谱分析往往来自甲方爸爸的要求。
例如你要研发一款用于航天器上的电子设备,就需要参考标准提供的响应谱,而标准的制定则来自实际的工程场景:
“航天器类产品在研制、运输、工作阶段,结构经历各种类型冲击环境,比如发动机点火冲击、爆炸冲击、再入大气及高速气动力造成的冲击等,冲击载荷对产品结构的强度、刚度造成致命影响,因此在产品设计阶段一般要通过抗冲击设计和采取冲击防护设计(如减震)来提高在冲击载荷作用下的可靠性。
很多产品在设计方案中会提供冲击载荷输入条件,主要通过地面冲击试验和有限元分析来完成。
最初,采用跌落冲击、气动冲击台进行经典波形冲击模拟,从半正弦波到锯齿波、梯形波,波形类型越来越多。然而实际工程中遇到冲击波类型大多数是复杂震荡波,是随机的,在试验及仿真分析是难以实现的。于是,在工程中提出冲击响应谱概念,并以此作为描述冲击环境对产品的作用效果和试验条件的参数。”
——以上来源:《航天器的冲击谱模拟试验方法》
所以,无论你的产品是要放在汽车,船舶,飞船还是飞机上工作,还是产品的包装运输环节,都可能会有要进行响应谱分析(以及PSD随机响应分析)的要求。
如何获得响应谱曲线?
一个最常见的问题是,到底要输入什么样的响应谱曲线?
仿真工程师需要的响应谱长这样:
而甲方对于冲击脉冲输入的要求,很可能是这样:半正弦脉冲:30g,持续时间11ms 。
我们可以参考相应的标准来帮助理解,例如以上要求来自于:
GJB 150.18-1986 军用设备环境试验方法(P180-181):本项试验适用于装在飞行器及地面设备在使用和装卸中预期可能遭收到的非重复性冲击。
标准中给出了冲击波脉冲的波形,但这是一个时域的瞬态冲击,当然我们可以采用瞬态求解,但这样费事费力,那么应该如何将脉冲波转换为响应谱呢?
在我技术邻的课程中,介绍了如何用网上下载的崔老师的一个小程序将地震时程曲线转换为响应谱曲线,但没有深入介绍其内部原理。
为了帮助加深对响应谱分析的理解,我们需要从原理上理解响应谱。
从原理上理解响应谱
响应谱曲线是单自由度系统在基础冲击激励下的峰值响应,其横坐标为单自由度系统的频率,纵坐标为峰值响应。
下图很形象的表现了这个过程——在系统的底部施加冲击力时程曲线,其上方有多个单自由度弹簧振子,它们的固有频率从1到n,各不相同,记录各个弹簧振子在瞬态分析中的峰值响应Xi(可以是加速度、速度、位移形式),画出Xi与固有频率的关系曲线,即响应谱曲线。
为了构建固有频率从1到n各不相同的单自由度弹簧振子,采用标准化定义:
其中弹簧振子质量mi均为1,粘性阻尼比均为ζ,仅刚度Ki(wi为固有频率)不同。
单自由度的系统方程可通过下面的推导:
为弹簧振子系统设定不同阻尼比,即获得不同阻尼比转态下的响应谱曲线。
理论上可以通过瞬态仿真来提取响应谱曲线,但这样太麻烦了,所以通常都用代码实现。
生成响应谱的代码
基于以上原理和公式,可以编写代码生成冲击脉冲的响应谱。但没有必要自己从头写,可以在网上搜索到代码,但许多是基于Matlab的,我没有用Matlab,只安装了python, 好在有ChatGPT, 可以直接让它帮我转换成我要的Python格式~
以下为主干部分,主要通过循环和传递函数建立单自由度系统,并提取各固有频率及对应的最大加速度响应。
以下为实际运行效果,随便定义了一个峰值为100g,持续时间为100ms脉冲波:
将每个单自由度弹簧振子系统的加速度响应曲线绘制如下:
提取每条曲线的峰值作为Y值,该振子的固有频率为X值,绘制响应谱曲线如下:
完整的贴在这里啦~ 我没什么编代码基础,都是ChatGPT按照指示修改的,也许不beautiful,有点啰嗦,但是能用。也可以尝试复制给ChatGPT, 让它修改代码,将这里的半正弦波脉冲修改为锯齿脉冲波。
完整代码 in python
功能:生成一个用户自定义峰值和周期的半正弦波脉冲的响应谱曲线
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import lsim, TransferFunction
def half_sine_pulse(t, amplitude, duration):
# Generate a half-sine pulse signal
pulse = amplitude * np.sin(np.pi * t / duration)
pulse[t >= duration] = 0
return pulse
def response_spectrum(sys, pulse, t):
# sys: 传递函数
# pulse: 脉冲信号
# t: 时间序列
t_sin, R_sin, x_state = lsim(sys, pulse, t)
return R_sin
def main():
# User input for the half-sine pulse
amp_sn = float(input("请输入半正弦波的峰值(单位:g):"))
duration = float(input("请输入半正弦波的持续时间(单位:秒):"))
# Time vector
Tf = 1 * duration # 总时长
Ts = duration / 128
t, dt = np.linspace(0, Tf, int(Tf / Ts), retstep=True)
pulse = half_sine_pulse(t, amp_sn, duration)
plt.figure(2)
plt.plot(t, pulse)
f = []
D = []
for fn in range(1, 1001):
# %%%%动力学微分方程参数%%%%%%%%%%
# fn = 100
wn = 2 * np.pi * fn
m = 1
k = m * wn ** 2
g = 0.05 # 阻尼比
c = 2 * g * wn * m
# %%%%%%%%构建基础运动激励的传递函数G(s) = (cs+k)/(ms^2+cs+k)%%%%%%%%
num = [c, k] # 传递函数分子
den = [m, c, k] # 传递函数分母部分
sys = TransferFunction(num, den) # 组成传递函数
# %%%%%%%%sys的加速度响应
R_sin = response_spectrum(sys, pulse, t)
# 提取fn以及最大响应
f.append(fn)
D.append(max(R_sin))
plt.figure(3)
plt.plot(t, pulse, t, R_sin)
plt.grid()
plt.legend(['Half-Sine', f'sys_Response with— fn={fn}'])
np.savetxt('RSA.csv', np.column_stack((f, D)), delimiter=',')
np.savetxt('Half_sin.csv', np.column_stack((t, pulse)), delimiter=',')
plt.figure(4)
plt.plot(f, D)
plt.grid()
plt.xlabel('Nature Frequency')
plt.ylabel('RSA')
plt.show()
if __name__ == '__main__':
main()
Copyright © 2021 .长沙麦涛网络科技有限公司 All rights reserved.
湘ICP备20015126号-2
联系我们