本节摘要:答案算出来只算及格,签字前还要过三道闸:量纲闭合闸——公式两端的量纲拼不拢当场判死;极限行为闸——参数推到极端看答案是否退回常识;守恒巡检闸——数值解里不该变的量有没有偷偷漂移。本节把三道闸做成可勾选的代码清单,给全册的解剖流程上最后一道保险。
第一章说过,力学训练的真正目标是让荒谬尽早暴露。本节把这句话工程化:荒谬暴露得越早,返工成本越低——量纲检查在公式阶段拦人,极限检验在结果阶段拦人,守恒巡检在仿真阶段拦人,三道闸由贵到便宜、由粗到细。1.3 节学过量纲分析判"骨架",本节把它连同另外两闸编成机器可执行的清单,让检查不再依赖肉眼与自觉。
量纲闭合最适合交给代码:把每个物理量表示成基本量纲的指数向量,公式两端各算一遍,向量不等立刻报警。下面给一套极简量纲检查器,顺手核三个全册用过的公式——单摆周期、刹车距离、共振峰值。
# 闸一:极简量纲检查器。量纲 = 质量、长度、时间的指数向量 M, L, T = (1,0,0), (0,1,0), (0,0,1) def mul(a, b): return tuple(x+y for x, y in zip(a, b)) # 相乘 def div(a, b): return tuple(x-y for x, y in zip(a, b)) # 相除 def pow_d(a, n): return tuple(x*n for x in a) # 乘方 def check(name, left, right): print(f"{name}: {'量纲闭合' if left == right else '量纲冲突! 判死'}") g = div(L, mul(T, T)) # 加速度:L/T^2 vel = div(L, T) # 速度 check("单摆周期 T = sqrt(L/g)", T, pow_d(div(L, g), 0.5)) check("刹车距离 d = v^2/(2 mu g)", L, div(mul(vel, vel), g)) check("共振峰值 1/(2 zeta)(无量纲)", (0,0,0), (0,0,0)) # 单摆周期 T = sqrt(L/g): 量纲闭合 # 刹车距离 d = v^2/(2 mu g): 量纲闭合 # 共振峰值 1/(2 zeta)(无量纲): 量纲闭合 # 反例演示:有人声称周期正比于摆长 T = C*L check("反例 T = C*L(应判死)", T, L) # 反例 T = C*L(应判死): 量纲冲突! 判死
检查器把 1.3 节的"铁律"变成了断言:正例全绿只是及格,反例当场判死才说明工具真有牙。注意它管不了系数与加减号——量纲闸是第一道闸不是最后一道,放行不等于正确。
极限检验问的是"参数推到极端,答案退不退回常识":摩擦归零时斜面加速度该退回 g 乘 sinθ,坡度归零时加速度该归零,阻尼加到极大时共振峰该被压平。守恒巡检问的是"数值解里不该变的量变没变":无阻尼振子的机械能、轨道的角动量,数值漂移超过容差就说明步长或方法出了问题。两闸合并成一段巡检代码。
# 闸二:极限行为。斜面加速度 a = g*(sinθ - mu*cosθ) 的三个极端 import math g = 9.8 a_of = lambda th, mu: g * (math.sin(th) - mu * math.cos(th)) print("mu→0 时 a/(g sinθ) =", a_of(0.3, 0.0) / (g * math.sin(0.3))) # 1.0 print("θ=10 度(低于临界角)时 a 公式给 =", round(a_of(math.radians(10), 0.3), 4)) # θ=10 度时 a 公式给 = -1.1941 —— 负值是提示:摩擦上限未破,物块不动,a 应取 0 print("θ=90 度时 a =", a_of(math.pi/2, 0.3), "(应=g)") # 9.8 # 闸三:守恒巡检。无阻尼振子机械能应守恒,用 4.2 的 RK4 跑五个周期 m, k = 1.0, 100.0 w = math.sqrt(k / m) f = lambda t, s: (s[1], -(k/m) * s[0]) # 状态 [位移, 速度] def rk4_step(s, dt): k1 = f(0, s) k2 = f(0, tuple(s[i] + dt/2*k1[i] for i in range(2))) k3 = f(0, tuple(s[i] + dt/2*k2[i] for i in range(2))) k4 = f(0, tuple(s[i] + dt*k3[i] for i in range(2))) return tuple(s[i] + dt/6*(k1[i]+2*k2[i]+2*k3[i]+k4[i]) for i in range(2)) s, dt, n = (0.5, 0.0), 0.001, int(5 * 2*math.pi/w / 0.001) E0 = 0.5*m*s[1]**2 + 0.5*k*s[0]**2 for _ in range(n): s = rk4_step(s, dt) E1 = 0.5*m*s[1]**2 + 0.5*k*s[0]**2 print("初始能量 =", round(E0, 8), "J 五个周期后 =", round(E1, 8), "J") print("能量漂移 =", abs(E1-E0)/E0, "(容差 1e-6 内合格)") # 初始能量 = 12.5 J 五个周期后 = 12.5 J(八位小数下不动) # 能量漂移 = 4.4e-11 量级,容差内合格
三行极限读数各对应一条物理常识——无摩擦退回沿坡重力分量、坡度低于临界角时摩擦上限根本没破、竖直面退回自由落体——三关全过,公式才有资格进计算书。能量漂移压在十的负十一次方量级,说明步长与方法选得匹配;若巡检漂到千分位,先怀疑步长,再怀疑方程,最后才怀疑物理。
三道闸也各有更精细的进阶版:量纲闸可升级为 π 定理的完整流程,动手做实验之前先算清该测哪几个无量纲组合;极限闸可以接进单元测试框架,把每个极端参数写成常驻用例,代码一改就自动把关;守恒闸可换成保结构积分器,让能量漂移从算法源头被压制。本节给的是最小可用版——工具朴素,纪律千金:闸门常在、每过必检,远比闸门本身精巧与否重要。
⚠️ 常见坑:把"结果看起来合理"当成检验。合理观感会被错误的量纲、巧合的极限行为同时骗过,只有机器断言式的三道闸(不闭合就报错、不退回常识就报错、守恒量漂移超差就报错)才骗不过。
要点复盘:
全册至此收官:从隔离体画起,到三道质检闸收尾,受力分析解剖台的整套手艺已交到你手上。愿你此后每见一道力学题,都先把它请上解剖台——隔离、标力、立账、对账、放行。