
给神经网络输出起名叫“势能”,然后对它求梯度,并不会自动获得物理上可信的模拟器。即使势能函数完全正确,离散积分也可能让总能量逐步漂移。
对于无阻尼、无外力的一维弹簧,势能 U=½kx²,动能 K=½mv²,连续方程满足能量守恒。一旦加入阻尼或外力,就应该把耗散与外部做功写进账本。机器人任务还包含接触、摩擦和控制器输入,不能把所有能量变化都归咎于模型学错。

下面比较显式 Euler 与一种辛 Euler 更新。两者都使用正确的弹簧力,数值行为却不同。例子只涉及理想弹簧,时间步和结果全部由代码给出。
def energy(x, v):
return 0.5*x*x + 0.5*v*v # k=m=1
def simulate(method, dt=0.05, steps=400):
x, v = 1.0, 0.0
energies = [energy(x, v)]
for _ in range(steps):
if method == "explicit":
x, v = x + dt*v, v – dt*x
elif method == "symplectic":
v -= dt*x
x += dt*v
else:
raise ValueError(method)
energies.append(energy(x, v))
return energies
explicit = simulate("explicit")
symplectic = simulate("symplectic")
assert explicit[-1] > explicit[0] * 2
assert max(abs(e-0.5) for e in symplectic) < 0.02
assert symplectic[-1] != symplectic[0]
print("explicit final energy=", explicit[-1])
print("symplectic min/max=", min(symplectic), max(symplectic))
辛 Euler 在这组参数下的能量误差有界且较小,但它也没有逐步精确守恒。更大时间步、刚性系统或接触切换可能改变结论,所以不能把这次结果写成所有物理系统的保证。
Flow Matching 的原始论文讨论生成流的向量场;它不是机械系统能量守恒的定理。把生成轨迹用于控制时,还需检查速度、加速度、可达性与接触约束。若使用学习到的势能,除了轨迹误差,还应比较力的误差、长时滚动稳定性和分布外状态。
本文已运行理想数值例子,没有训练势能网络,没有接入物理引擎或实机,也没有测量抓取成功率。先把积分误差与模型误差分开,才知道后续应该改网络,还是改求解器与控制周期。


