微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

主动布朗运动

如何解决主动布朗运动

我正在尝试编写 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?