您想要实现的是找到速度随时间的精确积分,其中速度本身隐含地作为加速度的积分给出。您尝试通过可用的最简单方法来做到这一点:欧拉方法。累积误差是不可避免的。
除了 Euler 方法固有的错误(不精确)之外,您的实现还存在按顺序更新变量的错误。即:您将过去的位移与当前速度相结合 - 而不是与相应的过去速度相结合。您应该计算每个变量的新值并同时更新它们。例如像这样(从你的代码中省略常量):
import math
acceleration = 10
vx = 0
x = 0
for _ in range(10):
new_x = x + vx
new_vx = vx + acceleration
x = new_x
vx = new_vx
print(x) # 450
在您当前的设置(带有修复程序)中,模拟运行如下:

您可以通过增加时间分辨率来获得更好的结果,例如通过将步长设为 0.1 而不是 1,您将获得:

如果您对更好的数值积分方法感兴趣,请关注维基百科到Runge-Kutta或Adams-Bashfort。
这是重现绘图的代码:
import numpy as np
import matplotlib.pyplot as plt
acceleration = 10
t0 = 0
t1 = 10
nb_steps = 11
ts = np.linspace(t0, t1, num=nb_steps)
vs = np.zeros_like(ts)
xs = np.zeros_like(ts)
vs[0] = 0
xs[0] = 0
true_xs = acceleration * ts ** 2 / 2
for i, t in enumerate(ts):
if i == 0:
continue # initial conditions are preset
delta_t = t - ts[i-1]
vs[i] = vs[i-1] + acceleration * delta_t
xs[i] = xs[i-1] + vs[i-1] * delta_t
plt.figure()
plt.plot(ts, vs, label='velocity')
plt.plot(ts, xs, label='displacement-sim')
plt.plot(ts, true_xs, label='displacement-true')
plt.legend()
plt.show()