我正在创建一个关于汽车模拟的项目,而且我遇到了一个问题。当我运行我的代码时,汽车有时会相互超越。
我花了几天时间试图弄清楚为什么会这样,我仍然不知道。最佳速度函数应设置(de)加速度,以便不会发生超车,但由于某种原因,它仍然允许汽车有时相互过度吸收而不能足够快地减速。
你能帮助我,还是只是把我推向我应该看的方向?
这是我的最佳速度函数:
def optimal_velocity_function(dx, d_safe, v_max):
vx_opt = v_max * (np.tanh(dx - d_safe) + np.tanh(d_safe))
return vx_opt
现在我在Euler的方法中使用它来解决ODE:
def euler_method(x, v, n_cars, h, tau, d_safe, v_max):
# Euler method used to solve ODE
# returns new position of car and its new velocity
dv = np.zeros(n_cars)
for j in range(n_cars - 1):
dv[j] = tau ** (-1) * (optimal_velocity_function(x[j+1] - x[j], d_safe, v_max) - v[j])
dv[n_cars - 1] = tau ** (-1) * (v_max - v[n_cars - 1]) # Speed of first car
v_new = v + h * dv
x_new = x + h * v_new
return [x_new, v_new]
这是模型的其余部分,基本上只是生成起始值,然后使用上面的函数进行迭代。
def optimal_velocity_model(n, n_cars, d_0, v_0, h, tau, d_safe, v_max):
global x_limit, canvas, xx, vv
car_positions = np.linspace(0, n_cars, n_cars)
x = np.array(sorted(np.random.random(n_cars) + car_positions)) # Generation of cars with minimal distance
x = x * d_0
v = np.random.random(n_cars) + v_0 # Generating initial speeds around v_0
xx = np.zeros([n_cars, n]) # Matrix of locations
vv = np.zeros([n_cars, n]) # Matrix of velocities
for i in range(n):
xx[:, i] = x
vv[:, i] = v
[x, v] = euler_method(x, v, n_cars, h, tau, d_safe, v_max)
x_limit = xx.max() # Interval in which will cars be
return
非常感谢。学家
答案 0 :(得分:0)
我认为你在数学方面有点迷失,而不是专注于问题的物理学。通过使用delta X
以上的tanhh以及安全距离,您可以产生一个柔和的SPEED过渡,可能无法保证超车被禁止。
我的思路如下:
首先评估接近安全距离的两辆车的相对速度
根据可以在距离内停止的车辆属性定义最小减速度
使用tanhh或任何其他函数来建模之间的转换 积极的制动或反之亦然。
通过整合加速来更新您的速度。
为了计算减速度,我可以想到一个简单的方法来保持使用tanh:
Deceleration=Max_Dec(relative_speed)*[1+tanh(d_safe-dx)]
希望这可以为您提供更多指导!