文章目录
- 极限:静态的理论难以解释动态的现实,所以需要动态的理论
- 数列极限:ε-N 语言
- 函数极限:ε-δ 语言
- 无穷:是趋势,是相对于过程而言,非数
- 无穷大:在算法分析中的应用
- 微分:通过宏观趋势把握微观变化
- 连续:光滑的变化趋势
- 导数:瞬间变化的规律
- 梯度:多变量函数的微分
- 积分:通过微观趋势了解宏观变化
- 最值:在机器学习中的应用
微积分是建立在 极限、无穷小、连续性 等等概念的基础上的,所以要学会微积分,就要先理解这些概念。
自学微积分卡壳,一般是在【极限】的概念开始的,主要是因为脑子没有换成“动态的数学脑子”,还是静态地看问题。
微积分的思想是 分割、以直代曲、近似求和取极限。
比如,求一个曲边梯形面积:
n n n 越大,梯形内的矩形越多,以直代曲的数值就越精确:
当 Δ x \Delta x Δx 无限接近0时,矩形的面积和就与曲线下的面积相等,这种计算算法被称为“微积分”。
但什么是 Δ x \Delta x Δx 无限接近0?牛顿、莱布尼茨说的是到头…数学,你用语文定义~
在定义什么是 “ Δ x \Delta x Δx无限接近 0 0 0”时,遇到了真正的困难:
这个问题最早由柯西解决,虽然柯西的定义也不严格,但他的思路是完全准确的。
牛顿、莱布尼茨对 Δ x \Delta x Δx无限接近 0 0 0的描述是以无穷小代替的(不能再小的数)。
柯西、魏尔斯特拉斯比牛顿、莱布尼茨进步的地方在于,他们把无穷小这个概念从过去人们理解的小得不能再小的数,看成了一个动态变化,往零这个点靠近的趋势 — 从初等数学到高等数学,就是要把看数学的眼光,从一个个静态的数字、孤立的公式,上升到动态变化的趋势。
举个例子,数列: 1 + ( − 1 ) n − 1 n 1+\frac{(-1)^{n-1}}{n} 1+n(−1)n−1
观察 n − > ∞ n -> ∞ n−>∞ 时的变化趋势:
发现越来越趋近 1 1 1,但一定不是 1 1 1,只是无限接近。
所以,柯西说这个数列的极限是 1 1 1。
但是,魏尔斯特拉斯却说还不够精确。
魏尔斯特拉斯肯定了柯西的极限是关于一个无限逼近的趋势的观点,但是在描述无限逼近的方法上,他采用了逆向思维。
魏尔斯特拉斯:误差多么小算是趋近了?
柯西:总得小于一亿分之一吧。
魏尔斯特拉斯:但只要 N N N 大于一亿分之一,这个数列和 1 1 1的差距就小于一亿分之一了。
柯西:那小于 1 0 100 10^{100} 10100 吧。
魏尔斯特拉斯:但只要 N N N 大于 1 0 100 10^{100} 10100 ,这个数列和 1 1 1的差距就小于 1 0 100 10^{100} 10100 了。
柯西:… …
魏尔斯特拉斯:不管您说的数多么接近,都能做到,这就是无限逼近。
所以,魏尔斯特拉斯对【极限】的描述是这样的:
用几何图形解释一下,魏尔斯特拉斯大概是这么考虑的。
比如说有这么一个数列,猜测某实数 L L L为它的极限,用一根平行 x x x轴的虚线表示:
随便给一个正实数 ϵ \epsilon ϵ,以 L L L为中心做一个区间(绿色区间),此时只有有限个点在此区间外(红点):
随着正实数 ϵ \epsilon ϵ的缩小(也就是越来越逼近 L L L),始终只有有限个点在此区间外:
如果 L L L猜测错了,随着正实数 ϵ \epsilon ϵ的缩小,会有无数个点在此区间外:
这就是逆向思维定义的极限:
魏尔斯特拉斯数列极限的定义: lim n → ∞ x n = L \lim\limits_{n \rightarrow \infty}x_{n}=L n→∞limxn=L,数列 a n a_{n} an 在 n − > ∞ n->∞ n−>∞ 中收敛,极限值是 L L L。
这个式子有点复杂,理解复杂式子的方法:【拆分】是理解的第一步。
引入了,两个逻辑符号:
为了明确他们的有效范围,我们画一些大括号:
而后,从左往后一个个分析:
∀ ϵ > 0 [ ] \forall \epsilon >0\left [ ~~ \right ] ∀ϵ>0[ ] 的白话文:对于任意正数 ϵ \epsilon ϵ
∀ ϵ > 0 [ ∃ N [ . . . ] \forall \epsilon >0\left [ ~~\exists N ~~\right[~~...~~] ∀ϵ>0[ ∃N [ ... ] 的白话文:都存在某个自然数 N N N
∀ ϵ > 0 [ ∃ N [ ∀ n [ . . . ] ] ] \forall \epsilon >0\left [ ~~\exists N ~~\left [ ~~\forall n~~\left [ ~~ ...~~\right ]~\right ]~\right] ∀ϵ>0[ ∃N [ ∀n [ ... ] ] ] 的白话文:使得 … 对任意自然数 n n n 都成立。
∀ ϵ > 0 [ ∃ N [ ∀ n [ n > N ⇒ ∣ x n − L ∣ < ϵ ] ] ] \forall \epsilon >0 ~~\Bigg[\exists N~~\bigg[\forall n\begin{bmatrix} n>N\Rightarrow \begin{vmatrix} x_{n}-L \end{vmatrix}<\epsilon \end{bmatrix}\bigg]\Bigg] ∀ϵ>0 [∃N [∀n[n>N⇒∣∣xn−L∣∣<ϵ]]] 的白话文:对于任意正数 ϵ \epsilon ϵ,给每个 ϵ \epsilon ϵ都选定某个合适的自然数 N N N,使得命题 [ n > N ⇒ ∣ x n − L ∣ < ϵ ~n>N\Rightarrow \begin{vmatrix} x_{n}-L \end{vmatrix}<\epsilon~ n>N⇒∣∣xn−L∣∣<ϵ ] ,对任意自然数 n n n 都成立。
n > N ⇒ ∣ a n − L ∣ < ϵ n>N\Rightarrow \begin{vmatrix} a_{n}-L \end{vmatrix}<\epsilon n>N⇒∣∣an−L∣∣<ϵ 的白话文:若 n n n 大于 N N N,则点 a n a_{n} an 在点的 ϵ \epsilon ϵ 邻域里。
数列极限的定义: ∀ ϵ > 0 ⟹ ∃ N \forall \epsilon > 0\implies \exists N ∀ϵ>0⟹∃N
因为是先确定 ϵ \epsilon ϵ,而后才能确定 N N N,所以根据这个顺序,数列极限的定义也被称为 ϵ − N \color{Salmon}{\epsilon-N} ϵ−N语言。
简单的说:不管是多窄的 ϵ \epsilon ϵ邻域,只要根据 ϵ \epsilon ϵ 丢掉开头的前 N N N 项,就能把剩下的所有项一股脑的放进 ϵ \epsilon ϵ 的邻域里。
收敛数列的性质:
到这里,我们就彻底理解了 — 什么是 “ Δ x \Delta x Δx无限接近 0 0 0”。
根据数列极限的定义,可以完美解决之前的困难:
虽然数列极限的定义,但并未给出求极限的方法。
数列的极限: lim n → ∞ x n = L \lim\limits_{n \rightarrow \infty}x_{n}=L n→∞limxn=L,数列 a n a_{n} an 在 n − > ∞ n->∞ n−>∞ 中收敛,极限值是 L L L。
数列极限可以看成函数 f ( n ) f(n) f(n),当 n − > ∞ n->∞ n−>∞ 时的极限。
函数的极限: lim n → a f ( x ) = L \lim\limits_{n \rightarrow a}f(x)=L n→alimf(x)=L,函数 f ( x ) f(x) f(x) 在 n − > a n->a n−>a 中收敛,极限值是 L L L。
逆向定义的等价式子:
拆解,是理解复杂式子的唯一方法:
函数极限出现了俩个邻域,不管 ϵ \epsilon ϵ 邻域有多小,都会存在某个 δ \delta δ,满足【如果把 x x x 放在 a a a 的去心 δ \delta δ 邻域里,那 f ( x ) f(x) f(x) 就在 A A A 的 ϵ \epsilon ϵ 邻域里】。
大概就是上图这个样子,具体如何一步步映射到几何模型,请参见:《如何能更好的理解(ε-δ)语言极限的定义?》。
无穷小:如果函数 f ( x ) f(x) f(x) 当 x − > x 0 x->x_{0} x−>x0 (或 x − > ∞ x->∞ x−>∞)时的极限为零,那么称函数 f ( x ) f(x) f(x) 为 x − > x 0 x->x_{0} x−>x0 (或 x − > ∞ x->∞ x−>∞)时的无穷小。
无穷大:如果函数自变量 x x x的某个变化过程中,相应的函数值的绝对值 ∣ f ( x ) ∣ |f(x)| ∣f(x)∣无限增大,这个变化过程,称为无穷大。
好,我问你世界上最大的数是什么?
但无穷大是一个数吗?它可以被看成是数轴的终点吗?它在数学上和某个具体的大数一样大吗?
这些很基本的问题很多人在大学里学完高等数学其实也没有一个明确的概念,在绝大多数人心目中,无穷大是一个数,只是它比你能想象的数更大而已,人们依然会用理解一些具体数字的方式去理解它,无穷大的世界和我们日常认知的世界完全不一样。
其实我们刚刚看到了对于无穷大的定义,无穷大它不是一个具体的数,它和万亿、googol数(10的一百次方)等等都不同。
它不是静态的,而是动态的,它反映一种趋势,一种无限增加的趋势 — 无穷大并非是一个静态的、具体的大数字,而是一个动态的、不断扩大的变化趋势,希望通过这个概念,提示我们能够以动态的眼光看待世界。
对于无穷大的概念,关键要理解它是动态变化到了最终尽头的描述。
在增大的过程中,有的无穷大会比其它的无穷大更大,因为它变化的趋势比其他的无穷大更快。
计算机是为计算大数设计的,所以其输入的数据规模往往就是呈量级增长的。
在大数据时代,我们的排序算法动不动就是排序几亿个数据,计算量也就随之而来,是多少呢!
几亿 ?
计算量大概是 几亿亿~几百亿,这之间的规模差百万倍(芝麻和大山)。
我们学数据结构与算法时,一定会学到 算法复杂度(时间复杂度、空间复杂度)。
算法复杂度就是 量级 推出来的,提出算法复杂度的科学家也因此获得了当时的图灵奖。
分析一下他们的创见的思路:
计算机是一个计算速度极快的机器。对于小规模的问题,无论怎么算,也花不了多少时间 — 如果说它会遇到什么难题,那就是规模很大的问题。
在比较算法的快慢时,这些人没有考虑具体的数据量,而是考虑随着数据量的增长,带来的问题规模是否随之增长 — 计算机解决的问题,数据量通常是迅速剧增的。
决定算法快慢的因素虽然可能很多,但是所有的算法都可以被分为两类:
在算法分析里,我们用阶作为衡量单位,比如常数阶、对数阶、线性阶、平方阶、立方阶、指数阶······简单来说,阶就是数量级的意思。
好比芝麻、西瓜、大象、山河、月球、太阳、银河系 这样的量级的差别,不同阶的算法可以说跨度很大很大。
就拿排序算法来说,哪怕是算法书里的 优化后的冒泡排序、选择排序,也不要太当回事,因为优化后,也不过是把性能增长了三、五倍,这就好比 1粒芝麻 和 5粒芝麻 都是芝麻量级的东西,就不要比了。
只有当我们不关心几倍的差异后,才可能集中精力考虑量级的差异,设计好的算法。
也就是说,计算机科学家要尽可能地去捡西瓜,而不是捡芝麻。
合格的算法工程师,他在考虑算法时,是在无穷大这一端,考虑计算量增长的趋势,一个平庸的从业者,则是对一个具体的问题,一个固定的N,考虑计算量。
前者可以讲是用高等数学武装起头脑,后者对数学的理解还在小学水平。
从导数出发我们稍微往前走一小步,就进入到微积分的微分了。
什么是微分呢?
如果用前面有关速度的例子中,微分就是 t 趋近于零时,S的值。
如果我们对比一下导数的定义:
其中 x 趋近于零,我们用 d x dx dx表示自变量趋于零的情况,用 d y dy dy表示函数的微分。
那微分的定义:
发现他们其实是一回事,因为x和y趋近于零之后,就是 d x dx dx和 d y dy dy。
所以,有时人们直接将导数写成:
导数是反映函数在某个点的变化速率,不知你是否会想到这种定义的一个可能的“bug”,对于那些不光滑甚至不连续的阶梯函数,其实在跳跃点是无法计算导数的 — 因为当x趋近于零时,y不是无穷小,而是一个常数。
对于这种情况,我们说相应的函数在那个跳跃点不可导。
那么什么函数是可导的呢?这个问题直到柯西那个年代,数学家们还没有完全搞明白,他们觉得一个函数只要连续,除了有个别的尖尖,绝大部分区域都应该是可导的。
后来魏尔斯特拉斯,他提出了一个反例,给出了一种函数,处处连续,但是处处不可导,人们才明白连续和可导是两回事。
关于函数的可导性,记住一个简单的结论就可以了, 一 个 连 续 的 、 光 滑 的 曲 线 就 可 导 \color{#FF3030}{一个连续的、光滑的曲线就可导} 一个连续的、光滑的曲线就可导,这也很好理解,因为函数曲线中的尖尖点是不可导之处,曲线光滑就不会有尖尖点。反过来,今天人们常常用可导性本身来衡量一根曲线是否光滑,有多么光滑。
一个函数的曲线光滑或者不光滑有什么用呢?我可以先把结论告诉你,导数在数学上更本质的意义,在于它是对于连续性的一种测度,光滑、连续的导数曲线,可以成为判断未来走势的依据。
在绝大部分应用中,我们都希望导数曲线是光滑的,因为这意味着变化不会太突然。
函数极限: 左 极 限 lim x → x 0 − f ( x ) = 右 极 限 lim x → x 0 + f ( x ) 左极限\lim\limits_{x \rightarrow x_{0}^{-}}f(x) = 右极限\lim\limits_{x \rightarrow x_{0}^{+}}f(x) 左极限x→x0−limf(x)=右极限x→x0+limf(x)
比如,下图的左极限 = 右极限,那函数的极限就存在。
函数连续: 函 数 极 限 lim x → x 0 f ( x ) = 函 数 值 f ( x 0 ) 函数极限\lim\limits_{x \rightarrow x_{0}}f(x)= 函数值f(x_{0}) 函数极限x→x0limf(x)=函数值f(x0)。
比如,下图,左极限、函数值 x 0 x_{0} x0、右极限是连起来的,没有断,那函数就是连续。
进一步扩展到区间上,如果函数 f ( x ) f(x) f(x) 在开区间上的任意一点连续,那么这个函数 f ( x ) f(x) f(x)就在整个这个开区间上连续。
如果谈到闭区间 [ a , b ] [a,b] [a,b] 上的连续性问题,那么就需要着重单独讨论区间的左右两个端点:我们首先从右侧逼近左侧端点 a a a,如果 lim x → a + f ( x ) = f ( a ) \lim\limits_{x \rightarrow a^{+}}f(x)=f(a) x→a+limf(x)=f(a) 成立,则称函数 f ( x ) f(x) f(x) 在端点 a a a上右连续,我们再从左侧逼近右侧端点 b b b,即 lim x → b − f ( x ) = f ( b ) \lim\limits_{x \rightarrow b^{-}}f(x)=f(b) x→b−limf(x)=f(b) 成立,则称函数 f ( x ) f(x) f(x) 在端点 b b b 上右连续。
那么,如果函数在开区间 ( a , b ) (a,b) (a,b) 上连续,且在左侧端点 a a a 上右连续,在右侧端点 b b b 上左连续,此时此刻,我们就能够说函数 f ( x ) f(x) f(x) 在闭区间 [ a , b ] [a,b] [a,b] 上是连续的。
人类在早期的时候,只能认识到平均速度等概念,只有当人类理解了导数这个概念后,才能搞清楚瞬间变化的规律,特别是加速变化的规律,这是人类历史上一次很大的认知升级。
小学的时候,经常听到同桌念一些公式:速度=路程/时间。
像跑 10 10 10公里很容易就可以按照这个公式得到速度,不过这个是平均速度,如果是用于运动分析还不够,我们需要知道你跑 10 10 10公里每分每秒速度的变化。
这个瞬间速度的解法,最早由牛顿提出:当间隔的时间Δt趋近于零的时候,算出来的速度就是那一瞬间的速度。
从 t 0 t0 t0 这个点出发,经过Δt的时间,走了ΔS的距离,因此在那个点的速度大约是 Δ S Δ t \frac{\Delta S}{\Delta t} ΔtΔS — 这个比值,就是图中那个红色三角形斜边的斜率。
对比左图和右图,你会发现如果Δt减少,ΔS也会缩短,但是 Δ S Δ t \frac{\Delta S}{\Delta t} ΔtΔS的比值就更接近 t 0 t0 t0 那一瞬间的速度。
极限的情况则是Δt趋近于零,那么时间-距离曲线在 t 0 t0 t0 点切线的斜率就是 t 0 t0 t0 的瞬间速度。
由此,牛顿给出了一个结论,时间-距离曲线在各个点切线的斜率,就是各个点的瞬间速度,其实就反映了在某个点距离的变化率。
牛顿把上面这种数学方法推广到任意一个曲线,他将一个曲线在某一个点的变化率,定义成一个新的数学概念 — 导数。
函数 f ( x ) f(x) f(x) 在图像上是曲线:
给出 x ∈ U ( x 0 , Δ x ) x\in U(x_0,\Delta x) x∈U(x0,Δx) 的曲线段:
我们想找到一个直线段来近似这个曲线段,也就是找到这个曲线段的微分:
此微分的特点是,当 Δ x → 0 \Delta x\to 0 Δx→0 时,越来越逼近曲线段:
但这个概念有很大的局限性,它只对圆环类的曲线有效,而对例如下面的这条曲线,描述显然就不适用了:
那么我们应该怎样更准确地描述切线呢?这里就要用到极限的概念。
对于更一般的曲线,需要用极限来定义切线。比如说,要求曲线 f ( x ) f(x) f(x) 在 A A A 点的切线:
在 A A A 附近找一点 B 1 B_1 B1,过两点作直线 B 1 A B_1A B1A,这根直线也称为割线:
而后寻找 A A A 与 B 1 B_1 B1 之间的点 B 2 B_2 B2,作出割线 B 2 A B_2A B2A:
以此类推,找到点 B 3 , B 4 , ⋯ , B n B_3,B_4,\cdots,B_n B3,B4,⋯,Bn,作出割线:
它的极限 lim n → ∞ a n \lim\limits_{n \rightarrow \infty}a_{n} n→∞liman 就是 切 线 \color{Salmon}{切线} 切线:
假设 A A A 点的坐标为: ( x 0 , f ( x 0 ) ) (x_0,f(x_0)) (x0,f(x0))。
要求 A A A 点的切线,知道了A点坐标为 ( x 0 , f ( x 0 ) ) (x_0, f(x_0)) (x0,f(x0)),以及切线的斜率:
其中 斜 率 = tan α 斜率=\tan\alpha 斜率=tanα,根据直线的点斜式,可求得切线函数 g ( x ) g(x) g(x):
g ( x ) − f ( x 0 ) x − x 0 = tan α ⟹ g ( x ) = tan α ( x − x 0 ) + f ( x 0 ) \frac{g(x)-f(x_0)}{x-x_0}=\tan\alpha\implies g(x)=\tan\alpha(x-x_0)+f(x_0) x−x0g(x)−f(x0)=tanα⟹g(x)=tanα(x−x0)+f(x0)
切 线 = 割 线 的 极 限 ⟹ 切 线 的 斜 率 = 割 线 的 斜 率 的 极 限 切线=割线的极限\implies 切线的\color{Magenta}{斜率}=割线的\color{Magenta}{斜率}的极限 切线=割线的极限⟹切线的斜率=割线的斜率的极限
所以来看看割线的斜率怎么求吧。
假设要求 A A A 点的切线的斜率,随便在附近找一点 B B B 作割线:
当 B → A B\to A B→A 的时候(这也表明了切线是割线的极限),两者斜率不断逼近:
先把割线的斜率 tan β \tan\beta tanβ 算出来,假设 A = ( x 0 , f ( x 0 ) ) , B = ( x , f ( x ) ) A=(x_0,f(x_0)),~~B=(x,f(x)) A=(x0,f(x0)), B=(x,f(x)):
tan β = Δ y Δ x = f ( x ) − f ( x 0 ) x − x 0 \tan\beta=\frac{\Delta y}{\Delta x}=\frac{f(x)-f(x_0)}{x-x_0} tanβ=ΔxΔy=x−x0f(x)−f(x0)
切 线 的 斜 率 = tan α = lim B → A tan β = lim x → x 0 f ( x ) − f ( x 0 ) x − x 0 切线的斜率=\tan\alpha=\lim\limits_{B \rightarrow A}\tan\beta=\lim\limits_{x\to x_0}\frac{f(x)-f(x_0)}{x-x_0} 切线的斜率=tanα=B→Alimtanβ=x→x0limx−x0f(x)−f(x0)
切线的概念很简单,我们也非常熟悉,这里我们不做过多停留。下面我们进入到导数概念的介绍,导数的定义和斜率其实看上去很像。
函数 f 的导数我们将其记作 f’,其实它是另外一个函数,导数对定义域内任意自变量 x 的函数值为:
如果这个极限存在,那么我们就说函数 f f f 在 x x x 点处可微,而这个求导的过程就叫作微分。
求导有俩种方法:
# Python
def function(x):
return x*x
# 数值微分法
def numerical_diff(f, x):
h = 1e-4
return (f(x+h) - f(x))/h
# 中心差分法
def numerical_diff_1(f, x):
h = 1e-4
return (f(x+h/2) - f(x-h/2))/h
print('theoretical value={}'.format(2*4))
print('value={},error={}'.format(numerical_diff(function, 4),abs(numerical_diff(function, 4)-8)))
print('value={},error={}'.format(numerical_diff_1(function, 4),abs(numerical_diff_1(function, 4)-8)))
输出:
theoretical value = 8 # 在 x=4 处的导数理论值为 8
value=8.00009999998963, error=9.999998962939571e-05 # 数值微分法
value=7.999999999963592, error=3.6408209780347534e-11 # 中心差分法
# 中心差分法更接近真实值,但是极限都是相等的
中心差分法本质上还是建立在割线的极限是切线的思想,为什么说实际操作时,中心差分法更接近于真实的导数值呢?我们看一个示意图:
从图中可以看出,用中心差分法所做割线的斜率要比普通定义法更接近于真实切线的斜率。
梯度的物理含义可以这样理解,如果你去登山,怎样沿着最陡的方向,最快地爬到山顶呢?
梯度函数这个工具可以告诉你在任意一点,往不同方向走的上升速度是不一样的,因此你很容易找到前进的目标。
很多时候,我们都面临在限制要素中作选择的问题。
我们总想全方位改进自己,但是人的精力和资源有限,因此在某一时刻,可能只能向一个方向努力。
希望梯度这个概念在你选择方向时能够给你启发。
很多人从直觉出发,觉得该补短板,另一些人则觉得,该把长板变得更长。
第一类人会和你讲木桶理论,第二类人会和你讲长板理论,每一类都有很多成功的例子,也有很多失败的教训。
于是很多人就不知道该用哪一个理论了。事实上你学了梯度理论后,就很容易作决断了,那就是在任何时刻算出梯度,而后沿着最陡,但是收益最大的路径前进就好。
如果说你有一个目标函数,它可能受到多个变量的影响,那是你长期进步的趋势,但是在每一个时刻,你需要计算一下那个函数针对各个变量的微分,也就是梯度函数,找到进步最显著的方向去努力,这就是通过宏观趋势把握微观变化。
积分是把无数这样微小矩形的面积(微分)加起来,以得到曲线下面积:
…
现在的机器学习,其实就是对一个目标函数实现最优化的过程。
那么什么是最优化?
其实它最简单的形态大家都不陌生,就是求一个函数的最大值或最小值。
由于这两个问题是对称的,解法类似,因此我们就以求最大值为例来说明。
对于一个有限的集合,求最大值是一件很容易的事情,比如在计算机计算问题中就有很多寻找最大值的算法。
所有那些算法的一个核心思想,就是比较大小。
如果有一个元素在直接或者间接地和其它的元素对比后,它比谁都多,它就是最大值。
这是一种寻找最大值的思想,但在一个有无限集合的函数中就不大灵了,因为你不可能穷尽所有的可能性。
那么怎么办呢?
牛顿他不像前人那样,将最优化问题看成是若干数量比较大小的问题,而看成是研究函数动态变化趋势的问题。
曲线瞬间变化的速率就是那一点切线的斜率,也就是它的导数。
为了强化您对这个要点的理解,我特别将抛物线在最高点附近的斜率变化画出来:
从左到右,抛物线的变化是由快到慢,到平缓,再到下降。
而这些切线也是由陡峭变得平缓,在最高点变成了水平线,而后斜率就往下走了。
如果量化地度量它们,在 x=0 点,切线的斜率,也就是相应点的导数是4。
到 x=0.5 时,斜率或者说导数变成了3,而后变成了2,1,0,-1,-2,等等。
因此如果我们把导数函数也画在图中,就是那根直的虚线。
对比抛物线和它的导数(虚的直线),是否发现了,曲线达到最高点的位置,就是切线变成水平的位置,或者说导数变为0的位置呢?
那么这种现象是巧合么?不是!如果我们回到最大值的定义,对应导数的定义,就很容易理解这两件事情的一致性了。
最大值的含义是说某个点a的函数值f(a)比周围点的数值都大,因此,如果我们从最大值的点往四周走一点点距离,就会发现那些点的函数值要比它小一点。
在二维图上,就是和左右的点比较。
左边的比它小,说明左边的点变化的趋势是向上,导数大于零,右边的也比它小,说明右边的点变化趋势向下,导数小于零。
从大于零的数变成小于零的,中间经过导数为零的点,就是最大值所在。
于是,寻找一个函数f(x)的最大值,就变成了一个寻找该函数的导数f’(x)等于零的问题。
而后一个过程其实就是解方程,比前一个问题要容易。
上面这种思路,就是牛顿在寻找最大值这件事情上,和前人所不同的地方。
他不是直接解决那些很难的问题,而是把比较数大小的问题,变成了寻找函数变化拐点的问题,后一个问题要比前一个好解决。
但是,将这两个问题等同起来,需要发明一种工具,叫做导数。
有了导数这个工具,求最大值问题就变成了解方程的问题。
这个方法的好处在于,它适用于任何函数。
因此,我们不再需要针对每一种特定的函数,寻找一种解题技巧了。
这也是为什么微积分是一种很强大的数学工具的原因。
在过去,找最大值就是一个个地比较数字的大小,这就把数字变化看成是孤立的事件了,因此很难找到通用的求最大值的方法。
牛顿等人通过考察函数变化趋势,发明了一种通过跟踪函数从低到高,再到平稳,最后再下降的变化,而求最大值的方法。
这就让人类对事物的理解从静态,到动态了。
这种方法的好处是,它是通用的,而不是针对具体问题的技巧。
当然,这种方法有一些漏洞,有一些函数的最大值算不出来…