如何“意会“微积分
微积分是建立在 极限、无穷小、连续性 等等概念的基础上的,所以要学会微积分,就要先理解这些概念。
- 从 无穷大、无穷小 到 极限;
- 从 极限 到 连续;
- 从 连续 到 导数;
- 从 导数 到 微分;
- 从 微分 到 积分;
自学微积分卡壳,一般是在【极限】的概念开始的,主要是因为脑子没有换成“动态的数学脑子”,还是静态地看问题。
极限:静态的理论难以解释动态的现实,所以需要动态的理论
微积分的思想是 分割、以直代曲、近似求和取极限。
比如,求一个曲边梯形面积:
使用微积分的思想,用矩形的直线代曲:
n
n
n 越大,梯形内的矩形越多,以直代曲的数值就越精确:
当
Δ
x
\Delta x
Δx 无限接近0时,矩形的面积和就与曲线下的面积相等,这种计算算法被称为“微积分”。
- 微分: Δ x \Delta x Δx 无限接近0时,微小的矩形面积。
- 积分:把无数这样微小矩形的面积加起来
但什么是 Δ x \Delta x Δx 无限接近0?牛顿、莱布尼茨说的是到头…数学,你用语文定义~
在定义什么是 “ Δ x \Delta x Δx无限接近 0 0 0”时,遇到了真正的困难:
- Δ x \Delta x Δx无限接近于 0 0 0,但 Δ x ≠ 0 \Delta x\ne 0 Δx=0, 否则以 0 0 0为底边长的矩形面积为 0 0 0,无穷多个 0 0 0相加仍然为 0 0 0
- Δ x \Delta x Δx无限接近于 0 0 0,又必须最接近 0 0 0, 不可能有什么实数比 Δ x \Delta x Δx更接近于 0 0 0
- Δ x \Delta x Δx最接近于 0 0 0,所以 Δ x \Delta x Δx一定不能为实数,否则 Δ x 2 \displaystyle\frac{\Delta x}{2} 2Δx就会比 Δ x \Delta x Δx更接近于 0 0 0
数列极限:ε-N 语言
这个问题最早由柯西解决,虽然柯西的定义也不严格,但他的思路是完全准确的。
牛顿、莱布尼茨对 Δ 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 了。
-
柯西:… …
-
魏尔斯特拉斯:不管您说的数多么接近,都能做到,这就是无限逼近。
所以,魏尔斯特拉斯对【极限】的描述是这样的:
- 任意给一个小的数字
ϵ
\epsilon
ϵ(猜数字,比如一亿分之一),如果总能找到一个数字
M
M
M(比如,一亿),当
N
N
N 比
M
M
M 大之后,上面的数列 与
2
2
2 的差距小于
ϵ
\epsilon
ϵ。
用几何图形解释一下,魏尔斯特拉斯大概是这么考虑的。
比如说有这么一个数列,猜测某实数 L L L为它的极限,用一根平行 x x x轴的虚线表示:
随便给一个正实数
ϵ
\epsilon
ϵ,以
L
L
L为中心做一个区间(绿色区间),此时只有有限个点在此区间外(红点):
随着正实数
ϵ
\epsilon
ϵ的缩小(也就是越来越逼近
L
L
L),始终只有有限个点在此区间外:
如果
L
L
L猜测错了,随着正实数
ϵ
\epsilon
ϵ的缩小,会有无数个点在此区间外:
这就是逆向思维定义的极限:
- 极限 L L L是猜测的(后面会系统地说如何去猜)
- 正实数 ϵ \epsilon ϵ是任取的,目的是去逼近 L L L
魏尔斯特拉斯数列极限的定义: 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 ∃ N ∀ n [ n > N ⇒ ∣ x n − L ∣ < ϵ ] \forall \epsilon >0 ~~\exists N~~\forall n\begin{bmatrix} n>N\Rightarrow \begin{vmatrix} x_{n}-L \end{vmatrix}<\epsilon \end{bmatrix} ∀ϵ>0 ∃N ∀n[n>N⇒∣∣xn−L∣∣<ϵ]
这个式子有点复杂,理解复杂式子的方法:【拆分】是理解的第一步。
引入了,两个逻辑符号:
- ∀ \forall ∀ 代表任意
- ∃ \exists ∃ 代表存在
为了明确他们的有效范围,我们画一些大括号:
- ∀ ϵ > 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∣∣<ϵ]]]
而后,从左往后一个个分析:
-
∀ ϵ > 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 ϵ 的邻域里。
收敛数列的性质:
- 有界性:小于某个数(收敛数列必定有界)
- 唯一性:只有一个极限
- 保号性:极限值大于(小于)0,数列从大N开始,也会满足大于(小于)0
- 收敛数列与其子数列间的关系:数列收敛于a,那子数列也收敛于a
到这里,我们就彻底理解了 — 什么是 “ Δ x \Delta x Δx无限接近 0 0 0”。
- Δ x \Delta x Δx 就是数列通项 a n = b − a n a_{n} = \frac{b-a}{n} an=nb−a
- Δ x \Delta x Δx无限接近 0 0 0,就是 lim n → ∞ Δ x = 0 \lim\limits_{n \rightarrow \infty}\Delta x=0 n→∞limΔx=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。
逆向定义的等价式子:
- ∀ ϵ > 0 ∃ δ > 0 ∀ x [ 0 < ∣ a − x ∣ < δ ⇒ ∣ L − f ( x ) ∣ < ϵ ] \forall \epsilon >0 ~~\exists \delta>0~~\forall x \bigg[0<\begin{vmatrix} a-x \end{vmatrix}<\delta \Rightarrow \begin{vmatrix} L - f(x) \end{vmatrix} < \epsilon\bigg] ∀ϵ>0 ∃δ>0 ∀x[0<∣∣a−x∣∣<δ⇒∣∣L−f(x)∣∣<ϵ]
拆解,是理解复杂式子的唯一方法:
- ∀ ϵ > 0 \forall \epsilon >0 ∀ϵ>0 的白话文:对于任意正数 ϵ \epsilon ϵ
- ∀ ϵ > 0 ∃ δ > 0 \forall \epsilon >0 ~~\exists \delta>0 ∀ϵ>0 ∃δ>0 的白话文:都存在某个正数 δ \delta δ
- ∀ ϵ > 0 ∃ δ > 0 ∀ x \forall \epsilon >0 ~~\exists \delta>0~~\forall x ∀ϵ>0 ∃δ>0 ∀x 的白话文:使得 ··· 对任意 x x x 都成立
- ∀ ϵ > 0 ∃ δ > 0 ∀ x [ 0 < ∣ a − x ∣ < δ ⇒ ∣ L − f ( x ) ∣ < ϵ ] \forall \epsilon >0 ~~\exists \delta>0~~\forall x \bigg[0<\begin{vmatrix} a-x \end{vmatrix}<\delta \Rightarrow \begin{vmatrix} L - f(x) \end{vmatrix} < \epsilon\bigg] ∀ϵ>0 ∃δ>0 ∀x[0<∣∣a−x∣∣<δ⇒∣∣L−f(x)∣∣<ϵ] 的白话文:对于任意正数 ϵ \epsilon ϵ,给每个都选定合适的正数 δ \delta δ,使得命题 [ 0 < ∣ a − x ∣ < δ ⇒ ∣ L − f ( x ) ∣ < ϵ ] \bigg[0<\begin{vmatrix} a-x \end{vmatrix}<\delta \Rightarrow \begin{vmatrix} L - f(x) \end{vmatrix} < \epsilon\bigg] [0<∣∣a−x∣∣<δ⇒∣∣L−f(x)∣∣<ϵ] 对于任意 x x x 都成立。
- 0 < ∣ a − x ∣ < δ 0<\begin{vmatrix} a-x \end{vmatrix}<\delta 0<∣∣a−x∣∣<δ,注意不是 ϵ \epsilon ϵ 邻域,而是 δ \delta δ 邻域。
- [ 0 < ∣ a − x ∣ < δ ⇒ ∣ L − f ( x ) ∣ < ϵ ] \bigg[0<\begin{vmatrix} a-x \end{vmatrix}<\delta \Rightarrow \begin{vmatrix} L - f(x) \end{vmatrix} < \epsilon\bigg] [0<∣∣a−x∣∣<δ⇒∣∣L−f(x)∣∣<ϵ] 的白话文:若 x x x 在 a a a 的 δ \delta δ 邻域里,且 x ≠ a x \neq a x=a,则 f ( x ) f(x) f(x) 在 A A A 的 ϵ \epsilon ϵ 邻域。
函数极限出现了俩个邻域,不管 ϵ \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的值。
如果我们对比一下导数的定义:
- f ′ ( x ) = Δ y Δ x ( Δ x → 0 ) f'(x) = \frac{\Delta y}{\Delta x(\Delta x\rightarrow 0)} f′(x)=Δx(Δx→0)Δy
其中 𝛥x 趋近于零,我们用 d x dx dx表示自变量趋于零的情况,用 d y dy dy表示函数的微分。
那微分的定义:
- d y = f ′ ( x ) d x dy =f'(x)dx dy=f′(x)dx
发现他们其实是一回事,因为𝛥x和𝛥y趋近于零之后,就是 d x dx dx和 d y dy dy。
所以,有时人们直接将导数写成:
-
f
′
(
x
)
=
d
y
d
x
f'(x) =\frac{dy}{dx}
f′(x)=dxdy。
连续:光滑的变化趋势
导数是反映函数在某个点的变化速率,不知你是否会想到这种定义的一个可能的“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] 上是连续的。
题目增益:证明 f(x) 在某点连续
题目增益:已知 f(x) 连续,求未知之数的值
题目增益:求所有间断点
导数:瞬间变化的规律
人类在早期的时候,只能认识到平均速度等概念,只有当人类理解了导数这个概念后,才能搞清楚瞬间变化的规律,特别是加速变化的规律,这是人类历史上一次很大的认知升级。
小学的时候,经常听到同桌念一些公式:速度=路程/时间。
像跑 10 10 10公里很容易就可以按照这个公式得到速度,不过这个是平均速度,如果是用于运动分析还不够,我们需要知道你跑 10 10 10公里每分每秒速度的变化。
这个瞬间速度的解法,最早由牛顿提出:当间隔的时间Δt趋近于零的时候,算出来的速度就是那一瞬间的速度。
先解释一下符号:
- Δ x \Delta x Δx:如果自变量 x x x的值,从 x 1 x_{1} x1改变到 x 2 x_{2} x2,那么 x 2 − x 1 = Δ x x_{2}-x_{1}=\Delta x x2−x1=Δx
从 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 ′ ( v ) = Δ s Δ t ( Δ t → 0 ) f'(v) = \frac{\Delta s}{\Delta t(\Delta t\rightarrow 0)} f′(v)=Δt(Δt→0)Δs
由此,牛顿给出了一个结论,时间-距离曲线在各个点切线的斜率,就是各个点的瞬间速度,其实就反映了在某个点距离的变化率。
牛顿把上面这种数学方法推广到任意一个曲线,他将一个曲线在某一个点的变化率,定义成一个新的数学概念 — 导数。
函数 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,作出割线:
把这些割线组成数列:
- { a n } = { B 1 A , B 2 A , B 3 A , ⋯ , B n A } \{a_n\}=\{B_1A,~~B_2A,~~B_3A,~~\cdots,~~B_nA\} {an}={B1A, B2A, B3A, ⋯, BnA}
它的极限 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 ′ ( x 0 ) = lim Δ x → 0 Δ y Δ x = lim Δ x → 0 f ( x 0 + Δ x ) − f ( x 0 ) Δ x f'(x_0)=\lim\limits_{\Delta x\to 0}\frac{\Delta y}{\Delta x}=\lim\limits_{\Delta x\to 0}\frac{f(x_0+\Delta x)-f(x_0)}{\Delta x} f′(x0)=Δx→0limΔxΔy=Δx→0limΔxf(x0+Δx)−f(x0)
如果这个极限存在,那么我们就说函数 f f f 在 x x x 点处可微,而这个求导的过程就叫作微分。
求导有俩种方法:
- 数值微分法: lim Δ x → 0 f ( x 0 + Δ x ) − f ( x 0 ) Δ x \lim\limits_{\Delta x\to 0}\frac{f(x_0+\Delta x)-f(x_0)}{\Delta x} Δx→0limΔxf(x0+Δx)−f(x0)
- 中心差分法: lim Δ x → 0 f ( x 0 + Δ x 2 ) − f ( x 0 − h 2 ) Δ x \lim\limits_{\Delta x\to 0}\frac{f(x_0+\frac{\Delta x}{2})-f(x_0-\frac{h}{2})}{\Delta x} Δx→0limΔxf(x0+2Δx)−f(x0−2h)
# 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 # 中心差分法
# 中心差分法更接近真实值,但是极限都是相等的
中心差分法本质上还是建立在割线的极限是切线的思想,为什么说实际操作时,中心差分法更接近于真实的导数值呢?我们看一个示意图:
从图中可以看出,用中心差分法所做割线的斜率要比普通定义法更接近于真实切线的斜率。
题目增益:判断某点可不可导
因为不相等,所以不存在。
题目增益:判断有几个不可导点
可能是不可导点的地方:
- 分段函数的分段值
- 分母为 0 的地方
题目增益:已知可导,求一个未知之数
判断某点可不可导的反向应用。
当一个点可导,说明上图中的极限存在。
题目增益:已知可导,求俩个未知之数
若这个点可导,那还有一个连续的公式:
把这俩个公式联立起来:
题目增益:求函数的导数
导数的基本公式:
查表,直接代入的情况:
- c ′ = 0 c'=0 c′=0
- ( k x ) ′ = k (kx)'=k (kx)′=k
- ( x n ) ′ = n x n − 1 (x^{n})'=nx^{n-1} (xn)′=nxn−1
- ( l n ∣ x ∣ ) ′ = 1 x (ln|x|)'=\frac{1}{x} (ln∣x∣)′=x1
- ( a n ) ′ = a n ⋅ l n a (a^{n})'=a^{n}·lna (an)′=an⋅lna
- ( e x ) ′ = e x (e^{x})'=e^{x} (ex)′=ex
- ( s i n x ) ′ = c o s x (sinx)'=cosx (sinx)′=cosx
- ( c o s x ) ′ = − s i n x (cosx)'=-sinx (cosx)′=−sinx
- ( − l n ∣ c o s x ∣ ) ′ = t a n x s i n x c o s x (-ln|cosx|)'=tanx\frac{sinx}{cosx} (−ln∣cosx∣)′=tanxcosxsinx
- ( l n ∣ 1 c o s x + s i n x c o s x ∣ ) ′ = 1 c o s x (ln|\frac{1}{cosx}+\frac{sinx}{cosx}|)'=\frac{1}{cosx} (ln∣cosx1+cosxsinx∣)′=cosx1
- ( l n ∣ s i n x ∣ ) ′ = c o t x c o s x s i n x (ln|sinx|)'=cotx\frac{cosx}{sinx} (ln∣sinx∣)′=cotxsinxcosx
- ( − l n ∣ 1 + c o s x s i n x ∣ ) ′ = 1 s i n x (-ln|\frac{1+cosx}{sinx}|)'=\frac{1}{sinx} (−ln∣sinx1+cosx∣)′=sinx1
- ( t a n x ) ′ = 1 c o s 2 x (tanx)'=\frac{1}{cos^{2}x} (tanx)′=cos2x1
- ( − c o t x ) ′ = 1 s i n 2 x (-cotx)'=\frac{1}{sin^{2}x} (−cotx)′=sin2x1
- ( 1 c o s x ) ′ = s i n x c o s 2 x (\frac{1}{cosx})'=\frac{sinx}{cos^{2}x} (cosx1)′=cos2xsinx
- ( − 1 s i n x ) ′ = c o s x s i n 2 x (-\frac{1}{sinx})'=\frac{cosx}{sin^{2}x} (−sinx1)′=sin2xcosx
- ( 1 a ⋅ a r c t a n x a ) ′ = 1 a 2 + x 2 (\frac{1}{a}·arctan\frac{x}{a})'=\frac{1}{a^{2}+x^{2}} (a1⋅arctanax)′=a2+x21
- ( 1 2 a ⋅ l n ∣ a + x a − x ∣ ) ′ = 1 a 2 − x 2 (\frac{1}{2a}·ln|\frac{a+x}{a-x}|)'=\frac{1}{a^{2}-x^{2}} (2a1⋅ln∣a−xa+x∣)′=a2−x21
- ( a r c s i n x a ) ′ = 1 ( a 2 − x 2 ) (arcsin\frac{x}{a})'=\frac{1}{\sqrt(a^{2}-x^{2})} (arcsinax)′=(a2−x2)1
- ( l n ∣ x + ( x 2 + − a 2 ) ∣ ) ′ = 1 ( x 2 + − a 2 ) (ln|x+\sqrt(x^{2}+-a^{2})|)'=\frac{1}{\sqrt(x^{2}+-a^{2})} (ln∣x+(x2+−a2)∣)′=(x2+−a2)1
一些复杂的求导,需要通过换元法把复杂的部分变简单,再计算。
四则运算求导法则:
如果遇到表上类似的函数,但又不能通过查表求导,那么可以通过导数的运算法则来变换到表中的形式。
通过查表求导方法,我们称为公式法。
公式法有俩种情况不能求导:
- f(x)是分段函数,求分段点的导数
- f(x) 分母为 0 的导数
这俩种特殊情况,我们会使用定义法求:
求某导数、左导数、右导数,计算方面比公式法复杂,不过可以求出任意导数。
题目增益:
梯度:多变量函数的微分
梯度的物理含义可以这样理解,如果你去登山,怎样沿着最陡的方向,最快地爬到山顶呢?
梯度函数这个工具可以告诉你在任意一点,往不同方向走的上升速度是不一样的,因此你很容易找到前进的目标。
很多时候,我们都面临在限制要素中作选择的问题。
我们总想全方位改进自己,但是人的精力和资源有限,因此在某一时刻,可能只能向一个方向努力。
希望梯度这个概念在你选择方向时能够给你启发。
很多人从直觉出发,觉得该补短板,另一些人则觉得,该把长板变得更长。
第一类人会和你讲木桶理论,第二类人会和你讲长板理论,每一类都有很多成功的例子,也有很多失败的教训。
于是很多人就不知道该用哪一个理论了。事实上你学了梯度理论后,就很容易作决断了,那就是在任何时刻算出梯度,而后沿着最陡,但是收益最大的路径前进就好。
如果说你有一个目标函数,它可能受到多个变量的影响,那是你长期进步的趋势,但是在每一个时刻,你需要计算一下那个函数针对各个变量的微分,也就是梯度函数,找到进步最显著的方向去努力,这就是通过宏观趋势把握微观变化。
积分:通过微观趋势了解宏观变化
积分是把无数这样微小矩形的面积(微分)加起来,以得到曲线下面积:
…
最值:在机器学习中的应用
现在的机器学习,其实就是对一个目标函数实现最优化的过程。
那么什么是最优化?
其实它最简单的形态大家都不陌生,就是求一个函数的最大值或最小值。
由于这两个问题是对称的,解法类似,因此我们就以求最大值为例来说明。
对于一个有限的集合,求最大值是一件很容易的事情,比如在计算机计算问题中就有很多寻找最大值的算法。
所有那些算法的一个核心思想,就是比较大小。
如果有一个元素在直接或者间接地和其它的元素对比后,它比谁都多,它就是最大值。
这是一种寻找最大值的思想,但在一个有无限集合的函数中就不大灵了,因为你不可能穷尽所有的可能性。
那么怎么办呢?
牛顿他不像前人那样,将最优化问题看成是若干数量比较大小的问题,而看成是研究函数动态变化趋势的问题。
曲线瞬间变化的速率就是那一点切线的斜率,也就是它的导数。
为了强化您对这个要点的理解,我特别将抛物线在最高点附近的斜率变化画出来:
图中各种颜色的曲线,是一些点的切线。
从左到右,抛物线的变化是由快到慢,到平缓,再到下降。
而这些切线也是由陡峭变得平缓,在最高点变成了水平线,而后斜率就往下走了。
如果量化地度量它们,在 x=0 点,切线的斜率,也就是相应点的导数是4。
到 x=0.5 时,斜率或者说导数变成了3,而后变成了2,1,0,-1,-2,等等。
因此如果我们把导数函数也画在图中,就是那根直的虚线。
对比抛物线和它的导数(虚的直线),是否发现了,曲线达到最高点的位置,就是切线变成水平的位置,或者说导数变为0的位置呢?
那么这种现象是巧合么?不是!如果我们回到最大值的定义,对应导数的定义,就很容易理解这两件事情的一致性了。
最大值的含义是说某个点a的函数值f(a)比周围点的数值都大,因此,如果我们从最大值的点往四周走一点点距离,就会发现那些点的函数值要比它小一点。
在二维图上,就是和左右的点比较。
左边的比它小,说明左边的点变化的趋势是向上,导数大于零,右边的也比它小,说明右边的点变化趋势向下,导数小于零。
从大于零的数变成小于零的,中间经过导数为零的点,就是最大值所在。
于是,寻找一个函数f(x)的最大值,就变成了一个寻找该函数的导数f’(x)等于零的问题。
而后一个过程其实就是解方程,比前一个问题要容易。
上面这种思路,就是牛顿在寻找最大值这件事情上,和前人所不同的地方。
他不是直接解决那些很难的问题,而是把比较数大小的问题,变成了寻找函数变化拐点的问题,后一个问题要比前一个好解决。
但是,将这两个问题等同起来,需要发明一种工具,叫做导数。
有了导数这个工具,求最大值问题就变成了解方程的问题。
这个方法的好处在于,它适用于任何函数。
因此,我们不再需要针对每一种特定的函数,寻找一种解题技巧了。
这也是为什么微积分是一种很强大的数学工具的原因。
在过去,找最大值就是一个个地比较数字的大小,这就把数字变化看成是孤立的事件了,因此很难找到通用的求最大值的方法。
牛顿等人通过考察函数变化趋势,发明了一种通过跟踪函数从低到高,再到平稳,最后再下降的变化,而求最大值的方法。
这就让人类对事物的理解从静态,到动态了。
这种方法的好处是,它是通用的,而不是针对具体问题的技巧。
当然,这种方法有一些漏洞,有一些函数的最大值算不出来…