同样的弹簧公式为什么更新顺序会改变长期运动:规则练习第11例
离散模拟每一步都要先后更新速度与位置。即使使用同一条恢复力公式,位置使用旧速度还是新速度,也会产生不同的轨迹和能量变化。
质量取一,恢复加速度为负k乘位置,步长为h。显式方法同时按旧状态计算新位置和新速度;半隐式方法先用旧位置更新速度,再用新速度更新位置。两种方法都从同一组位置和速度出发。
本例输入与约定
初始位置-3、速度4,弹簧常数1,步长1/4。记录初始及十二次更新。
完整计算记录
步 | 显式位置/速度/两倍能量 | 半隐式位置/速度/两倍能量 0 | -3/4/25 | -3/4/25 1 | -2/19/4/425/16 | -29/16/19/4/6617/256 2 | -13/16/21/4/7225/256 | -131/256/333/64/1791385/65536 3 | 1/2/349/64/122825/4096 | 3363/4096/5459/1024/488120665/16777216 4 | 477/256/341/64/2088025/65536 | 137789/65536/83981/16384/131830742297/4294967296 5 | 409/128/4979/1024/35496425/1048576 | 3410531/1048576/1205907/262144/34899108784345/1099511627776 6 | 18067/4096/4161/1024/603439225/16777216 | 70452477/16777216/15883981/4194304/9000365153969305/281474976710656 7 | 5557/1024/48509/16384/10258466825/268435456 | 1310930851/268435456/183691219/67108864/2258419119106879577/72057594037927936 8 | 404157/65536/26281/16384/174393936025/4294967296 | 22603022269/4294967296/1628128653/1073741824/553309462264423418905/18446744073709551616 9 | 215219/32768/16339/262144/2964696912425/68719476736 | 365095392483/68719476736/3447036179/17179869184/133484758547025171625945/4722366482869645213696 10 | 6903347/1048576/-414099/262144/50399847511225/1099511627776 | 5531583466109/1099511627776/-309942813619/274877906944/32135448405955453101634457/1208925819614629174706176 11 | 202789/32768/-13528931/4194304/856797407690825/17592186044416 | 78014666973731/17592186044416/-10490668484013/4398046511104/7847154266885572276029407065/309485009821345068724781056 12 | 90299037/16777216/-20018179/4194304/14565555930744025/281474976710656 | 1002369308861757/281474976710656/-245865362717939/70368744177664/1971940656698775740623295650585/79228162514264337593543950336
表中编号仅用于识别本例的元素。读取一个结果时,应先核对它对应的输入、处理顺序和边界约定;布尔值表示条件是否成立,空集合表示没有符合要求的对象,不应把这些字段混成同一种数值。
复核方法与适用范围
每一步记录位置、速度和速度平方加k乘位置平方;最后一项是理想弹簧系统能量的两倍。计算保留精确分数,避免把舍入误差混进更新顺序的比较。
本例没有阻尼、碰撞或外力,也不保证任意步长都稳定。半隐式方法并非每一步都严格保持真实能量;选择步长仍应结合具体系统,不能把某一份表的表现当成所有参数的结论。
练习时可以先独立计算最前面的一步,再检查最后的整体不变量。若结论不同,应保留各步记录,定位第一处差异;只调整最终数字会掩盖规则理解上的问题。改变输入后也要重新演算,而不是照抄这一例的输出。
