如何创建';台球';python中的反射边界条件?
根据欧文·薛定谔(在《生命是什么?》中)的观点,扩散完全可以用粒子的随机运动来解释。我想通过创建一个程序来测试这一点,该程序创建了一个时间步长的可视化“气体分子”在封闭容器中的扩散。初始条件有两个分区,一个低浓度,一个高浓度。t0后,移除隔板,允许气体扩散。我想使用的唯一机制是向每个分子添加位移随机向量。初始条件如下所示 问题的一部分我没有弄明白,当分子撞击边界表面时,如何创建一个简单的台球式反射。我假设简单的对称反射(在边界处角度为in=角度为out)。我根本没有开始编写代码,因为我不知道如何处理这部分,而我知道如何完成其余部分。我知道这更像是一个数学问题,但如何在python中创建这些边界条件呢?理想情况下,我希望自己编写这个功能,以便能够理解它,而不是使用一个预构建的包来实现这一点。这就是我所寻找的,对于任何给定的分子 最终,我真正需要的是:给定初始位置(x1,y2),向量大小v,角度θ,盒子大小和位置,分子的最终静止位置是什么(x2,y2)如何创建';台球';python中的反射边界条件?,python,numpy,physics,billiards,Python,Numpy,Physics,Billiards,根据欧文·薛定谔(在《生命是什么?》中)的观点,扩散完全可以用粒子的随机运动来解释。我想通过创建一个程序来测试这一点,该程序创建了一个时间步长的可视化“气体分子”在封闭容器中的扩散。初始条件有两个分区,一个低浓度,一个高浓度。t0后,移除隔板,允许气体扩散。我想使用的唯一机制是向每个分子添加位移随机向量。初始条件如下所示 问题的一部分我没有弄明白,当分子撞击边界表面时,如何创建一个简单的台球式反射。我假设简单的对称反射(在边界处角度为in=角度为out)。我根本没有开始编写代码,因为我不知道如
所以要记住几件事:
你必须计算碰撞,当两个分子的中心相距2*半径时,然后进行碰撞。所以要记住几件事:
你需要计算碰撞,当两个分子的中心相距2*半径时,然后进行碰撞。你不需要计算反射角,只需将问题分解为两个:一个用于
x
,另一个用于y
。在这两种情况下,当粒子超出边界时,需要粒子“返回”
这次我做了一个练习,研究流体中的粒子密度。最简单的方法是在两个方向上考虑一个(0, 1)边界。下面的代码应该可以做到这一点(提示:正确使用abs
将创建等效的反射):
根据你的问题,我假设你忽略了粒子-粒子碰撞和粒子-粒子“非叠加”你不需要计算反射角,只需将问题分解为两个:一个用于
x
,另一个用于y
。在这两种情况下,当粒子超出边界时,需要粒子“返回”
这次我做了一个练习,研究流体中的粒子密度。最简单的方法是在两个方向上考虑一个(0, 1)边界。下面的代码应该可以做到这一点(提示:正确使用abs
将创建等效的反射):
根据你的问题,我假设你忽略了粒子碰撞和粒子-粒子“非叠加”这里是一个简单的实现。我每十步改变一次运动矢量,这样我们就可以直观地检查边界反射。更新运动向量时,粒子闪烁红色 所描述的技巧是“展开”边界框。相反,我们让粒子无约束地移动,然后将空间折叠到边界框中
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()
将numpy导入为np
进口派拉布
从matplotlib.animation导入FuncAnimation
xy=np.随机均匀(-1,1,(2200))
xy[0,:160]=np.abs(xy[0,:160])
xy[0160:=-np.abs(xy[0160:]
xy+=1
f、 a=pylab.子地块()
pxy,=pylab.图(*xy,'o'))
def init():
a、 设置\u xlim(0,2)
a、 集_ylim(0,2)
返回pxy,
def更新(帧):
xy全球公司
如果帧%1<0.01:
inc=np.随机.正常(0,0.01,xy.形状)
pxy.set_标记面颜色('red')
elif帧%1<0.11:
pxy.set_标记面颜色('blue'))
xy+=公司
fxy=np.abs((xy+2)%4-2)
pxy.set_数据(*fxy)
返回pxy,
anim=FuncAnimation(f,update,frames=np.arange(1200)/10,
init_func=init,blit=True)
pylab.show()
下面是一个简单的实现。易昌
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()