问题描述
我正在尝试编写 Python 代码来模拟密闭箱中的许多粒子。这些粒子的行为方式是它们在盒子中以直线移动,带有轻微的角噪声(粒子路径方向的微小变化)。他们应该通过确认另一个粒子并“洗牌/挤压”彼此并继续沿着他们预定的路径进行交互,就像人类在繁忙的街道上一样。最终,当粒子的密度(或堆积率)达到一定值时,粒子应该聚集在一起,但我还没有到这个阶段。
代码目前具有粒子交互作用,我已经尝试了角噪声,但到目前为止没有成功。我需要帮助的问题是角噪声和粒子相互作用。我对角噪声的想法是将数据乘以大约 0.9 到 1.1 之间的数字,以稍微改变粒子的方向,但在添加线条后,没有任何变化。粒子确实相互作用,但它们似乎围绕另一个相互作用的快速半圆移动,这不是我想要的。 我认为编写角噪声代码不需要任何 ABM 知识或理解,但对于力可能需要一些知识或理解,但我不是 100% 确定。
如果有人对代码速度或想法有任何改进,这可能有助于交互和/或角噪声,我们将不胜感激。我还将留下一个动画示例,这是我的目标:https://warwick.ac.uk/fac/sci/physics/staff/research/cwhitfield/abpsimulations
上面的链接显示了我正在寻找的动画,虽然我不需要滑块,只需要框和移动粒子。整个代码如下所示:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
def set_initial_coordinates():
x_co = [np.random.uniform(0,2) for i in range(n_particles)]
y_co = [np.random.uniform(0,2) for i in range(n_particles)]
return x_co,y_co
def set_initial_veLocities():
x_vel = np.array([np.random.uniform(-1,1) for i in range(n_particles)])
y_vel = np.array([np.random.uniform(-1,1) for i in range(n_particles)])
return x_vel,y_vel
def init():
ax.set_xlim(-0.05,2.05)
ax.set_ylim(-0.07,2.07)
return ln,def update(dt):
xdata = initialx + vx * dt
ydata = initialy + vy * dt
fx = np.abs((xdata + 2) % 4 - 2)
fy = np.abs((ydata + 2) % 4 - 2)
for i in range(n_particles):
for j in range(n_particles):
if i == j:
continue
dx = fx[j] - fx[i] # distance in x direction
dy = fy[j] - fy[i] # distance in y direction
dr = np.sqrt((dx ** 2) + (dy ** 2)) # distance between x
if dr <= r:
force = k * ((2 * r) - dr) # size of the force if distance is less than or equal to radius
# Imagine a unit vector going from i to j
x_comp = dx / dr # x component of force
y_comp = dy / dr # y component of force
fx[i] += -x_comp * force # x force
fy[i] += -y_comp * force # y force
ln.set_data(fx,fy)
return ln,# theta = np.random.uniform(0,2) for i in range(n_particles)
n_particles = 10
initialx,initialy = set_initial_coordinates()
vx,vy = set_initial_veLocities()
fig,ax = plt.subplots()
x_co,y_co = [],[]
ln,= plt.plot([],[],'bo',markersize=15) # radius 0.05
plt.xlim(0,2)
plt.ylim(0,2)
k = 1
r = 0.1
t = np.linspace(0,10,1000)
ani = FuncAnimation(fig,update,t,init_func=init,blit=True,repeat=False)
plt.show()
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)