
悬臂梁连续体振动模型是结构动力学里最经典的分布参数问题也是我每年都会拿出来重新跑一遍的“基本功”。所谓连续体就是不把梁拆成有限个弹簧和质量块而是把整根梁看作质量和刚度连续分布的弹性体用偏微分方程直接描述它在任意位置、任意时刻的横向振动行为再用Matlab完成特征方程求解、振型计算和自由振动响应的模拟。这套模型看起来偏理论实际上工程价值非常直接悬臂梁结构在机械臂、精密平台、叶片简化模型里到处都是有了连续体解析解你才能给有限元结果、实验数据一个可靠的对照基准。这篇内容适合两类人。一类是刚接触结构振动、想用代码把欧拉-伯努利梁跑通的学生另一类是平时用ANSYS、Abaqus做分析但对解析解感到陌生、想回头验证一下手头模型的工程师。我会从方程推导一直讲到可运行的Matlab代码再把求根、振型、时程响应这些环节里容易踩的坑挨个说清楚。Matlab版本要求不高R2019b以上就够也不需要任何额外工具箱。1. 为什么先选连续体模型1.1 三种建模方式到底差在哪我不止一次被问到既然有限元软件这么强为什么还要花时间推导连续体解析解我的回答通常是先看下面这张对比逻辑模型类型基本思路优势短板连续体模型整根梁用PDE描述质量刚度连续分布解析解精确振型正交、物理意义清晰只适合规则几何、简单边界集中质量模型梁离散成若干质量块加无质量弹簧直观、手算可行精度依赖分段数高阶误差明显有限元模型单元离散化形函数近似位移场适用复杂结构、载荷、边界条件网格敏感结果需要收敛性验证很多初学者以为有限元是“更先进的”连续体方法这个理解对但不完整。实际上经典有限元正是从连续体方程出发做离散逼近的它和解析解的关系是近似与精确的关系不是两个独立流派。你一旦理解了连续体解再看有限元里位移形函数、刚度矩阵怎么组装、为什么加密网格会逼近同一个频率思路会完全不同。还有一个常被忽视的点连续体模型拥有无穷多阶固有频率和振型这是它的本质特性也是离散模型理解起来最困难的地方。集中质量模型给N个自由度就只能得到N阶固有频率而一根实际梁的振动频带理论上一直延伸到无穷。高阶模态对冲击响应、声辐射这类问题的影响非常大如果从一开始只停留在“有限自由度”的思维里后面做减振降噪会有很大的认知盲区。1.2 欧拉-伯努利梁的适用边界要心里有数用连续体模型求解悬臂梁默认采用的是欧拉-伯努利梁理论。它有两个核心假设第一变形前垂直于中性轴的截面变形后仍然垂直于中性轴对应“平截面假设”第二忽略剪切变形和截面转动惯量梁的弯曲仅由弯矩引起。这意味着这套解析解对“细长梁”很准对“深梁”则可能跑偏。工程上常用长细比 L/h 来判断当 L/h 大于10甚至20时一阶低阶模态的剪切变形影响通常很小欧拉-伯努利梁理论已经足够当 L/h 小于5或者关心高频高阶模态时就需要考虑铁木辛柯梁理论它额外引入了剪切变形和转动惯量两个修正项。我们后面算例用的梁长度1米、高度0.01米长细比100完全落在欧拉-伯努利梁的舒适区。如果你拿同样的代码去算一根又粗又短的悬臂梁就会发现解析频率比有限元结果偏高因为真实梁的剪切变形降低了等效刚度。这一点务必提前记住省得后面拿着代码到处套用出问题。2. 连续体振动的核心方程与推导逻辑2.1 四阶偏微分方程是怎么来的要写出悬臂梁横向自由振动的连续体方程过程并不复杂核心就两步。第一步是微元体力平衡。取长度为 dx 的梁微元横向剪力 V 和惯性力 ρA dx·∂²w/∂t² 平衡得到剪力沿梁长的导数关系。第二步是弯矩与曲率的关系M EI·∂²w/∂x²而剪力又是弯矩的导数V ∂M/∂x。把这两个关系代入平衡方程消去剪力和弯矩就得到著名的欧拉-伯努利梁自由振动方程EI·∂⁴w/∂x⁴ ρA·∂²w/∂t² 0注意这里 w 是梁的横向位移EI 是抗弯刚度ρA 是单位长度质量。方程里每一项的物理意义都很明确第一项描述弯曲变形带来的弹性恢复力第二项描述微元的惯性力。整体上就是“惯性力 弹性力 0”和弹簧振子方程 ma kx 0 异曲同工区别只是这里每个无穷小微元都在参与振动物理系统。2.2 分离变量空间振型和时间简谐连续体方程是偏微分方程直接求解不方便所以用分离变量法假设w(x,t) W(x)·q(t)这里 W(x) 只决定梁的振型形状q(t) 只决定这个形状随时间如何变化。把上式代回方程整理后可以得到两个常微分方程。其中一个方程的解就是简谐运动q(t) ω²q(t) 0这说明一旦梁按某个振型自由振动它在该振型上的时间响应就是正弦或余弦函数。另一个方程是关于 W(x) 的四阶常微分方程如果定义无量纲参数β⁴ ω²ρA/(EI)就可以得到 W⁗(x) - β⁴W(x) 0。这个四阶常微分方程的通解是双曲正弦、双曲余弦、正弦、余弦四个基函数的线性组合。到这里后续所有代码都围绕这个通解和四个边界条件展开。2.3 边界条件如何浓缩成特征方程悬臂梁的边界条件一共四个固定端位移和转角为零自由端弯矩和剪力为零。写成数学形式是W(0)0, W(0)0, EI·W(L)0, EI·W(L)0把通解代入这四个条件会得到一个关于待定系数的齐次线性方程组。这个方程组要有非零解系数行列式必须等于零。经过一番整理最终得到的不是频率方程而是关于无量纲参数 r βL 的一个超越方程cos(r)·cosh(r) 1 0这个方程没有闭合解只能数值求解。它每一组根对应一阶固有模态根从小到大依次排列就对应第一阶、第二阶、第三阶……的振动模式。得到特征根 r_n 后固有圆频率由下式给出ω_n r_n² · sqrt(EI/(ρA·L⁴))对应的振型函数为W_n(x) cosh(β_n x) - cos(β_n x) k_n·(sin(β_n x) - sinh(β_n x))其中 k_n (cosh(r_n) cos(r_n))/(sinh(r_n) sin(r_n))。这里我提醒一句不同教材振型函数写法可能略有差异有的用正号有的用负号但本质是同一个公式因为 k_n 的取值会跟着调节最后画出来的归一化振型是完全一致的。你只要选定一种自洽的写法从特征方程到振型一路用到底就不会出问题。3. Matlab代码实现一行行拆开讲3.1 参数设置与无量纲化思路写代码的第一步是定义结构和物理参数。我这里用钢制矩形截面悬臂梁做演示长度1米宽0.05米高0.01米。材料用结构钢弹性模量E210GPa密度ρ7850kg/m³。之所以选这组数据是因为它对应一条实实在在的钢尺算出来的频率量级大家可以凭直觉判断是否合理。在这个阶段我强烈建议先把无量纲特征根 r_n 求出来因为它和材料无关只由边界条件决定。这也是整个连续体模型里最有价值的部分。带物理量纲的频率换算放到后面再做否则一旦结果不对你根本分不清是方程推导错了还是单位换算错了。clear; clc; close all; % 悬臂梁几何与材料参数钢制矩形截面 E 210e9; % 弹性模量Pa rho 7850; % 材料密度kg/m^3 L 1.0; % 梁长m b 0.05; % 截面宽度m h 0.01; % 截面高度m A b*h; % 截面面积m^2 I b*h^3/12; % 截面惯性矩m^43.2 特征根求解先画图定位再精化特征方程 cos(r)·cosh(r)10 属于超越方程直接求解析值不现实。我的习惯是分两步走先用一个很小的步长扫描整个区间找出所有符号发生变化的区间确定大概的根位置再用 fzero 在每个小区间内精化得到高精度数值解。这一步看起来简单但特别容易翻车。如果扫描步长取得太大就可能跳过相邻很近的两个根尤其在高阶区间根与根的间距会逐渐趋近于 π但低阶区域的第一个根只有1.875如果你从0开始用步长1去扫第一个根所在的区间就会被漏掉。反过来步长取得太小计算量上来了但其实也没必要。实际经验是步长取0.1左右对前十几阶根都非常安全。% 求特征方程 cos(r)*cosh(r)10 的前N个根 N 4; % 取前四阶 r zeros(N,1); % 无量纲特征根 r beta*L step 0.1; r_min 1e-6; r_max 50; grid_r r_min:step:r_max; idx 0; for i 1:length(grid_r)-1 r1 grid_r(i); r2 grid_r(i1); if (cos(r1)*cosh(r1)1) * (cos(r2)*cosh(r2)1) 0 idx idx 1; r(idx) fzero((x) cos(x)*cosh(x)1, [r1, r2]); if idx N break; end end end % 如果扫描区间内没找齐用高阶渐近公式补根 for n idx1:N r(n) (n - 0.5)*pi; end渐近公式 (n-0.5)π 非常实用悬臂梁第n阶无量纲特征根的高阶近似就是它。比如第五阶真实值是14.1372而 4.5π 等于14.1372几乎一致。所以当你要算十几阶模态时可以直接用这个公式初始化再拿牛顿法或fzero修正效率高得多。3.3 振型函数与归一化特征根有了振型函数就可以直接套公式。这里要特别注意双曲函数在自变量较大时增长极快高阶模态时指数项可能会变得非常大但只要 r_n 在几十以内Matlab的double精度完全扛得住。归一化的方式我选最大绝对值归一化也就是让每阶振型的最大位移等于1。这样做的好处是画图直观、方便对比。另外还有一种质量归一化把振型按 ∫ρA·W²dx1 归一化在模态叠加和响应分析里更常用。两种都可以关键是一旦选定就要全程统一不要算频率用一套、算响应换另一套容易出现莫名其妙的系数错误。% 振型计算与归一化 x linspace(0, L, 400); modes zeros(length(x), N); for n 1:N beta r(n)/L; k (cosh(r(n)) cos(r(n))) / (sinh(r(n)) sin(r(n))); W cosh(beta*x) - cos(beta*x) k*(sin(beta*x) - sinh(beta*x)); modes(:,n) W / max(abs(W)); end % 画前四阶振型 figure(Color,w); plot(x/L, modes(:,1:N), LineWidth, 1.8); grid on; xlabel(x/L); ylabel(归一化振型 W_n); legend(第1阶,第2阶,第3阶,第4阶,Location,northwest); title(悬臂梁连续体模型前四阶振型);关于振型图有两点值得说。第一第n阶振型的节点数等于 n-1也就是一阶没有节点、二阶有一个节点、三阶有两个节点以此类推。这是判断振型计算结果是否正确的快速规则。第二节点位置是由边界条件决定的不随材料参数变化所以你用钢材、用铝材画出来的归一化振型形状完全重合变的只有固有频率和振型在时间响应里的参与程度。3.4 自由振动时程模态叠加法连续体模型的自由响应本质是把初始位移和初始速度投影到各阶模态上再分别按各自的固有频率做简谐运动最后叠加。这就是模态叠加法。计算模态坐标的初始值需要用到模态质量。数值积分用 trapz 足矣不需要更精细的积分方案。我这里故意选了一个比较“有内容”的初始位移悬臂梁端部受集中力作用下的静挠度曲线。这条曲线包含多阶模态成分用它作初始条件自由振动时程里就能明显看到高阶模态的贡献而不是只有单一频率的纯简谐波。静挠度公式是 w(x) F·x²·(3L-x)/(6EI)我按自由端初始挠度5毫米反算集中力F。这个初始条件本身不是某一阶纯模态所以能直观演示模态叠加的威力。% 固有圆频率和频率 omega r.^2 * sqrt(E*I / (rho*A*L^4)); freq omega / (2*pi); % 初始条件端部集中力静挠度自由端初位移5mm F 0.005 * 3*E*I / L^3; w0 F * x.^2 .* (3*L - x) / (6*E*I); v0 zeros(size(x)); % 计算模态坐标初始值 Nmodes N; M_n zeros(Nmodes,1); A_n zeros(Nmodes,1); B_n zeros(Nmodes,1); for n 1:Nmodes M_n(n) trapz(x, rho*A*modes(:,n).^2); A_n(n) trapz(x, rho*A*modes(:,n).*w0) / M_n(n); B_n(n) trapz(x, rho*A*modes(:,n).*v0) / (M_n(n)*omega(n)); end % 时间响应取三倍一阶固有周期 T1 2*pi / omega(1); t linspace(0, 3*T1, 1200); w_tip zeros(size(t)); legendStr {总响应}; figure(Color,w); hold on; for n 1:Nmodes qt A_n(n)*cos(omega(n)*t) B_n(n)*sin(omega(n)*t); w_tip w_tip qt*modes(end,n); plot(t, qt*modes(end,n)*1000, --, LineWidth, 0.8); legendStr{end1} sprintf(第%d阶贡献, n); end plot(t, w_tip*1000, LineWidth, 1.8); grid on; xlabel(时间 (s)); ylabel(自由端位移 (mm)); legend(legendStr); title(悬臂梁自由端自由振动时程模态叠加法);我特别提醒一点模态截断是这套方法绕不开的话题。严格来说连续体有无穷多阶模态代码里只取了四阶所以响应是一个近似结果。初始位移里的高阶成分被截断了时程曲线在一开始会有一点点偏差随后主要由前四阶主导。想验证截断误差直接加大 N 重新跑一遍对比即可这也是理解“模态收敛性”最直观的一种方式。3.5 把代码拼成完整脚本上面几段代码是按逻辑顺序拆开的变量名保持一致从上到下按顺序复制到同一个脚本里就能直接运行。完整流程为先定义物理参数求解无量纲特征根再由特征根算出固有频率和振型最后用静挠度作为初始条件算时程响应。运行时你会看到三个输出命令行打印前四阶无量纲特征根和固有频率一张前四阶振型图一张自由端位移时程图。振型图里应该看到一阶无节点、二阶一个节点、三阶两个节点、四阶三个节点的典型形态。时程图里总响应和四阶模态贡献曲线一起显示其中第一阶贡献占主导其余阶次负责叠加出细微的波纹。这就是连续体模型和单自由度模型的直观区别也是这套代码最有说服力的地方。4. 算例验证频率、振型与物理直觉4.1 前四阶频率结果与手工核对我用前面那组钢制矩形截面参数实际算了一轮结果如下阶次无量纲特征根 r_n圆频率 ω_n (rad/s)频率 f_n (Hz)11.875152.498.3524.6941329.0052.3637.8548921.20146.63410.99551805.30287.33这些数值符不符合物理直觉一根一米长、五厘米宽、一厘米厚的钢尺捏住一端让它自由振动第一阶频率大约8赫兹这个数据和我平时拿尺子试振的感受是吻合的。两侧频率比值大约是1:6.27:17.55:34.39对应特征根平方的比值 1:6.27:17.55:34.39这个比值只由边界条件决定。4.2 振型图和正交性检查除了看节点数还可以用数值方法验证正交性。理论上连续体振型满足∫₀ᴸ ρA·W_i(x)·W_j(x)dx 0当 i ≠ j在代码里算积分矩阵用trapz对每一对振型做数值积分会得到一个近似对角矩阵对角占主导非对角元接近零但不会严格等于0因为trapz是数值积分存在离散误差。这是连续体模型区别于离散模型的一个重要性质正是因为振型正交模态叠加法的“各阶独立响应再叠加”才有成立的数学基础。实际项目里正交性还是一个极好的排错工具。如果你的振型函数算错了正交性矩阵往往会出现肉眼可见的非对角大值如果矩阵接近对角基本说明方程和边界条件处理对了大半。4.3 与离散模型或有限元结果交叉验证我在调试这类代码时通常会额外建一个粗网格有限元模型做交叉验证。你可以用ANSYS、Abaqus或者自己写一个简单的欧拉梁单元刚度矩阵和质量矩阵在Matlab里求广义特征值。当梁的网格数量达到20个单元以上时前四阶固有频率和解析解的误差一般都能控制在1%以内网格越密越逼近连续体解。如果对不上先别急着怀疑有限元优先级是这样的先查单位制E是不是用成了GPa代入Pa再查截面惯性矩公式是不是把 b 和 h 弄反了然后查梁单元是不是用的欧拉-伯努利理论最后检查固定端约束是否把平动和转动全都锁住了。这些环节按顺序排查大多数“解析解和有限元对不上”的问题都能解决。5. 常见问题与排查技巧实录5.1 特征根漏根、跳根怎么办最典型的症状是代码跑出来第一阶特征根直接跳到4.69把1.875漏了。原因几乎都是扫描步长过大或者扫描起始点离0太远。还有一个隐藏问题第一个根在 r1.875 附近而函数 cos(r)·cosh(r)1 在 r0 处的值是2在第一个根之后振荡越来越密集如果步长取到0.5可能会在某个高阶区间跨过两个根之间的一个极小正峰导致漏根。解决办法很简单扫描步长取0.1必要时把fzero的初始区间打印出来确认每一个根的位置都在区间内。另外算完所有根后可以顺手检查 r 数组是否严格单调递增且相邻间隔约等于π这是一个非常高效的体检方式。5.2 振型图像错乱先查量纲和归一化振型图如果出现端部大幅翘起、形状不对称、曲线锯齿状多半是单位搞混比如计算 cosh(βx) 时 β 的单位是 rad/mx 却用了毫米或者 L 用了1米x 用了毫米向量导致 βx 不是无量纲值双曲函数自变量被放大了1000倍结果必然发散。另一种情况是归一化时用了 max(W) 而不是 max(abs(W))如果某阶振型的最大值横跨正负两侧用 max(W) 归一化会让负向峰值超过1图看起来就不对。我写代码时一定会加 max(abs(W))这个坑太隐蔽。5.3 频率数值差几个数量级单位制背锅频率算出来差6个数量级十有八九是弹性模量没从 GPa 换成 Pa。比如把 E210 代入公式而不是 210e9这个错误在公式层面完全看不出来因为量纲检查很难在代码里自动完成。我的做法是在代码注释里专门写清每个变量的单位算完之后用常识做量级检查一根普通钢尺的一阶频率在5到20赫兹如果算出来是0.008赫兹那不用怀疑单位肯定错了。5.4 与商业软件对不上别忘边界条件和梁理论同样是悬臂梁ANSYS默认的梁单元可能有平动自由度约束但转动自由度没锁紧或者用了考虑剪切变形的梁单元理论结果在低阶上差百分之几。这些问题在细长梁上不突出在深梁上非常明显。对比时务必确认材料密度是质量密度而不是重量密度几何单位统一固定端自由度全部约束单元类型与欧拉-伯努利假设匹配。如果这些都符合但高频段仍有差异那不是谁算错了而是连续体解析解天然忽略了剪切变形高频模态对剪切更敏感需要切到铁木辛柯梁理论才能对齐。6. 实操心得和后续扩展几个长期形成的习惯聊一聊。第一先求无量纲特征根再带物理量纲这是整个流程里最不容易出错的做法因为 r_n 只由边界条件决定可以独立验证物理参数只是最后乘上去的比例因子。我把这根弦绷得很紧几乎每次都会在无水印草稿上把 r_n 和教材值对一遍再往后走。第二画图比数值列表更能发现问题。我计算前总会把特征方程曲线画出来把求到的根用散点标记上去一眼就能看出有没有漏根比单纯打印数值可靠得多。对振型和时程图也同理曲线形状是否符合物理直觉是比“数值精度几个小数位”更先需要检查的指标。第三动画是理解模态叠加最好的工具。把每一时刻的梁形变画成连续动画你就能看到自由端位移除了主频大周期还有高阶模态叠加出来的细微波纹。这个动画用Matlab的animatedline就可以实现帧率不用太高20帧左右即可。做一次动画比盯着地看十遍静态图都有用。后续扩展方向我建议从三个角度出发。一是加激励把自由振动改成谐波激励下的稳态响应看共振峰的出现位置和各阶阻尼的影响二是换理论把欧拉-伯努利梁升级为铁木辛柯梁对比深梁的修正效果三是组合验证把解析频率和有限元结果放在同一张收敛曲线图上画出“频率-网格数”的收敛趋势你会对有限元方法的逼近过程有更深的理解。这套连续体模型是一块很好的“知识跳板”向下能连接有限元离散逼近向上能衔接弹性波传播和结构声学值得多花时间玩透。