Scratch趣味程序:牛顿和下落的苹果

前面我们讲过,德国数学家 莱布尼兹 以和牛顿共同发明了微积分而闻名。那么说到微积分,就不能不提它的另一位发明者,英国物理学家、数学家 —— 牛顿。

牛顿生于 1642 年,他是人类历史上一位划时代的科学巨匠。他在伽利略等人的研究基础上,总结出了力学三定律,奠定了经典物理学的基础;他提出让地球围绕太阳转动、月球围绕地球转动,以及让抛出的物体掉落到地面上的力量,是同一种力 —— 万有引力,并且服从一致的数学规律;他给出的万有引力定律精确地描述了太阳系中几乎一切天体运动,直到 1915 年才被爱因斯坦用更精确的广义相对论修正;他让人们看到了科学和数学的精准、可靠的预言能力,让人们熟悉了科学研究的实证方法,进而开启了科学改变世界的时代。

在关于牛顿的故事中,流传最广的要属他被苹果砸中,然后想出万有引力定律的趣闻了。其实,那和笛卡尔给公主写心形线公式的故事一样,都是美丽的传说。万有引力定律的提出,是在无数次计算、推理、假设、验证的基础上,总结出的严谨成果,岂是被苹果砸一下就能冒出来的。只是由于这个故事有趣,所以流传很广。

我们这里也不怕落入俗流,用这个故事创作一个 Scratch 程序 —— 抛苹果砸牛顿。

Scratch Game - Newton and Apple

代码量:20块积木

角色素材:牛顿的 .svg 文件在 这里下载,解压后上传到作品角色栏中,苹果使用 Scracth 内置的 Apple。

舞台背景:Scratch 内置的 Tree。

程序逻辑

在这个程序中,我们让牛顿在“绿旗子被点击”后,在屏幕下方随机左右移动。用鼠标点击树上的苹果,苹果将被向右抛出,做抛物线运动。如果砸中牛顿,程序结束;如果没有砸中,回到树上的初始位置。

代码

Apple:

Scratch Game - Newton and Apple - code part #1

Newton:

Scratch Game - Newton and Apple - code part #2

讲解

这集我们用很少的几块积木,让苹果实现了牛顿经典力学中的抛物线运动

由于学龄前儿童都能键入这个程序,因此本站斗胆尝试给小朋友解释,为什么上边苹果这段程序能呈现抛物线运动效果,以及 Scratch 动画编程和微积分的相似之处。

要想实现抛物线运动的效果,我们必须让苹果在垂直方向上的速度有变化。因为任何抛射出去的物体,其垂直速度都是不断改变的 —— 当物体向上运动时,向上的速度会越来越慢;当物体向下运动时,向下的速度则会越来越快。

我们可以用一个有正负的数表示速度,正数代表向上运动,负数代表向下运动。这样,刚才我们说到的抛物线运动规律,其实就合并为一条规律:即垂直速度不断地“负增长”。

当垂直速度是正数的时候,“负增长”意味着正数越来越小;当垂直速度是负数的时候,“负增长”意味着“负”得越来越多。

这个程序用了一个小把戏,就是把苹果的“方向”用作了代表它垂直速度的变量。方向在 Scratch 中的取值可以是 -179~180,这对于我们游戏中的垂直速度而言,范围是足够大的。

那我们是如何做到让“方向”代表角色的垂直速度的?把戏就在于,在“重复执行”模块的每一次循环里,都会执行“将 y坐标增加(方向)

程序的每一轮循环,都会耗费一个微小的时间,在这个微小的时间中,角色的 x坐标、y坐标都增加了一些数值。在数学和物理中,坐标改变量” 除以 “耗费时间量” 的比值,也就是速度

如果“重复执行”代码块执行 1次,耗费的时间是 dt 秒,dt 时间内坐标的改变量,我们一般用 dx、dy 来表示,分别代表 x坐标的增量和 y坐标的增量。

在这个程序中,我们在重复执行时每次让 x坐标增加 10,让 y坐标增加(方向),因此,数学关系可以写为:

水平速度 = dx / dt = 10 / dt
垂直速度 = dy / dt = 方向 / dt

在 Scratch 中,动画是以一定“帧率”呈现的。简单来说,帧率也就是 1 秒钟之内,允许角色“变位置”多少次,记为 FPS。那么,变一次位置,耗费的时间也就是 1/FPS,即 dt = 1/FPS,或写为 1/dt = FPS。

因此,角色的水平速度、垂直速度,又可以写为:

水平速度 = dx / dt = 10 / dt = 10 * FPS
垂直速度 = dy / dt = 方向 / dt = 方向 * FPS

在普通模式中,FPS 约为 30,可见,在这个程序中,角色的水平速度是一个不变的数值,而垂直速度就由角色的方向决定了。

而“重复执行”中,每次又将方向的值减小1,也就是 “左转(1)度”。相当于让垂直速度不断负增长,这就制造了抛物线运动的效果。

仿照刚才的分析,我们知道 dt 时间内,方向的增量是 -1,即:

d(方向) / dt = -FPS

将刚才得到的 “ 垂直速度 = 方向 * FPS ” 代入,有:

d(垂直速度) / dt = -FPS * FPS = -FPS²

上述关系,也就是我们的这个抛物线模拟程序中,时间增量与坐标增量,以及时间增量与速度增量的数学关系。

这些各个变量的增量,不严谨地说,也常被称为各变量的“微分”,如时间微分 dt、坐标微分 dx、dy 等。而你最终看到的,是把每一次细微变化累积起来的效果,也就是苹果做抛物线的运动。

循环体中的三个操作,实际上是设定了 dx、dy、dt 之间的关系,相当于构造了运动的微分方程。我们构造的微分方程符合物理学中自由落体的运动定律 d²y / dt² = -g,因此,程序运行效果也看上去像真实的落体一样。

在计算机编程中,我们可以用足够小的每次增量和足够多的次数,去模拟一个真实世界中的连续过程,正如这个抛苹果的程序,以及后续例程中的简谐振动、波动等等。这就有牛顿微积分思想的影子在其中。此类仿真方法也被称为计算机数值模拟。

牛顿和莱布尼兹几乎彼此独立地提出了微积分的理念,但也为谁更早发明微积分的荣誉而争执起来,吵得不可开交,连带欧洲大陆和英国的学术界都一度对立起来。无论怎样,微积分提出后,人类能够分析、计算的领域被极大扩展,推动了 17、18 世纪科学进一步向高水平发展。

发表评论

电子邮件地址不会被公开。