简介:面向振动控制、噪声抑制与能量采集等研究场景,这套基于铁木辛柯梁理论建立的MATLAB仿真资源,围绕含平移谐振器的超材料梁模型,可帮助研究者及高年级学生从建立单元矩阵出发,逐步复现频散曲线、禁带位置与振动模态等关键结果。相较欧拉-伯努利梁,该模型计入了剪切变形与转动惯量,更适合短粗梁或高频振动工况。压缩包内仅1个m脚本文件,资源总量为1KB,代码量虽小却覆盖矩阵组装、特征值求解与后处理等核心步骤,适合作为二次开发的轻量级起点。目前已有177人下载学习。借助脚本,读者不仅能快速理解铁木辛柯梁与超材料耦合的建模思路,还能通过修改谐振器刚度、质量比或单元尺寸,观察带隙随参数移动的规律;在此基础上可进一步扩展为振动隔离器、高灵敏度传感器或周期结构波动控制的预研工具,是超材料动力学仿真入门与教学演示的高效素材。
1. 超材料梁项目里的 Timoshenko:不是加个名字那么轻巧
如果你在本地拉下一个名字叫Timoshenko_MetaBeam_Translational_Resonators_timoshenko_metamate的工程文件,第一件事往往是想搞清楚标题里的三样东西拼在一起到底在算什么。简单说,这是一根周期性设计的梁,每隔一段距离就挂一个只做横向平移运动的谐振子,利用谐振子的局域共振在梁的色散关系里打开一段“波传不过去”的频率区间——也就是带隙。这个方向这些年很热,因为梁、板类结构减振降噪最缺的就是不靠加质量、不靠粘滞阻尼就能挡住一段频率的办法。选 Timoshenko 梁而不是更省事的欧拉-伯努利梁,不是因为追求理论复杂度,而是高频段和谐振子耦合之后,剪切变形和转动惯量对带隙位置的影响已经大到不能忽略。这篇就按一个工程师的视角,把方程、离散、代码和踩坑一次讲透。
2. 把色散方程改写成带平移谐振子的 Timoshenko 梁
做超材料梁的第一步不是写代码,而是先把梁的波动方程定下来。梁理论选错,后面所有带隙边界都是自欺欺人。
2.1 欧拉-伯努利梁在哪个环节先撑不住
欧拉-伯努利梁方程只有弯曲挠度一个变量,假设截面始终垂直于中性轴,也就是完全忽略剪切变形和截面转动惯量。低频、细长梁、波长远远大于截面尺寸时,这个假设误差很小,工程估算完全够用。但是超材料梁的谐振子频率通常设计在几百到几千赫兹,梁的单胞长度只有几十毫米,此时弯曲波波长已经缩短到可以和截面高度相比的程度。梁截面的剪切变形不再是可忽略的修正项,而是直接参与色散关系的主导项。
另一个更隐蔽的问题是转动惯量。谐振子挂到梁上之后,梁截面除了横向移动还有转角振动,转角对应的惯性力在高频下会明显改变波速。欧拉-伯努利梁没有这个自由度,计算出来的带隙位置会整体偏高,带宽也会被高估。我见过不止一个同学拿欧拉-伯努利公式估算带隙,然后到有限元里一验算,发现共振峰偏移了百分之十几,第一反应是软件设置问题,折腾半天才回头换理论模型。
2.2 Timoshenko 梁的两个额外刚度和一个关键比例
Timoshenko 梁用两个场变量:横向挠度 (w(x,t)) 和截面转角 (\psi(x,t))。控制方程在简谐激励下可以写成:
[ GA\kappa\left(w''-\psi'\right)+\rho A\omega^2 w = F_{\text{res}} ]
[ EI\psi''+GA\kappa\left(w'-\psi\right)+\rho I\omega^2\psi = 0 ]
其中 (GA\kappa) 是剪切刚度,(G) 为剪切模量,(A) 为截面积,(\kappa) 是剪切修正系数;(EI) 是弯曲刚度;(\rho A) 是线密度,(\rho I) 是转动惯量。右边 (F_{\text{res}}) 是平移谐振子对梁的反力。
在数值实现里,还有一个无量纲量要心里有数:剪切刚度与弯曲刚度的比值 (GA\kappa / (EI k^2))。这个比值随波数增大而减小,也就是说波长越短,剪切效应越显著。带隙计算本来就要扫描一整个频率范围,高频段正好撞在剪切效应最强的区域,所以不能只当它是个高阶修正。
2.3 平移谐振子如何进入梁的波动方程
平移谐振子是一个质量 (m_r) 通过弹簧 (k_r) 悬挂在梁上,只沿横向振动,不参与梁的转动。它的绝对位移记为 (x_r),梁的挠度为 (w),那么弹簧伸长量是 (x_r-w)。谐振子的运动方程是:
[ m_r \ddot{x}_r + k_r(x_r-w)=0 ]
设所有量都按 (e^{-i\omega t}) 变化,可以解出 (x_r) 与梁挠度 (w) 的关系,再把弹簧力反推给梁:
[ m_{\text{eff}}=\frac{m_r k_r}{k_r-m_r\omega^2} ]
这个等效质量在 (\omega=\sqrt{k_r/m_r}) 处变号。低于谐振频率时它是正的,相当于给梁增加质量;高于谐振频率时它是负的,负等效质量会使波的传播条件发生根本改变。带隙的形成本质上就是负等效质量让某个频段内波数变成复数,波只能衰减,不能无损耗地传播。这里要提醒一句:负等效质量是“等效”出来的,不是梁真的变成了负质量。实际系统能量守恒,只是谐振子的动能和势能在该频段内与梁的波动模式交换得过于剧烈,宏观上表现为波被“锁住”了。
2.4 带隙中心和宽度的一阶估计
把 (m_{\text{eff}}) 代回 Timoshenko 梁的频散方程,不需要解数值也能得到很大的判断:带隙中心一定在谐振频率 (f_r=\frac{1}{2\pi}\sqrt{k_r/m_r}) 附近。带宽则主要由两个无量纲参数控制:
- 质量比 (\beta=m_r/(\rho A a)),其中 (a) 是单胞长度。质量比越大,带隙越宽,代价是单位长度梁的附加质量变大。
- 频率比 (\alpha=f_r / f_{\text{beam}}),其中 (f_{\text{beam}}) 是基础梁该单胞长度的某阶特征频率。频率比决定带隙落在基础梁色散曲线的哪一段。
做初步设计时,我会先用这个解析关系扫描参数空间,把谐振子质量和谐振频率定个大概,再用完整数值模型细算。直接上来就建有限元模型,效率太低,而且参数扫不出来。
3. 单胞离散与自由度凝聚:Floquet-Bloch 周期条件怎么接
理论方程清楚之后,下一步是把无限长周期梁化为一个单胞的频域问题。常见做法是有限元加 Floquet-Bloch 周期条件,这套组合在超材料梁里几乎是标准的。
3.1 二节点 Timoshenko 梁单元的自由度与刚度矩阵
每个单胞长度 (a) 内取一个二节点梁单元,每个节点两个自由度:横向位移 (w) 和截面转角 (\psi)。单元两端共四个自由度,加上谐振子位移 (x_r),整个单胞有五个未知数。梁单元的刚度矩阵和质量矩阵可以从 Timoshenko 梁的形函数推出来,但要注意不要随手拿欧拉-伯努利梁单元去改。欧拉-伯努利梁单元的转角是挠度的导数,而 Timoshenko 单元里转角是独立插值的,自由度语义完全不同,混用会导致刚度矩阵奇异。
单元质量矩阵里包含了 (\rho I) 对应的转动惯量项,这部分在低频时感觉不出来,但在谐振子频率附近会显著影响色散曲线的高频分支。如果你的有限元模型里转动惯量是零,相当于把第二式里的 (\rho I\omega^2\psi) 项丢掉了,算出来的不是完整的 Timoshenko 梁。
3.2 把谐振子凝聚成动态等效弹簧
在频域里做自由度凝聚很方便:谐响应下,谐振子的位移 (x_r) 可以先用梁节点位移表示出来,然后把它消掉,只剩下梁的四个自由度。等效质量 (m_{\text{eff}}) 前面已经推过,这里直接把它加到梁单元横向自由度对应的位置即可。
实际操作中,我喜欢在单元级做这个凝聚,而不是放到整体矩阵里再做。原因是每个单胞的谐振子参数可能不一样,比如为了展宽带隙故意让相邻单胞频率错开,这时候单元级凝聚能让不同单胞使用不同的等效质量矩阵,整体组装时仍然是一个标准带宽矩阵。
凝聚之后,单胞的动态刚度矩阵变成:
[ \mathbf{D}(\omega)=\mathbf{K}-i\omega\mathbf{C}-\omega^2\mathbf{M}+\mathbf{D}_{\text{res}}(\omega) ]
其中 (\mathbf{D}_{\text{res}}) 就是谐振子贡献的等效动态刚度。它随频率变化,所以整个问题不是一个标准的特征值问题,而是需要逐频率扫描求解。
3.3 Floquet-Bloch 周期条件怎么加
无限周期结构里,Bloch 定理要求单胞左右边界满足:
[ \mathbf{q}{\text{right}} = e^{i\mu} \mathbf{q}{\text{left}} ]
其中 (\mu) 是无量纲波数,它与物理波数 (k) 的关系是 (\mu=k a)。位移满足相移关系的同时,节点力也必须满足同样的相移。把这条件代入单胞方程,就得到一个关于 (\omega) 和 (\mu) 的非线性方程。扫频时,对每个 (\omega) 求解可使行列式为零的 (\mu) 值,或者反过来扫 (\mu) 求 (\omega)。
带隙的判据很直接:在某个频率区间内,对所有实数 (\mu) 都找不到实数频率解,那就是带隙。实际程序里更常见的做法是扫 (\mu) 从 0 到 (\pi),把每一支频率画出来,没有连续曲线的频段就是带隙。这个区间里波数变成复数,对应的是衰减波。
4. 用 Python 把带隙画出来:参数取值与结果判读
这里我给一个简化但能跑通的 Python 脚本。它不建模完整有限元,而是直接从第 2 章的连续色散方程出发,用解析方式求波数对频率的关系。这样能在几秒钟内看到带隙的大致位置,适合做参数预研。
4.1 最小可跑的色散求解脚本
import numpy as np import matplotlib.pyplot as plt # 材料参数:钢 E = 200e9 # 弹性模量,Pa nu = 0.3 rho = 7850.0 # 密度,kg/m^3 G = E / (2 * (1 + nu)) kappa = 5 / 6 # 矩形截面 Timoshenko 剪切修正系数 # 矩形截面尺寸 b = 0.02 # 梁宽,m h = 0.04 # 梁高,m A = b * h I = b * h**3 / 12 a = 0.1 # 单胞长度,m GAkap = G * A * kappa EI = E * I # 平移谐振子:质量和固有频率 mr = 0.08 # 谐振子质量,kg fr = 1500.0 # 谐振频率,Hz kr = mr * (2 * np.pi * fr)**2 # 扫描频率 freq = np.linspace(200, 4000, 1200) omega = 2 * np.pi * freq def dispersion_eq(S, w): """S = k^2, w = omega 返回 Timoshenko 梁 + 平移谐振子的色散方程残差""" meff = mr * kr / (kr - mr * w**2) term1 = GAkap * S - rho * A * w**2 + w**2 * meff term2 = EI * S + GAkap - rho * I * w**2 term3 = GAkap**2 * S return term1 * term2 - term3 wave_numbers = [] real_count = [] for w in omega: # 一元二次方程:A*S^2 + B*S + C = 0 meff = mr * kr / (kr - mr * w**2) Acoef = GAkap * EI Bcoef = - GAkap * rho * I * w**2 + EI * w**2 * (meff - rho * A) Ccoef = (w**2 * meff - rho * A * w**2) * (GAkap - rho * I * w**2) roots = np.roots([Acoef, Bcoef, Ccoef]) real_k = [] for r in roots: if abs(r.imag) < 1e-8 and r.real > 0: real_k.append(np.sqrt(r.real)) wave_numbers.append(real_k) real_count.append(len(real_k)) # 带隙判断:这一段频率没有实波数 bandgap = [] for i, cnt in enumerate(real_count): if cnt == 0: bandgap.append(freq[i]) if bandgap: print(f"带隙范围: {bandgap[0]:.0f} Hz ~ {bandgap[-1]:.0f} Hz")这个脚本把每根频率对应的实波数点全部画出来就是色散图,实波数数量为零的频率区间就是带隙。代码里最关键的是把 (S=k^2) 作为未知数,否则直接对 (k) 解非线性方程很容易因为铁木辛柯梁有两个传播分支而遗漏解。
4.2 三个必须说清楚的参数
第一,剪切修正系数 (\kappa)。脚本里取的是矩形截面经典值 (5/6),这是基于截面剪切应变能修正得到的。如果截面是圆形,更合理的取值是 (9/10);如果是工字形截面,需要用 Cowper 公式重新算,不能照抄矩形截面的数。
第二,谐振子质量与刚度比。上面脚本里 (m_r=0.08,\text{kg}),(f_r=1500,\text{Hz}),换算出的弹簧刚度大约是 (7.1 \times 10^6,\text{N/m})。这个刚度不算大,但要注意分布在 (0.1,\text{m}) 的单胞内,实际工程上可能要用柔软的连接件或者复合材料弹性层来实现,不能直接当理想弹簧处理。
第三,频率扫描范围。带隙不会离谐振频率太远,但 Timoshenko 梁的高阶分支可能在高频段引入第二个通带。扫描范围至少要覆盖到 (3) 倍谐振频率,否则你看到的“带隙”很可能是还没扫完造成的假象。
4.3 从输出结果里读带隙边界
运行脚本后,控制台会直接打印带隙范围。数值上你会发现带隙下边界低于 (1500,\text{Hz}),上边界高于 (1500,\text{Hz}),但并不是对称的。这符合物理直觉:低于谐振频率时,等效质量为正值,梁的有效线密度增加,弯曲波速下降;高于谐振频率时,等效质量为负,波需要一个更严格的传播条件,所以高频支更容易被截断。设计时如果发现带宽不够,首选的调参方向是增大 (m_r),其次是微调 (f_r) 让带隙落在你真正关心的频率区间。刮到这里,内存里已经能画出完整的带隙图。若需要更精细的曲线,把np.linspace的步数从 1200 增加到 5000,带宽边界会收敛到几赫兹的精度。
5. 避坑:剪切系数、负等效质量与采样密度这三个老坑
做这类项目最容易翻车的地方不在理论推导,而在一些看起来不起眼的参数和符号约定。这几条都是我实际排查过的,按现象、原因、解决三步写,方便直接对照。
5.1 带隙边界整体偏移,先查剪切修正系数
现象:用上面的脚本算带隙,谐振频率 (1500,\text{Hz}),但有限元或实验测到带隙中心落在 (1400,\text{Hz}) 附近,整体偏低 (6%) 左右。
原因:剪切修正系数取错是高发原因。矩形截面取 (5/6) 只在宽高比接近 1 时比较准,当梁高 (h) 明显大于宽 (b) 时,截面上的剪切应力分布更不均匀,实际剪切刚度比 (5/6) 还要小。剪切刚度降低,等效的梁波速变慢,色散曲线整体下移,带隙跟着低走。
解决:先用 Cowper 公式计算矩形截面的 (\kappa) 再代入。常见矩形截面宽高比 1 到 10 之间的 (\kappa) 大约在 (0.833) 到 (0.83) 之间,变化不算大,但工字形截面可能低到 (0.4),绝不能忽视。验证方法是把 (\kappa) 调成 1.0 和调成 0.5 各算一次,看带隙边界的偏移范围,如果偏了超过你接收的误差,就必须修正。
5.2 谐振子频率附近出现异常尖峰,检查负等效质量的正负号
现象:色散曲线在 (1500,\text{Hz}) 附近突然出现一条几乎垂直的窄带,看起来像带隙,但受迫响应计算里这个频段振幅反而增大。
原因:(m_{\text{eff}}) 的表达式里,(k_r-m_r\omega^2) 在 (\omega>\omega_r) 时为负,等效质量为负。如果你在代码里写成 (m_{\text{eff}}=m_r k_r / (k_r + m_r \omega^2)),高频段等效质量永远是正的,谐振子对梁的耦合性质就被彻底改掉了。这种符号错误不会让程序报错,但带隙会消失,取而代之的是共振反共振交替的假象。
解决:在代码里加一个自检:打印 (\omega > \omega_r) 时的等效质量,确认它是负值。更严谨的做法是直接保留复数表示,把 (m_{\text{eff}}) 写成表达式,不要在代入数值时手工化简出错。检查 (x_r) 与 (w) 的相位关系:低于谐振频率时同相,高于谐振频率时反相。
5.3 带宽边界随采样密度变化,频率步长惹的祸
现象:带隙边界每次加密频率步长后都不一样,带宽越收越窄,最后完全消失。
原因:这是一个典型的采样分辨率问题。谐振子频率附近,色散曲线的斜率很陡,带隙上下边界之间的频率落差可能只有几十赫兹。频率步长太大时,相邻两个采样点正好跨过整段带隙,程序会判断这一段“没有带隙”,或者带隙被切成几段。
解决:先把谐振频率附近做局部加密。比如np.linspace均匀扫全频段,然后加一次np.arange(omega_r/1.05, omega_r*1.05, 2*np.pi*2)的局部扫描。频率步长不要超过目标带隙宽度的 (1/10)。如果扫完后带隙仍有跳变,用对数频率间隔剖分,低频段稀疏、高频段密集,兼顾效率和稳定性。
5.4 有限元谐振子节点与梁自由度共用导致局部模态污染
现象:有限元模型里,谐振子质量块与梁连接点共享一个节点,结果在色散曲线中出现大量密集的局部模态,带隙区域被这些模态填满。
原因:建模时把谐振子质量做成梁节点上的集中质量,而不是独立的自由度。这样谐振子与梁之间失去了相对位移,局域共振机制直接失效,系统变成了周期性附加质量梁,而不是超材料梁。
解决:谐振子必须建立独立节点,并通过弹簧单元与梁节点连接。检查方式很简单:对单个单胞做模态分析,看谐振子模态频率是否等于设计频率 (f_r)。如果差得远,说明弹簧刚度或质量设置有问题。另一个保险做法是观察带隙内梁的应变能分布,如果应变能集中在谐振子弹簧上,说明局域共振机制正常。
6. 带隙边界怎么验证:一维受迫响应与三参数设计技巧
带隙在色散图上看出来了,但一个能交付的结论必须经过独立验证。最常用也最省事的验证方法是算一维受迫响应:取有限长的超材料梁,比如 10 个单胞,在一端施加单位横向简谐力,另一端读取横向位移响应,然后扫描频率。带隙频率处,响应幅值会比通带内低一到两个数量级,衰减量直接反映带隙的实际抑制能力。这个方法不需要实验设备,在有限元里就能完成,而且能直观地展示“带隙到底挡住了多少能量”。
验证时两个细节值得注意:一是激励点的位置尽量避开节点;二是响应点不要取在谐振子质量块上,而要取在梁本体上,否则会把谐振子自身的运动混进去。如果受迫响应里带隙区域的衰减没有出现,先回到色散图检查带隙是否真实存在,再检查边界条件是否引入了额外的波反射。
做完验证,设计调参就稳定了。我的习惯是只调三个参数,其他保持不变:质量比 (\beta=m_r/(\rho A a)) 控制带隙宽度,越大越宽,但结构总重增加;频率比 (\alpha=f_r/f_{\text{beam}}) 控制带隙中心位置;单胞长度 (a) 控制带隙落在色散曲线的哪一段,也影响 (\beta)。这三个参数不是独立的,先定 (\alpha) 把带隙挪到目标频率附近,再调 (\beta) 加宽,最后用 (a) 做微调。千万不要同时动谐振子刚度和质量,那样带隙位置和宽度一起变,出了问题根本分不清是哪个参数导致的。
这套流程我从解析估计到色散计算再到受迫响应验证,一条线走下来,基本不会出现算出来带隙很漂亮但工程上没法用的情况。Timoshenko 梁模型的细节比欧拉-伯努利多,但正是这些细节决定高频段计算到底准不准。希望帮到你。
本文还有配套的精品资源,点击获取