【发布时间】:2021-08-09 20:15:52
【问题描述】:
我有一个 2D 随机游走,其中粒子具有相同的概率向左、向右、向上、向下移动或保持在同一位置。我生成一个从 1 到 5 的随机数来决定粒子将向哪个方向移动。粒子会执行n 步骤,我重复模拟几次。
我想绘制F(t) 第一次击中位于x = -10 的线性屏障的概率(粒子在击中该点后会消失)。我开始计算每个模拟命中陷阱的粒子数量fp,每次在x = -10 位置有一个粒子时添加值1。在此之后,我绘制了fp,第一次撞击陷阱的粒子数,与t,时间步长。
import matplotlib.pyplot as plt
import matplotlib
import numpy as np
import pylab
import random
n = 1000
n_simulations=1000
x = numpy.zeros((n_simulations, n))
y = numpy.zeros((n_simulations, n))
steps = np.arange(0, n, 1)
for i in range (n_simulations):
for j in range (1, n):
val=random.randint(1, 5)
if val == 1:
x[i, j] = x[i, j - 1] + 1
y[i, j] = y[i, j - 1]
elif val == 2:
x[i, j] = x[i, j - 1] - 1
y[i, j] = y[i, j - 1]
elif val == 3:
x[i, j] = x[i, j - 1]
y[i, j] = y[i, j - 1] + 1
elif val == 4:
x[i, j] = x[i, j - 1]
y[i, j] = y[i, j - 1] - 1
else:
x[i, j] = x[i, j - 1]
y[i, j] = y[i, j - 1]
if x[i, j] == -10:
break
fp = np.zeros((n_simulations, n)) # number of paricles that hit the trap for each simulation.
for i in range(n_simulations):
for j in range (1, n):
if x[i, j] == -10:
fp[i, j] = fp[i, j - 1] + 1
else:
fp[i, j] = fp[i, j - 1]
s = [sum(x) for x in zip(*fp)]
plt.xlim(0, 1000)
plt.plot(steps, s)
plt.show()
我应该有以下情节:
但是我得到的图是不同的,因为曲线总是在增加,并且对于大的t 它应该减少(对于大的t,大多数粒子已经击中目标并且概率降低)。即使不使用fp 的总和,我也没有想要的结果。我想知道我的代码哪里错了。这是我用我的代码得到的情节。
【问题讨论】:
-
为了澄清:陷阱垂直位于位置 x=-10。击中该目标后,粒子消失。
-
你需要取导数,不是吗?
-
fp 是你的累积和,而不是概率密度
-
随着您对停止条件的澄清,我觉得这实际上是一维随机游走。沿 y 轴的移动与您的停止条件无关。实际上,您以 1/5 的概率向左或向右迈出一步,或者以 3/5 的概率沿 x 没有移动(因为您正在向上或向下移动或保持不动)。
-
@pjs。接得好。我将其包含在我的答案中。
标签: python random simulation