gpt4 book ai didi

python - 在具有可变时间增量的模拟中适当缩放随机运动

转载 作者:行者123 更新时间:2023-12-02 01:59:15 24 4
gpt4 key购买 nike

我想编写一维粒子运动的模拟。模拟具有以下参数:

  • max_speed:粒子可以获得的最大速度(以米/秒为单位)
  • delta:两个模拟步骤之间的时间间隔(以秒为单位)
  • iters:运行模拟的步骤数

下面是工作模拟的示例。它返回两个值列表:一个表示每个时间步的粒子位置,另一个表示每个时间步的相应秒数。

import random

def simulate_particle(max_speed, delta, iters):
current_position = 0
positions = [current_position]
seconds = [0]
for frame in range(1, iters+1):
max_distance_possible = max_speed * delta
current_position += max_distance_possible * random.uniform(-1, 1)
positions.append(current_position)
seconds.append(frame * delta)
return positions, seconds

如您所见,粒子在下一帧的位置由以下因素决定:

  • 计算粒子能够在两帧之间移动的最大距离(考虑到 max_speeddelta 参数)
  • 将此值乘以从 [-1, 1] 范围内的均匀分布采样的值(以增加一些随机性)

这里的问题是粒子运动与delta参数相关。由于较大的增量允许更大的最大距离,因此具有较大增量的模拟中的粒子更容易远离起始位置。

以下是此问题的图形表示:

import matplotlib.pyplot as plt

for delta, iters, color in zip(
[600, 60, 6], # decreasing deltas
[10, 100, 1000], # larger number of iterations to achieve same end time
['blue', 'orange', 'green'],
):
for repeat in range(50): # run simulations 50 times for each delta
ys, xs = simulate_particle(max_speed=5, delta=delta, iters=iters)
label = f'{delta=}, {iters=}' if repeat == 0 else None
plt.plot(xs, ys, color=color, label=label)

plt.xlabel('Time (s)')
plt.ylabel('Position')
plt.legend()
plt.show()

输出: enter image description here

我理解为什么会发生这种情况:与从更广泛的分布中采样几次相比,从狭窄的分布中多次采样时达到极值要困难得多。

我的问题是如何解决这个问题?我可以做某种标准化吗?我尝试将均匀分布更改为其他分布(例如高斯),但最终发生了相同的效果。

最佳答案

正如您所知,您正在模拟不同的过程,这就是您获得不同行为的原因。

“重新调整”曲线的一种方法是以简化单位绘制结果:将时间 (x) 数组除以 delta(设置时间刻度),然后位置 (y) 数组通过 delta * max_speed (设置长度比例)来获得类似这样的东西(请注意,我放大以突出显示绘图的区域,其中三组迹线之间的重叠更加明显):

new plot

关于python - 在具有可变时间增量的模拟中适当缩放随机运动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69200740/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com