剪力图与弯矩图是梁内力沿长度变化的图形:剪力是截面一侧横向力的代数和,弯矩是截面一侧力矩的代数和。载荷集度、剪力、弯矩之间满足微分关系(载荷集度为零处剪力图水平、剪力为零处弯矩取极值),是快速作图与校核的核心工具。本节训练列方程画图、数值扫描、读图定位危险截面三项能力。
本章支柱页把任务分成"定位"与"裁决"两步,本节是定位一步。它直接消费第 1 章的支座反力,产出(最大弯矩与最大剪力)是下一节强度校核的输入,也是第 7 章疲劳分析里应力循环幅值的基准。
求梁内力的操作是第 1 章截面法的批量重复:在位置 x 处假想切开,取左侧为隔离体,剪力等于左侧全部横向力的代数和,弯矩等于左侧全部力对截面形心力矩的代数和。规定"左上右下"的剪力为正、"下凸"的弯矩为正,符号约定统一后图形才有共同语言。
简支梁受均布载荷是第一课,全程做完:
import numpy as np # 简支梁跨长 6 m,均布载荷 q=15 kN/m L, q = 6.0, 15e3 x = np.linspace(0, L, 601) V = q * (L/2 - x) # 剪力方程:左半正、右半负,线性 M = q * x / 2 * (L - x) # 弯矩方程:抛物线 print(f"支座反力各 {q*L/2/1000:.1f} kN") print(f"最大剪力 {np.max(np.abs(V))/1000:.1f} kN(支座内侧截面)") i_max = np.argmax(M) print(f"最大弯矩 {M[i_max]/1000:.1f} kN·m,出现在 x = {x[i_max]:.2f} m(跨中)") print(f"理论值 qL²/8 = {q*L**2/8/1000:.1f} kN·m,数值扫描吻合")
跨中弯矩等于 qL²/8,这个数在工程里出现频率之高,值得当电话号码记。但真正要练的不是背公式,而是从截面法出发把它推出来——载荷形式一变(集中力、力偶、梯形分布),公式就换脸,方法不变。
载荷集度 q、剪力 V、弯矩 M 三者之间有一组微分关系:剪力对位置的导数等于负的载荷集度,弯矩对位置的导数等于剪力。它给出图形的"语法":
| 梁段情况 | 剪力图形态 | 弯矩图形态 |
|---|---|---|
| 无载荷段 | 水平线 | 斜直线 |
| 均布载荷段 | 斜直线 | 抛物线 |
| 集中力作用点 | 突变(幅值=力) | 出现尖角 |
| 集中力偶作用点 | 不变 | 突变(幅值=力偶) |
这套规则让画图变成填空:节点处突变、段内按微分关系连线、剪力过零处弯矩取极值。校核也靠它——弯矩图斜率与剪力图对不上,必有一张图错了。
import numpy as np # 外伸梁:A 简支 x=0,B 简支 x=5,外伸端 C x=6.5 受集中力 12 kN,AB 段均布 10 kN/m q, P, xa, xb, xc = 10e3, 12e3, 0.0, 5.0, 6.5 # 反力(对 A 取矩求 B) RB = (q * 5 * 2.5 + P * xc) / 5 RA = q * 5 + P - RB print(f"RA={RA/1000:.2f} kN, RB={RB/1000:.2f} kN") # 分段数值扫描 x1 = np.linspace(0, 5, 300) # AB 段 V1 = RA - q * x1 M1 = RA * x1 - q * x1**2 / 2 x2 = np.linspace(5, xc, 100) # BC 外伸段 V2 = -P M2 = -P * (xc - x2) print(f"AB 段最大正弯矩 {np.max(M1)/1000:.2f} kN·m @ x={x1[np.argmax(M1)]:.2f}") print(f"B 支座处弯矩 {M1[-1]/1000:.2f} kN·m(负值,上侧受拉)") print(f"外伸段剪力恒为 {-V2[0]/1000:.0f} kN,B 到 C 弯矩线性回到零") # 校核微分关系:dM/dx 应等于 V dMdx = np.gradient(M1, x1) print(f"AB 段 dM/dx 与 V 的最大偏差 {np.max(np.abs(dMdx - V1)):.1f} N(数值导数精度内)")

内力图的终点不是图本身,而是回答"哪最危险"。对细长梁,弯矩通常是控制因素(正应力与高度成正比、切应力与宽度成反比,弯矩主导的梁高瘦);短粗梁、木梁、薄腹板梁则要额外查剪应力。下一节的强度校核就从这里取数。
import numpy as np # 悬臂梁:固定端在左,全长 2.4 m,端部集中力 8 kN + 全长均布 5 kN/m L, P, q = 2.4, 8e3, 5e3 x = np.linspace(0, L, 241) M = -(P * (L - x) + q * (L - x)**2 / 2) # 固定端最负 print(f"固定端弯矩 {M[0]/1000:.2f} kN·m,自由端为零") V = P + q * (L - x) print(f"固定端剪力 {V[0]/1000:.1f} kN") # 假如中间加一根拉杆(变成弹性支座),固定端弯矩立减——超静定的初步直觉 F_tie = 6e3 # 假设拉杆在 x=1.2 m 提供向上的 6 kN M2 = -(P*(L-x) + q*(L-x)**2/2) + np.where(x >= 1.2, F_tie*(x-1.2), 0) print(f"加拉杆后固定端弯矩 {M2[0]/1000:.2f} kN·m,跨中某处出现新极值 {np.max(M2)/1000:.2f} kN·m") print("内力图重画,最危险截面可能从固定端转移到别处——加支撑从来不是无代价的局部减负")
⚠️ 常见坑:符号约定中途换轨。有人画剪力图用"左上右下为正",列方程时又混入力矩正方向约定,两张图自相矛盾还互相校核通过不了。动手前把符号约定写在纸上,全程不换;数值方法的好处正是符号纪律由数组运算强制执行。
图已画好,最危险截面已定位。下一节把这些内力代回应力公式,完成强度裁决,并给压杆补上稳定性这道独立考题。