首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在蟒蛇中建立台球反射边界条件?

如何在蟒蛇中建立台球反射边界条件?
EN

Stack Overflow用户
提问于 2019-03-06 18:01:39
回答 3查看 1.7K关注 0票数 0

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

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

最后,我真正需要的是:给定初始位置(x1,y2),矢量大小v,角θ,盒大小和位置,分子的最终静息位置(x2,y2)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-03-06 20:13:43

不需要计算反射角度,只需将问题分解成两个:一个用于x,另一个用于y。在这两种情况下,当粒子超过边界时,你都需要粒子“返回”。

我是为了研究流体中的粒子密度而做的。最简单的事情是考虑两个方向的(0,1)边界。下面的代码应该这样做(提示:正确使用abs将创建相当于反射的内容):

代码语言:javascript
复制
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])

我从你的问题中假设你忽略了粒子-粒子碰撞和粒子-粒子“非叠加”

票数 1
EN

Stack Overflow用户

发布于 2019-03-06 21:18:25

下面是一个简单的实现。我只需每十步就改变一次运动矢量,这样就可以直观地检查边界反射。当运动矢量被更新时,粒子会闪红。

正如描述的那样,ħere的诀窍是“展开”边框。相反,我们让粒子不受约束地移动,然后将空间折叠到包围框中。

代码语言:javascript
复制
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()
票数 1
EN

Stack Overflow用户

发布于 2019-03-06 20:10:55

所以有几件事要记住:

  1. 你需要一个摩擦部件,否则粒子将永远保持运动(能量守恒)。在这种情况下,摩擦发生在速度的函数上,摩擦也会在反弹时发生。
  2. 如果它只是一个粒子,你可以通过定义像x在0到5之间,y是在0到3之间的包围盒来计算它。然后,通过插入x=5值,然后在直线的方程中求解y,就可以用墙计算截距。

对于一个粒子,你不需要用t_0的增量进行参数化,你可以计算截取量,基本上把它放大到那里。对于多重,你必须计算分子间扩散和碰撞forces...which是一个更困难的问题,应该进行参数化。

你必须计算碰撞,当两个分子的中心距离对方2*半径时,然后做一个碰撞,守恒动量

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55029524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档