Python代码中的数学之美:从自由落体到爬虫悖论,十分钟开启数学思维
Posted 天元浪子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python代码中的数学之美:从自由落体到爬虫悖论,十分钟开启数学思维相关的知识,希望对你有一定的参考价值。
数学思维,就是用数学的方式去解决问题,就象吃饭用筷子、喝水用杯子一样,自然而然又理所当然。数学思维并非知识的积累,而是一种由特定思维习惯蕴育而成的能力——这种特定习惯的养成,往往是从解决看似简单的问题开始。本文正是从最简单的自由落体运动抽象出数学分析的一般性原理,进而用来回答蠕虫悖论问题。即使对数学抱有恐惧心理的同学,若能静下心来花上十分钟阅读一遍,也一定可以从中体会到数学之美以及数学分析这个工具的威力。
将长度1米的橡皮筋的一端固定,小明拉着另一端以1米/秒的速度向前奔跑。与此同时,一条毛毛虫从橡皮筋固定的一端开始以1厘米/秒的速度追赶小明。假定橡皮筋可以无限均匀拉伸,小明和毛毛虫都可以长生不老,那么,毛毛虫最终能够追得上小明吗?
这就是被称为“蠕虫悖论”的经典问题,据说是由古希腊数学家芝诺(Zeno of Elea)提出来的——我对此表示怀疑:四千多年前的古希腊人应该不会制造橡皮筋吧?古希腊儿童也许会跳皮筋,但跳的肯定不是橡皮筋。
不过,考古不是我们的话题,搞明白毛毛虫最终能否追得上小明才是当务之急。乍一看,这是一个典型的追击问题,小学生最拿手。可细细琢磨,每秒钟爬1厘米的毛毛虫似乎永远也不可能追上每秒钟跑100厘米的小明。
抱着脑袋想了很久,稍微有了一点眉目:毛毛虫爬过的距离和橡皮筋总长之比
k
k
k,一定是时间
t
t
t的函数,记作:
k
=
f
(
t
)
k = f(t)
k=f(t)
因为橡皮筋的拉伸是均匀的,当毛毛虫处于某个位置时,如果停止爬行, k k k就保持不变;只要向前爬, k k k就一定是单向递增的;当 k k k等于1时,就意味着毛毛虫追上了小明,此时对应的 t t t就是毛毛虫追上小明所花费的时间。
可是, f ( t ) f(t) f(t)又该如何表示呢?既然是追击问题,我们不妨梳理一下从小到大积累起来的、和速度路程相关的知识点,也许用最简单的思想就能解决这个看似复杂的问题。
小学阶段,我们学会了解决以匀速运动为前提的速度和路程问题。假设物体在 t t t时间内移动的距离为 s s s,则物体移动的平均速度 v v v记作:
v = s t v = \\frac{s}{t} v=ts
中学阶段,我们理解了加速度的概念。假设物体运动的初始速度是 v 0 v_0 v0,加速度为 a a a,经过 t t t时间后的物体运动速度 v v v记作:
v = v 0 + a t v = v_0 + at v=v0+at
对于自由落体而言,加速度一般用 g g g表示(约等于 9.8 m / s 2 9.8m/s^2 9.8m/s2),其初始速度为0,自由落体的瞬时速度 v v v记作:
v = g t v = gt v=gt
在 t t t时间内,自由落体下落的距离 s s s记作:
s = 1 2 g t 2 s = \\frac{1}{2}gt^2 s=21gt2
这里,自由落体的瞬时速度 v v v和下落距离 s s s都是时间 t t t的函数,二者之间可以互相推导:对距离函数 s s s求导就是瞬时速度函数 v v v,对瞬时速度函数 v v v积分,就是距离函数 s s s。
v
=
s
′
=
(
1
2
g
t
2
)
′
=
g
t
v = s' = ( \\frac{1}{2}gt^2)' = gt
v=s′=(21gt2)′=gt
s
=
∫
v
d
t
=
∫
g
t
d
t
=
1
2
g
t
2
+
C
s = \\int{vdt} = \\int{gtdt} = \\frac{1}{2}gt^2 + C
s=∫vdt=∫gtdt=21gt2+C
上式中的常数C表示在自由落体开始降落前的下降距离,显然,C=0。如果理解这两个公式有点吃力,那么请牢记以下三点,这是应用数学分析的方法解决实际问题的三大法宝。
- 导数是变化率
- 导数是速度
- 导数是斜率
导数是变化率!忽然间灵光乍现:既然毛毛虫爬过的距离和橡皮筋总长之比 k k k函数不容易直接写出来,何不尝试一下这个函数的导数 k ′ k' k′——也就是在任意的 t t t时刻单位时间内毛毛虫的爬行距离与橡皮筋的长度之比?
不难理解,任意 t t t时刻的橡皮筋长度为 1 + t 1+t 1+t;单位时间内毛毛虫的爬行距离是1厘米,换算成标准单位是0.01米。MyGod,没想到 k ′ k' k′就这么轻易地写出来了:
k ′ = 0.01 1 + t k' = \\frac{0.01}{1+t} k′=1+t0.01
接下来,只要对 k ′ k' k′积分,就可以得到函数 k k k了。积分,就得需要求导公式。也许有些同学已经忘记了如何求导,没关系,只要理解导数的意义,求导公式可以很容易地在网上找到。下面是常用六大基本初等函数的求导公司,其中三角函数和反三角函数的求导公式,我只记住了两个。
-
常数函数
( C ) ′ = 0 (C)' = 0 (C)′=0 -
幂函数
( x n ) ′ = n x n − 1 (x^n)' = nx^{n-1} (xn)′=nxn−1 -
指数函数
( a x ) ′ = a x ln a (a^x)' = a^x\\ln{a} (ax)′=axlna
( e x ) ′ = e x (e^x)' = e^x (ex)′=ex -
对数函数
( ln x ) ′ = 1 x (\\ln{x})' = \\frac{1}{x} (lnx)′=x1 -
三角函数
( sin x ) ′ = cos x (\\sin{x})' = \\cos{x} (sinx)′=cosx
( cos x ) ′ = − sin x (\\cos{x})' = -\\sin{x} (cosx)′=−sinx -
反三角函数
( arcsin x ) ′ = 1 1 − x 2 (\\arcsin{x})' = \\frac{1}{\\sqrt{1-x^2}} (arcsinx)′=1−x21
( arccos x ) ′ = − 1 1 − x 2 (\\arccos{x})' = -\\frac{1}{\\sqrt{1-x^2}} (arccosx)′=−1−x21
显而易见, k ′ k' k′的模样最接近对数函数的导数形式,可以很轻松地写出积分式:
<以上是关于Python代码中的数学之美:从自由落体到爬虫悖论,十分钟开启数学思维的主要内容,如果未能解决你的问题,请参考以下文章
Python代码中的数学之美:用牛顿逼近法计算2的算术平方根
Python代码中的数学之美:用牛顿逼近法计算2的算术平方根