根据(“生命是什么?”)的说法,扩散完全可以用粒子的随机运动来解释。我想自己测试,通过创建一个程序,创建一个时间步骤可视化的“气体分子”在一个封闭的容器中的扩散。初始条件有两个分区,一个是低的,另一个是高浓度的。在t0之后,隔板被移除,气体被允许扩散。我唯一想使用的机制是在每个分子中加入位移随机向量。初始条件应该是这样的。

我不知道的部分问题是,当分子撞击到边界表面时,如何产生简单的台球式反射。我假设简单的对称反射(角度in =在边界处的角度)。我根本没有启动代码,因为我不知道如何处理这个部分,而我知道如何处理其余的部分。我知道这更像是一道数学题,但是我如何在python中创建这些边界条件呢?理想情况下,我希望自己来编写这个功能,这样我才能理解它,而不是使用一个预先构建的包来实现这个功能。这就是我要找的,对于任何给定的分子。
最后,我真正需要的是:给定初始位置(x1,y2),矢量大小v,角θ,盒大小和位置,分子的最终静息位置(x2,y2)。

发布于 2019-03-06 20:13:43
不需要计算反射角度,只需将问题分解成两个:一个用于x,另一个用于y。在这两种情况下,当粒子超过边界时,你都需要粒子“返回”。
我是为了研究流体中的粒子密度而做的。最简单的事情是考虑两个方向的(0,1)边界。下面的代码应该这样做(提示:正确使用abs将创建相当于反射的内容):
x0 = [.1, .9]
delta = [-0.2, 0.3]
x1 = [(1-abs(abs(xi + di)-1)) for xi, di in zip(x0, delta)]
print(x1)
# 0.1, 0.8
#or using numpy:
x1 = 1-np.abs(np.abs(np.asarray(x0) + np.asarray(delta))-1)
print(x1)
>> [0.09999999999999998, 0.8]
array([0.1, 0.8])我从你的问题中假设你忽略了粒子-粒子碰撞和粒子-粒子“非叠加”
发布于 2019-03-06 21:18:25
下面是一个简单的实现。我只需每十步就改变一次运动矢量,这样就可以直观地检查边界反射。当运动矢量被更新时,粒子会闪红。
正如描述的那样,ħere的诀窍是“展开”边框。相反,我们让粒子不受约束地移动,然后将空间折叠到包围框中。
import numpy as np
import pylab
from matplotlib.animation import FuncAnimation
xy = np.random.uniform(-1, 1, (2, 200))
xy[0, :160] = np.abs(xy[0, :160])
xy[0, 160:] = -np.abs(xy[0, 160:])
xy += 1
f, a = pylab.subplots()
pxy, = pylab.plot(*xy, 'o')
def init():
a.set_xlim(0, 2)
a.set_ylim(0, 2)
return pxy,
def update(frame):
global inc, xy
if frame % 1 < 0.01:
inc = np.random.normal(0, 0.01, xy.shape)
pxy.set_markerfacecolor('red')
elif frame % 1 < 0.11:
pxy.set_markerfacecolor('blue')
xy += inc
fxy = np.abs((xy+2)%4-2)
pxy.set_data(*fxy)
return pxy,
anim = FuncAnimation(f, update, frames=np.arange(1200) / 10,
init_func=init, blit=True)
pylab.show()发布于 2019-03-06 20:10:55
所以有几件事要记住:
对于一个粒子,你不需要用t_0的增量进行参数化,你可以计算截取量,基本上把它放大到那里。对于多重,你必须计算分子间扩散和碰撞forces...which是一个更困难的问题,应该进行参数化。
你必须计算碰撞,当两个分子的中心距离对方2*半径时,然后做一个碰撞,守恒动量。
https://stackoverflow.com/questions/55029524
复制相似问题