离散模拟每一步都要先后更新速度与位置。即使使用同一条恢复力公式,位置使用旧速度还是新速度,也会产生不同的轨迹和能量变化。
质量取一,恢复加速度为负k乘位置,步长为h。显式方法同时按旧状态计算新位置和新速度;半隐式方法先用旧位置更新速度,再用新速度更新位置。两种方法都从同一组位置和速度出发。
初始位置-6、速度4,弹簧常数1,步长1/4。记录初始及十二次更新。
步 | 显式位置/速度/两倍能量 | 半隐式位置/速度/两倍能量 0 | -6/4/52 | -6/4/52 1 | -5/11/2/221/4 | -37/8/11/2/3305/64 2 | -29/8/27/4/3757/64 | -379/128/213/32/869545/16384 3 | -31/16/245/32/63869/1024 | -2277/2048/3787/512/234646633/4194304 4 | -3/128/521/64/1085773/16384 | 26437/32768/62869/8192/63939093545/1073741824 5 | 515/256/4171/512/18458141/262144 | 1402459/524288/979467/131072/17316580912105/274877906944 6 | 8291/2048/7827/1024/313788397/4194304 | 36708357/8388608/14269013/2097152/4605179185546153/70368744177664 7 | 24409/4096/54325/8192/5334402749/67108864 | 778929563/134217728/191595851/33554432/1194074786041998185/18014398509481984 8 | 249597/32768/84241/16384/90684846733/1073741824 | 14749477061/2147483648/2286604053/536870912/301204003096101626665/4611686018427387904 9 | 583435/65536/424331/131072/1541642394461/17179869184 | 257827820763/34359738368/21836187787/8589934592/74104290712503701220073/1180591620717411303424 10 | 5091811/524288/265227/262144/26207920705837/274877906944 | 4216796316037/549755813888/91551183829/137438953472/17915477079111076401005225/302231454903657293676544 11 | 10448849/1048576/-2969995/2097152/445534651999229/4398046511104 | 64716763681819/8796093022208/-2751977374773/2199023255552/4309433572988606615019973225/77371252455336267181195264 12 | 80620797/8388608/-16388839/4194304/7574089083986893/70368744177664 | 926719817230917/140737488355328/-108748401678187/35184372088832/1048029057529469090904286372393/19807040628566084398385987584
表中编号仅用于识别本例的元素。读取一个结果时,应先核对它对应的输入、处理顺序和边界约定;布尔值表示条件是否成立,空集合表示没有符合要求的对象,不应把这些字段混成同一种数值。
每一步记录位置、速度和速度平方加k乘位置平方;最后一项是理想弹簧系统能量的两倍。计算保留精确分数,避免把舍入误差混进更新顺序的比较。
本例没有阻尼、碰撞或外力,也不保证任意步长都稳定。半隐式方法并非每一步都严格保持真实能量;选择步长仍应结合具体系统,不能把某一份表的表现当成所有参数的结论。
练习时可以先独立计算最前面的一步,再检查最后的整体不变量。若结论不同,应保留各步记录,定位第一处差异;只调整最终数字会掩盖规则理解上的问题。改变输入后也要重新演算,而不是照抄这一例的输出。