算法深潜:勇敢者的Python探险
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

分析式方法

用分析式方法解决外场手问题,不得不追溯到几个世纪前的运动模型。

伽利略模型

最常用的模拟球的运动方程可以追溯到伽利略,几个世纪前他提出了描述加速度、速度和距离的多项式。如果忽略风和空气阻力,假设球从地面开始运动,根据伽利略模型,抛掷的球在时刻t的水平位置由这个公式给出

其中v1表示球在x(即水平)方向的初始速度。此外,根据伽利略模型,抛掷的球在时刻t的高度(y)等于

其中v2表示球在y(即垂直)方向的初始速度,a表示重力加速度常数(如果距离单位是m,则约等于9.81)。将第一个公式代入第二个公式,得到球的高度(y)与水平位置(x)的关系:

使用伽利略方程可以对假想球的轨迹进行建模,Python代码如清单1-1所示。如果球的初始水平速度为0.99米/秒,初始垂直速度为9.9米/秒,清单1-1是适用的。你可以试试其他的v1v2值,来对抛出去的球进行建模。

清单1-1:计算球轨迹的函数

用Python将清单1-1的函数画出来,大致看一下球的轨迹是什么样子(不考虑空气阻力及其他可以忽略不计的因素)。第一行导入matplotlib模块的绘图功能。在本书代码中我们导入了很多第三方模块,matplotlib就是其中之一。第三方模块必须先安装再使用。按照下载页面(网址见链接列表1.1条目)的指示,安装matplotlib及其他第三方模块。

清单1-2:画出假想球从抛出(x=0)到落地(x=2)的轨迹图

结果(图1-1)展示了假想球在空中应该遵循的路径。这条弯弯曲曲的路径与每一个受重力影响的移动抛物体路径类似,小说家托马斯·品钦(Thomas Pynchon)诗意地称之为万有引力之虹(Gravitys Rainbow)。

不是所有球都会严格遵循这个路径,但对某个球来说这是一条可能的路径。球从0开始,先上升再下降,就像习惯上看到的那样,我们的视线从左到右,球先上升再下降。

图1-1 假想球的抛出轨迹

x策略

我们已经有了球的位置方程,就可以求解我们感兴趣的任何东西:比如,球最高点的位置;或者它再次回到地平线的位置,外场手需要知道这个位置才能接住球。只要上过物理课的学生都会求解这些问题,如果想教机器人打外场,当然也要教机器人这些方程。确定球的最终位置,就是令刚才的ball_trajectory()函数等于0:

然后,利用二次方程解方程求x

这里我们得到两个解x=0和x=2。其中,第一个解x=0是球的初始位置,即投手抛出或击球手击中的时刻;第二个解x=2是球从空中再次落地的时刻。

这个策略比较简单,称为解x策略,即用方程描述某种情况,然后对感兴趣的变量解方程。解x策略在自然科学领域极为常见,高中和大学都涉及,学生们需要解出:球的预期位置,经济生产的理想水平,实验中化学物质的比例,或其他东西的数值。

x策略非常强大。假设一支军队观察到敌军发射了一枚弹射武器(比如导弹),他们可以迅速将伽利略公式输入计算器,几乎立刻就能找到导弹预期着陆的位置,并相应地规避或拦截导弹。在个人消费者级笔记本电脑上运行Python就可以轻松实现。如果机器人在棒球比赛中打外场,可以毫不费力地接住球。

在这种情况下解x策略很简单,因为我们已经知道了公式及其求解方法。前面提到这个抛球公式是伽利略提出来的。二次方程归功于伟大的穆罕默德·伊本·穆萨·花剌子密(Muhammad ibn Musa al-Khwarizmi),他是第一个给出二次方程的完全通解的人。

花剌子密是19世纪的博学家,不仅创立了代数(algebra)这个词及代数方法,还对天文学、制图学和三角学都有贡献,是带领我们踏上本书之旅的重要人物之一。站在伽利略和花剌子密这样的巨人肩膀上,我们不需要经历推导方程式的磨难——只需要记住并合理地使用它们即可。

内在物理学家

通过伽利略和花剌子密的方程式,以及解x策略,一台精细的机器就可以捕捉到球或拦截导弹了。然而,我们有理由认为,大多数棒球运动员并不会在看到球飞到空中的那一刻就开始写方程式。根据可靠的观察者报告,职业棒球春季训练计划中大量时间用来跑动和击球,很少有时间用来围在白板前推导Navier-Stokes方程。求解球落在哪里这种谜题并不能给外场手问题——即人类如何在不依赖计算机程序的情况下本能地知道球会落在哪里——提供明确的答案。

或许答案还是有的。最油嘴滑舌的解决方案是断言:如果计算机通过求解伽利略二次方程就能确定球落在哪里,那么人类也可以。我们称之为内在物理学家理论(inner physicist theory)。根据这个理论,我们大脑的“湿件”(wetware)能够建立并解决二次方程,或者绘制图形并推断出它们的曲线,这些都远在我们的意识极限水平之下。换句话说,我们每个人的大脑深处都有一个“内在的物理学家”,它能在几秒钟内计算出复杂数学问题的精确答案,并将答案传递给肌肉,然后肌肉就带着我们的身体和手套去找球了。哪怕我们从没上过物理课或者解过x,我们的潜意识也能做到这一点。

内在物理学家理论不乏支持者。其中最著名的是数学家基思·德夫林(Keith Devlin),他于2006年出版了一本著作——《数学本能:为什么你是一个数学天才(包括龙虾、鸟、猫、狗)》。书的封面是一只狗跳起来接飞盘的场景,其中箭头分别表示飞盘和狗的轨迹矢量,意指狗能够进行复杂的计算,使这两个矢量相交。

狗能够抓住飞盘、人类能够抓住棒球,似乎是支持内在物理学家理论的。潜意识是一种神秘而强大的东西,它的深度我们尚未完全了解。那么,为什么潜意识不能偶尔解一解高中水平的方程式呢?更要紧的是,内在物理学家理论难以反驳,因为很难想到其他的替代方案:如果狗不能通过解偏微分方程来抓住飞盘,那又是如何抓住的呢?它们往空中猛地一跳,轻而易举就用嘴叼住了移动中的飞盘。如果没有在大脑中解决一些物理问题,它们(还有我们)怎么可能知道如何精确地拦截球呢?

直到1967年,仍然没有人给出一个好的答案。那一年,工程师Vannevar Bush写了一本书,他在书中描述了他所理解的棒球的科学特征,但对于外场手如何知道往哪里跑才能接到球,却无法给出任何解释。幸运的是,物理学家塞维利亚·查普曼(Seville Chapman)读了Bush的书,受到启发,然后第二年提出了自己的理论。