本节摘要:约束越多,逐根标力的账越难算——难算的部分恰恰是约束反力,而它们往往不是题目要的答案。本节教两件事:用广义坐标把系统的运动自由度编号清点,用虚功原理绕开全部理想约束反力直接判平衡。这是分析力学语言的字母表与第一句话。
第一章把约束定义为"限制运动的几何条件",第三章给每类约束配了反力画像。现在把视角倒过来:既然约束的作用只是削减运动的可能性,那就先数清"还剩几种独立动作"——这剩下的一组独立参数,就是广义坐标。平面上的自由质点要两个数,被钉在圆环上滑动的珠子只要一个角度,双摆在臂长固定后只剩两个角度。坐标选得好,约束就自动"长"在坐标里,方程里再也见不到它。
平衡判据也随之换代。第三章的平衡是合力为零、合力矩为零,几何复杂时投影与取矩的清单冗长;虚功原理一句话说完:平衡时,所有主动力在任意一组虚位移上做的总功为零。理想约束(光滑面、刚性杆、不可伸长绳)的反力在与虚位移配对时永远做零功,于是从判据里集体消失——这正是分析力学送给解题人的第一份厚礼。本节向上承接第一章的约束概念与第三章的平衡话题,向下为拉格朗日方程备好坐标系。
平面机构的自由度有一条清点公式:三个乘以构件数减一,再减去两倍的低副(销轴、滑块)个数。拿四连杆机构核一遍:四个构件(含机架)、四个转动副,自由度等于三乘三减八,剩一——给一个曲柄角度,整套机构的姿势就定了。清点不仅为了解题,更为选广义坐标:自由度是一,就选一个角度;是二,选两个互不牵扯的参数。
# 平面机构自由度清点:DOF = 3*(n-1) - 2*j - j_高副 def dof_plane(n, j_low, j_high=0): return 3 * (n - 1) - 2 * j_low - j_high cases = [ ("四连杆机构", 4, 4, 0), # 含机架共 4 构件,4 个转动副 ("曲柄滑块", 4, 4, 0), # 转副三个加滑块副一个 ("凸轮顶杆", 3, 1, 1), # 1 个转动副 + 1 个高副接触 ("五杆铰链", 5, 5, 0), # 欠驱动机构 ] for name, n, jl, jh in cases: print(f"{name}: 自由度 = {dof_plane(n, jl, jh)}") # 四连杆机构: 自由度 = 1 # 曲柄滑块: 自由度 = 1 # 凸轮顶杆: 自由度 = 1 # 五杆铰链: 自由度 = 2 # 双摆清点:两个质点四个坐标,两根刚性杆各吃掉一个约束,剩 2 print("双摆自由度 = 4 - 2 =", 4 - 2) # 2:两个直角坐标被两根定长杆收走
五杆铰链那行值得多看一眼:自由度是二,意味着必须给它两台电机或一个电机加一个弹性件,机构才能确定地动——自由度清点直接变成驱动配置清单,这是机构设计里虚功语言最日常的兑现。
虚功原理的用法是给系统一个想象中的小位移(虚位移),算所有主动力做的总功,令其为零。滑轮组是最漂亮的示范:动滑轮上吊重物,绳子收缩一小段,重物只升高一半——力省几倍,位移吃几倍,"省力不省功"在虚功账上一目了然。
# 虚功原理:滑轮组省力系数与杠杆平衡 # 滑轮组:n 段绳吊动滑轮,绳端拉力 F 使绳收缩 s,重物只升 s/n W, n = 1200.0, 4 # 重物 1200 N,四段绳 F = W / n print("滑轮组拉力 =", F, "N") # 300.0 s_rope = 0.8 # 手拉绳 0.8 m s_load = s_rope / n print("重物只上升 =", s_load, "m") # 0.2 print("输入功 =", F * s_rope, "J 输出功 =", W * s_load, "J") # 240.0 240.0 # 杠杆:支点两侧力臂与重量,虚功判据 F1*l1 = F2*l2 F2, l2, l1 = 900.0, 0.12, 0.9 # 900 N 的重物,阻力臂 12 cm F1 = F2 * l2 / l1 print("杠杆施力 =", F1, "N") # 120.0 # 虚功复核:压下 l1*θ 做功 vs 抬起 l2*θ 做功,任意 θ 相等即平衡 th = 0.01 print("虚功差 =", F1 * l1 * th - F2 * l2 * th) # 0.0
两台病例里"省的力"与"吃的位移"严格互为倒数,虚功差恒为零——平衡不是力的妥协,而是功的守恒在虚拟位移上的兑现。第三章的杠杆与滑轮结论,在这里被一个判据统一收编。
⚠️ 常见坑:给非理想约束(带摩擦的滑轮、有弹性的绳)套用虚功原理时忘了把摩擦力算进"主动力"清单。理想约束的反力可以隐身,摩擦力不行——它做实功,一笔都不能少。
虚功原理还能再压缩一步。把主动力在广义坐标虚位移上做的功,除以对应的虚位移,得到的量叫广义力——它可以是一根力、一个力矩,甚至一段压强,量纲随坐标类型而变。引入广义力后,平衡判据浓缩成一句话:每个广义坐标上的广义力为零。多自由度系统因此受益最大:几个自由度就写几条"广义力为零",清单整齐得像查表。
# 广义力示范:曲柄压杆机构。曲柄角 θ 为广义坐标,曲柄上力矩 M 驱动,滑块上阻力 F # 虚功:M*dθ - F*ds = 0,s 与 θ 的关系 s = r*cosθ(r 为曲柄长) import math r, M, F = 0.25, 40.0, 200.0 # 曲柄长 m、驱动力矩 N·m、滑块阻力 N # 广义力 Qθ = M - F*ds/dθ = M - F*(-r*sinθ) = M + F*r*sinθ for deg in (10.0, 30.0, 53.13): th = math.radians(deg) Q = M + F * r * math.sin(th) print(f"θ={deg:6.2f} 度 广义力 Qθ = {Q:8.3f} N·m") # θ= 10.00 度 广义力 Qθ = 48.682 N·m # θ= 30.00 度 广义力 Qθ = 65.000 N·m # θ= 53.13 度 广义力 Qθ = 80.000 N·m # 平衡要 Qθ=0:本题 M 与阻力同号相加,说明驱动力矩方向取反后平衡在 sinθ = M/(F*r) = 0.2 print("平衡角 =", round(math.degrees(math.asin(0.2)), 3), "度") # 11.537
广义力的妙处在"货币统一":力矩与力本来量纲不同,折到同一广义坐标上就能直接加减,机构平衡从几何难题变成一笔标量账。下一节的拉格朗日方程沿用同一套货币,只是把"广义力为零"升级成"广义力驱动广义动量"。
要点复盘:
坐标与静力判据备齐。下一节把它们推上动力学:动能减势能写成拉格朗日量,一条模板方程管住所有自由度。