如何创建';台球';python中的反射边界条件?

如何创建';台球';python中的反射边界条件?,python,numpy,physics,billiards,Python,Numpy,Physics,Billiards,根据欧文·薛定谔(在《生命是什么?》中)的观点,扩散完全可以用粒子的随机运动来解释。我想通过创建一个程序来测试这一点,该程序创建了一个时间步长的可视化“气体分子”在封闭容器中的扩散。初始条件有两个分区,一个低浓度,一个高浓度。t0后,移除隔板,允许气体扩散。我想使用的唯一机制是向每个分子添加位移随机向量。初始条件如下所示 问题的一部分我没有弄明白,当分子撞击边界表面时,如何创建一个简单的台球式反射。我假设简单的对称反射(在边界处角度为in=角度为out)。我根本没有开始编写代码,因为我不知道如

根据欧文·薛定谔(在《生命是什么?》中)的观点,扩散完全可以用粒子的随机运动来解释。我想通过创建一个程序来测试这一点,该程序创建了一个时间步长的可视化“气体分子”在封闭容器中的扩散。初始条件有两个分区,一个低浓度,一个高浓度。t0后,移除隔板,允许气体扩散。我想使用的唯一机制是向每个分子添加位移随机向量。初始条件如下所示

问题的一部分我没有弄明白,当分子撞击边界表面时,如何创建一个简单的台球式反射。我假设简单的对称反射(在边界处角度为in=角度为out)。我根本没有开始编写代码,因为我不知道如何处理这部分,而我知道如何完成其余部分。我知道这更像是一个数学问题,但如何在python中创建这些边界条件呢?理想情况下,我希望自己编写这个功能,以便能够理解它,而不是使用一个预构建的包来实现这一点。这就是我所寻找的,对于任何给定的分子

最终,我真正需要的是:给定初始位置(x1,y2),向量大小v,角度θ,盒子大小和位置,分子的最终静止位置是什么(x2,y2)


所以要记住几件事:

  • 你需要一个摩擦组件,否则粒子将永远保持运动(能量守恒)。在这种情况下,摩擦力是速度的函数,反弹时也会产生摩擦力

  • 如果它只是一个单个粒子,可以通过定义边界框来计算它,例如x在0到5之间,y在0到3之间。然后,您可以通过插入x=5值,然后在直线方程中求解y来计算与墙的截距

  • 对于一个粒子,你不必用t_0的增量参数化地计算它,你可以计算截距,基本上在那里放大它。对于多重,你必须计算分子间的扩散和碰撞力…这是一个更难的问题,应该用参数化的方法来完成


    你必须计算碰撞,当两个分子的中心相距2*半径时,然后进行碰撞。

    所以要记住几件事:

  • 你需要一个摩擦组件,否则粒子将永远保持运动(能量守恒)。在这种情况下,摩擦力是速度的函数,反弹时也会产生摩擦力

  • 如果它只是一个单个粒子,可以通过定义边界框来计算它,例如x在0到5之间,y在0到3之间。然后,您可以通过插入x=5值,然后在直线方程中求解y来计算与墙的截距

  • 对于一个粒子,你不必用t_0的增量参数化地计算它,你可以计算截距,基本上在那里放大它。对于多重,你必须计算分子间的扩散和碰撞力…这是一个更难的问题,应该用参数化的方法来完成


    你需要计算碰撞,当两个分子的中心相距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()