离散模拟每一步都要先后更新速度与位置。即使使用同一条恢复力公式,位置使用旧速度还是新速度,也会产生不同的轨迹和能量变化。
质量取一,恢复加速度为负k乘位置,步长为h。显式方法同时按旧状态计算新位置和新速度;半隐式方法先用旧位置更新速度,再用新速度更新位置。两种方法都从同一组位置和速度出发。
初始位置-11、速度2,弹簧常数2,步长1/4。记录初始及十二次更新。
步 | 显式位置/速度/两倍能量 | 半隐式位置/速度/两倍能量 0 | -11/2/246 | -11/2/246 1 | -21/2/15/2/1107/4 | -73/8/15/2/7129/32 2 | -69/8/51/4/9963/32 | -391/64/193/16/450873/2048 3 | -87/16/273/16/89667/256 | -1193/512/1935/128/31377049/131072 4 | -75/64/633/32/807003/2048 | 7129/4096/16673/1024/2274734073/8388608 5 | 483/128/2607/128/7263027/16384 | 183287/32768/126255/8192/161116724569/536870912 6 | 4539/512/4731/256/65367243/131072 | 2293049/262144/826753/65536/10726237900473/34359738368 7 | 13809/1024/14385/1024/588305187/1048576 | 22665367/2097152/4320975/524288/663085460849689/2199023255552 8 | 69621/4096/14961/2048/5294746683/8388608 | 193225369/16777216/11902433/4194304/38469386515742073/140737488355328 9 | 154203/8192/-9777/8192/47652720147/67108864 | 1447797047/134217728/-98005905/33554432/2172957548620872409/9007199254740992 10 | 607035/32768/-173757/16384/428874481323/536870912 | 9350532089/1073741824/-2231844287/268435456/127281481718735010873/576460752303423488 11 | 1040313/65536/-1302063/65536/3859870331907/4294967296 | 47598970327/8589934592/-27205286385/2147483648/8186682834509557432729/36893488147419103232 12 | 2859189/262144/-3644439/131072/34738832987163/34359738368 | 115550501209/68719476736/-265241261407/17179869184/576175332351863171418873/2361183241434822606848
表中编号仅用于识别本例的元素。读取一个结果时,应先核对它对应的输入、处理顺序和边界约定;布尔值表示条件是否成立,空集合表示没有符合要求的对象,不应把这些字段混成同一种数值。
每一步记录位置、速度和速度平方加k乘位置平方;最后一项是理想弹簧系统能量的两倍。计算保留精确分数,避免把舍入误差混进更新顺序的比较。
本例没有阻尼、碰撞或外力,也不保证任意步长都稳定。半隐式方法并非每一步都严格保持真实能量;选择步长仍应结合具体系统,不能把某一份表的表现当成所有参数的结论。
练习时可以先独立计算最前面的一步,再检查最后的整体不变量。若结论不同,应保留各步记录,定位第一处差异;只调整最终数字会掩盖规则理解上的问题。改变输入后也要重新演算,而不是照抄这一例的输出。