数学赏析:泰勒公式是怎么提出来的

  |  

摘要: 泰勒公式的发现过程

【对数据分析、人工智能、金融科技、风控服务感兴趣的同学,欢迎关注我哈,阅读更多原创文章】
我的网站:潮汐朝夕的生活实验室
我的公众号:潮汐朝夕
我的知乎:潮汐朝夕
我的github:FennelDumplings
我的leetcode:FennelDumplings


布鲁克·泰勒(1685-1731)

泰勒是 18 世纪早期英国牛顿学派的代表人物,1685 年出生,1709 年移居伦敦,获法学硕士学位,1714 年获法学博士学位。

大学期间兼修数学,1715 年,泰勒发表的《Methodus Incrementorum Directa et Inversa》(《正的和反的增量方法》)为数学添加了一个新的分支,今天这个方法被称为有限差分法。在同一著作中他还提出了著名的泰勒公式

泰勒公式是从牛顿插值公式发展来的,但泰勒在证明中没有考虑级数的收敛性,因此证明不严谨,后来柯西完成了完整的证明。泰勒公式开创了有限差分理论,使得任何单变量函数都可以展开成幂级数。此外泰勒还讨论了弦的横向振动问题,通过解方程导出了基本频率公式。

本文我们先把回顾一下插值的发展历程,然后回顾一下泰勒从牛顿等距插值公式提出泰勒公式的思路,最后我们从逼近的角度,从泰勒公式出发展望一下傅里叶级数和沃尔什级数。

插值的发展历程

十七世纪到十八世纪是文艺复兴结束到工业革命开始之间的一段时期,历史一般称其为资产阶级革命时期。多个国家陆续在这一时期建立了资产阶级政权。最有名的比如 1640 年英国资产阶级革命、1775 年美国独立战争、1789 年法国大革命。

资本主义萌芽要求扩大市场,积极推动海外扩张,因此这一时期的风口是大航海和殖民扩张。为了适应航海以及对应的天文学、地理学的进展,数学在这一时期要解决的一个大问题是对函数表(比如开方表、三角函数表、对数表等等)的插值的精度问题,比如对数表上如果已经有了 $\ln{40} = 3.688888, \ln{41} = 3.71357$,我们想要知道 $\ln{41.3}$ 的时候,需要进行差值计算,怎么算的更精确就是当时的人要解决的问题了。这一时期的数学家普遍都研究了插值问题,比如沃利斯、牛顿、泰勒等。

线性插值

比较早期的插值方法为线性插值,它假设两个已知值之间的区间中,函数是自变量的线性函数。对于函数 $f$,如果已经知道 $y_{0} = f(x_{0})$,$y_{1} = f(x_{1})$,可以用以下线性插值的公式计算 $f(x_{0} + s\Delta x)$:

其中 $\Delta y = y_{1} - y_{0}, \Delta x = x_{1} - x_{0}, s \in (0, 1)$,示意图如下:

线性插值公式的大致的推导过程如下:

由 $(x_{0}, y_{0}), (x_{1}, y_{1})$ 确定一条直线,方程为 $y = ax + b$,将两个已知点代入,得到线性方程组:

由克莱默法则,系数行列式 $|D| = \begin{vmatrix} x_{0} & 1 \\ x_{1} & 1 \end{vmatrix} = x_{0} - x_{1} \neq 0$,因此方程组有唯一解。

将 $x_{0} + s\Delta x$ 代入插值直线,有 $f(x_{0} + s\Delta x) = a(x_{0} + s\Delta x) + b$,整理后得到 $f(x_{0} + s\Delta x) = y_{0} + s\Delta y$。

二次插值

线性插值可以看出来非常粗糙,在 1620 年布里格斯(花二十年通过插值计算编制对数表的数学家)用了如下二次插值的计算方法。

如果 $f(x)$ 已知了三个点 $f(x_{0}) = y_{0}, f(x_{1}) = y_{1}, f(x_{2}) = y_{2}$,二次插值公式如下:

其中 $x_{0}, x_{1}, x_{2}$ 是等距的:$\Delta x = x_{1} - x_{0} = x_{2} - x_{1}$,$\Delta y_{0} = y_{1} - y_{0}, \Delta y_{1} = y_{2} - y_{1}$,$\Delta^{2}y_{0} = \Delta y_{1} - \Delta y_{0}$

推导过程与线性插值的过程类似,先从三个已知点求出对应的抛物线,也就是二次多项式 $y = ax^{2} + bx + c$,将三个已知点代入,得到线性方程组:

由范德蒙德行列式的结论:

然后按克莱默法则求解:

将 $x_{0} + s\Delta x$ 代入插值抛物线,有 $f(x_{0} + s\Delta x) = a(x_{0} + s\Delta x)^{2} + b(x_{0} + s\Delta x) + c$,整理后即可得到二次插值公式。

整理的过程非常复杂,这里借助 python 的符号计算库 sympy 进行整理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import sympy as sp

x0, dx = sp.symbols("x0, dx")
x1 = x0 + dx
x2 = x1 + dx

y0, y1, y2 = sp.symbols("y0, y1, y2")
dy0 = y1 - y0
dy1 = y2 - y1
d2y0 = dy1 - dy0

from sympy.matrices import Matrix

D = Matrix([[x0 * x0, x0, 1]
,[x1 * x1, x1, 1]
,[x2 * x2, x2, 1]
])

D1 = Matrix([[y0, x0, 1]
,[y1, x1, 1]
,[y2, x2, 1]
])

D2 = Matrix([[x0 * x0, y0, 1]
,[x1 * x1, y1, 1]
,[x2 * x2, y2, 1]
])

D3 = Matrix([[x0 * x0, x0, y0]
,[x1 * x1, x1, y1]
,[x2 * x2, x2, y2]
])

a = D1.det() / D.det()
b = D2.det() / D.det()
c = D3.det() / D.det()

s = sp.symbols("s")

y = a * (x0 + s * dx) ** 2 + b * (x0 + s * dx) + c
y = sp.simplify(y) # 化简
y = sp.collect(y, [s ** 2, s]) # 提取公因数

print(y)

结果如下:

1
s**2*(y0/2 - y1 + y2/2) + s*(-3*y0/2 + 2*y1 - y2/2) + y0

以上结果为 $s^{2}\cdot\frac{\Delta^{2}y_{0}}{2} + s\cdot(\Delta y_{0} + \frac{1}{2}\Delta^{2}y_{0}) + y_{0}$,这正是二次插值公式:$f(x_{0} + s\Delta x) \approx y_{0} + s\Delta y_{0} + \frac{1}{2}s(s-1)\Delta^{2}y_{0}$。

牛顿等距插值

牛顿将前面的线性插值和二次插值做了推广,得到等距多项式插值公式。

如果知道 $n + 1$ 个点: $y_{i} = f(x_{i}), i=0,1,\cdots,n$,间距相同 $\Delta x = x_{i} - x_{i-1}$,则:

其中 $\Delta^{k}y_{0}$ 为 k 阶差分,定义为 $\Delta^{k+1}y_{0} = \Delta^{k}y_{1} - \Delta^{k}y_{0}$。

泰勒的思路

在牛顿等距插值公式的基础上,泰勒是这样考虑的,令 $x = x_{0} + n\Delta x$,则 $f(x) = f(x_{0} + n\Delta x)$,于是牛顿等距插值公式变为:

记 $n = \frac{x - x_{0}}{\Delta x}, n - 1 = \frac{x - x_{1}}{\Delta x}, n - 2 = \frac{x - x_{2}}{\Delta x}, \cdots$。

于是公式改写为:

现在泰勒考虑的问题是:$\Delta x \rightarrow 0, n \rightarrow \infty$ 时,上式右边的极限是多少。

泰勒假设 $x, y$ 都是 $t$ 的函数 $x = x(t), y = y(t)$,且 $x$ 是随 $t$ 均匀增加的函数,有 $x(0) = x_{0}, x(h) = x_{1}, x(2h) = x_{2}$,于是:

其中 $\dot{y}(ih)$ 为 $y$ 在 $t=ih$ 时的流数。从而:

于是有:$\frac{\Delta y_{0}}{\Delta x}\approx \frac{\dot{y}_{0}}{x_{0}}, \frac{\Delta^{2} y_{0}}{(\Delta x)^{2}} \approx \frac{\ddot{y}_{0}}{x_{0}^{2}}, \frac{\Delta^{3} y_{0}}{(\Delta x)^{3}} \approx \frac{\dddot{y}_{0}}{x_{0}^{3}}$,代入得:

得到上式后,考虑 $\Delta x \rightarrow 0$ 时,$x_{1} \rightarrow x_{0}, x_{2} \rightarrow x_{0}, \cdots$,再考虑两个变量的流数比 $\frac{\dot{y}_{0}}{x_{0}}$ 实际上就是导数 $f’(x_{0})$,这样上式就变成了现代分析学里的泰勒公式:

总结与发展

从逼近的角度讲,泰勒公式的重要意义在于充分光滑的函数可以用多项式进行局部逼近,这传达了一种思想:复杂函数可以用一系列简单函数(基函数系)来表示。

泰勒逼近存在比较大的缺点,主要有两点:

  • 要求 $f(x)$ 可以给出各阶导数,
  • 泰勒逼近只能保证在展开点 $x_{0}$ 的某个邻域内有效,而整体的效果比较差。

后来在 19 世纪,傅里叶指出任何函数,无论怎样复杂,都可以表示为三角级数的形式(1822 年),也就是:

这一进展解决了泰勒级数展开的两个弱点,使得人们从函数光滑这个要求解放出来,同时还能保证整体的逼近效果。

同时,傅里叶逼近比泰勒逼近更优雅,其基函数系(三角函数系:$\{1, \cos{x}, \sin{x}, \cos{2x}, \sin{2x}, \cdots\}$, $-\pi \leq x < \pi$)是完备的正交函数系,该函数系可以看成是一个函数 $\cos{x}$ 经过简单的伸缩平移变换得到的。

被逼近函数 $f(x)$ 的复杂与 $\cos{x}$ 的简单形成了巨大反差。

100 年后在 1923 年,美国数学家沃尔什提出了一个新的完备的正交函数系:沃尔什函数系 $\{W_{n}(x)\}$, $0 \leq x < 1, n=0,1,2,\cdots$,定义如下:

其中 $k_{r}$ 为 $n$ 的二进制码的第 $r$ 位,取值 $0, 1$,假设 $n$ 的二进制有 $p$ 位,则 $n = \sum\limits_{r=0}\limits^{p-1}k_{r}2^{r}$。

沃尔什函数仅取值 $+1$ 和 $-1$,但这两个值在 $[0, 1)$ 之间频繁跳跃,其波形比三角函数复杂很多。但沃尔什函数系是由方波经过二分地伸缩平移得到。也就是说任意复杂函数都可以从方波函数演化出来,这反差比傅里叶逼近还大。


Share