最近,我坐在我的火上,靠着窗户略微打开。由于没有屏幕,我想保持它尽可能关闭以防止任何错误。但是,我需要保持稍微开放,以便我能够回到室内。
因为它在纽约市是一个热的,臭味的一天,苍蝇是Abuzz。我发现在我的非法阳台上很难放松,知道我基本上邀请所有的苍蝇进入我的公寓,以便为一体的人类碎屑的自助餐。
这让我思考了部分闭合的窗户在保持苍蝇的效果。随着时间的推移,我的公寓里的苍蝇的功能是什么样的?当你没有朋友时,周日下午的完美问题(除非你计算苍蝇)。
为了运行此模拟,我们需要一个模型,飞行如何导航其垃圾充填世界。作为第一次通过,I' LL模型是在随机方向上移动,随机速度为每次模拟的时间。相当简单,但苍蝇似乎是相对简单的生物。
如果我们使用此模型看一只蝇轨的轨迹,它确实看起来很随机:
现在让' s模拟一堆苍蝇。为此,首先我们初始化数组XS以保持恒定的位置。我们' ll通常在2 * worldheight x worldheight广场分发了这一点。我们' LL还初始化到外面的所有苍蝇(将窗口设置为x = 0,室内为x> 0)。
xs = np。随机的 。 Randn(Nflies,2)* NP。阵列([[worldheight * 2,worldheight]] xs [(xs [:,0]> 0),0] * = - 1 xs [(xs [:,1]< 0),1] * = - 1
def更新(xs,vs):#1.传播苍蝇。 xps = xs + vs * dt#2.确保苍蝇可以' t穿过玻璃。 INOUTMASK =(NP。符号(XPS [:,0])* NP。符号(xs [:0]))== - 1 m =(XPS [INOUTMASK,1] - XS [INOUTMASK,1])/( XPS [INOUTMASK,0] - XS [INOUTMASK,0] + 1E-7)B = XPS [INOUTMASK,1] - M * XPS [INOUTMASK,0] InvalidMASK = B> WindowHeight IDXS = NP。其中(InoutMask)[0] [InvalidMask] XPS [IDXS,0] = 1E-4 * NP。标志(xs [idxs,0])xps [idxs,1] = b [InvalidMask]#3。绑定苍蝇。 XPS [(XPS [:,0]> worldheight),0] = worldheight xps [((xps [:,1]> worldheight)&(xps [:,0]> 0)),1] = WorldHeight XPS [(XPS [:,1]< 0),1] = 0#4。设置新的位置和速度。 xs = xps vs = np。随机的 。 randn(nflies,2)vs =(vs / np。sqrt((vs ** 2)。和(1)[:,np。newaxis]))* maxv返回(xs,vs)
步骤2可能需要一点解释。每次时间,每次飞行都会从其以前的位置行进到其新位置。我们只希望苍蝇能够穿过底部的裂缝,所以我们需要一种方法来确保它们可以' T穿过玻璃。
为此,我们首先找到所有更换室内/室外状态的苍蝇这个时间戳(InoutMask)。这可以通过比较前一个和当前x的符号来完成,因为窗口在x = 0.然后,我们可以使用一些中学数学来计算飞行x = 0的速度。
飞行应该是不可能大于窗户裂缝的高度,我们为苍蝇(InvalidMask),我们将他们设置为他们试图穿过窗口的地方和他们的X在他们来自的一边是一些小epsilon。我不要把它设置为0,因为那么飞行不会被inoutmask拿起,并且可能能够在下一次迭代上穿过玻璃。
第3步只是确保飞行不通过世界的任意墙壁。目前,只定义了我的公寓的地板和墙壁,所以飞行可以在室外逃离-X或+ y方向的无限远。这里的视觉倾向的世界图和#39;
---------------- y = h | | | | | | | _________________________________ | x = -h x = 0 x = h
好的,我们终于可以看到苍蝇飞!由于随机速度向量,他们不想到的看起来非常吉特:
这是伟大的,除了苍蝇Don' t看起来太现实了。让'■使他们的速度矢量变得平滑,使得他们不像Dubstep Light展示。
为此,我们' ll在[-pi / 8,pi / 8]范围内挑选一个随机角度,每个飞行旋转' s速度向量。在这个模拟中,我们赢得了' t完全改变了它们的速度的大小。
def更新(xs,vs):...#2.确保苍蝇可以' t穿过玻璃。 ...#2.5。翻转无效苍蝇的X速度。 vs [idxs,0] * = - 1#3.绑定了苍蝇。 ...#4。设置新的位置和速度。 ... dthetas = np。随机的 。 Randn(Nflies)* NP。 PI / 8.CS,SS = NP。 COS(DTHETAS),NP。 SIN(DTHETAS)RS = NP。数组([[CS,SS],[SS,CS])。转置(2,0,1)vs =(Rs * vs。重塑(nflies,2,1))。总和(轴= 1)
虽然没有必要,加入步骤2.5,使得苍蝇不' T取得卡住随着速度慢慢旋转而持续尝试通过窗户。
在步骤4中,我们为每个飞行创建随机旋转矩阵而不是选择新的随机值,而不是为随机旋转矩阵创建一个随机旋转矩阵,并通过它旋转它们的初始速度。
如果我们现在看看动画,我们可以看到苍蝇看起来有点逼真(如果不是有点差不多):
虽然苍蝇现在遵守航空法律,但仍然存在似乎缺失的东西。通常,苍蝇想要在室内。他们需要在室内。所以要模拟这一点,我在室内的位置添加了吸引物(也许是腐烂的水果),以引诱苍蝇。
为此,我将一个变量添加到飞行和#39; s状态:标量值a,表示它们是多么近的果实。飞行将能够记住一个最近的一个值,所以它可以知道它是否越来越温暖或更冷。
def attraction(x,a):返回1. /(1e-7 + np。sqrt(((x-a。重塑(1,2))** 2)。总和(1)))def更新(xs, vs,ats):#1.传播苍蝇。 ... ATS =吸引力(XS,A)ATP =吸引力(XPS,A)#4.设置新的位置和速度。 ... dthetas = np。随机的 。 Randn(Nflies)* NP。 PI / 16. WorlMask = ATPS< ATS DTHETAS [WorlMask] + = NP。随机的 。 randn(worlmask。sum())* np。 pi / 8. ...返回(xs,vs,ats)
如果吸引力从上一步的时间增加,继续沿同一方向(什么都不做)
我们在[-pi / 16,pi / 16]范围内添加另一个随机旋转,只是为了保持有趣的东西。
只要它感觉越来越多,飞行就会继续直线(有一些随机抖动)。如果它感觉到它呈现错误的方向,它将更积极地探索其邻居,直到它找到了良好的前往。
正如你可以看到的新轨迹所看到的那样,这似乎相当好,因为模拟了一个愚蠢但积极的飞行:
但是,似乎在骨料上,苍蝇只是盛行的吸引子。谢天谢地,这是现实生活中的案例,因为我目前只有两个苍蝇在我的公寓里。
通过手头的这些信息,我终于想回答了流行的游戏显示问题:"我的公寓里有多少苍蝇?"
第一个实验我ran是为了绘制窗户的平均苍蝇数量超过几个最大速度。以下是随机苍蝇的结果:
非常好,事实证明,随着窗口,变得更加开放,苍蝇的数量在室内线性增加。
对于光滑的苍蝇,我们看到了较少的线性函数。我并不肯定为什么&#39。
被吸引的苍蝇产生了更加渐近的(是一个词?)情节。我的假设是,这是因为苍蝇更有可能找到他们的垃圾而不是在其他模型中,所以它在窗户更加开放时帮助它们。
然后我想看看模拟运行的时间有多长时间受到影响的苍蝇数量。我们看到随机和平滑苍蝇的结果。具有更快的移动苍蝇(橙色和绿色地块),随机移动或在平滑情况下随机初始化苍蝇更可能在外部朝向无穷大。因此,随着仿真进展的进展,蝇的总数减少。
在被吸引的苍蝇的情况下,我们再次看到更高的最大速度导致前面达到峰值的峰值。但是,因为苍蝇有一些关于进入的方向的知识,所以他们往往不会进入乙醚和人口最终是平坦的。
谢谢你加入这个毫无意义的运动,如果你错过了这个问题的答案是两个。 他们的名字是嗡嗡声和尼尔。