数学中,泰勒公式是一个用函数在某点的信息描述其附近取值的公式。如果函数足够平滑的话,在已知函数在某一点的各阶导数值的情况之下,泰勒公式可以用这些导数值做系数构建一个多项式来近似函数在这一点的邻域中的值。泰勒公式还给出了这个多项式和实际的函数值之间的偏差。
生活中的实例
假设以下场景:
一辆随意行驶的小车,走出了一个很诡异的轨迹曲线:

物理学家觉得这段轨迹很有意思,也想开车走一段一摸一样的轨迹。既然是复制,他把刚才关于“仿造”生活经验应用到这里,提出了一个解决办法:
既然想模仿刚才那辆车,那首先应该保证初始位置一样,继续模仿,让车在初始位置的速度也一样,不满足,继续细化,次保持位置、在初始位置处的速度一样的同时,保证在初始位置处车的加速度也一样,不满足,继续细化,这次保证初始位置、初始位置处的速度、初始位置处的加速度都一样,也保证初始位置处的加速度的变化率也一样,不满足,精益求精,可以一直模仿下去。
物理学家得出结论:把生活中关于“仿造”的经验运用到运动学问题中,如果想仿造一段曲线,那么首先应该保证曲线的起始点一样,其次保证起始点处位移随时间的变化率一样(速度相同),再次应该保证前两者相等的同时关于时间的二阶变化率一样(加速度相同)……如果随时间每一阶变化率(每一阶导数)都一样,那这俩曲线肯定是完全等价的。
泰勒展开
一位数学家,泰勒,某天看到一个函数\(y = e^x\),不由地眉头一皱,心里面不断地犯嘀咕:有些函数啊,他就是很恶心,比如这种,还有三角函数,这样的函数本来具有很优秀的品质(可以无限次求导,而且求导还很容易),但是呢,如果是代入数值计算的话,就很难了。比如,看到\(y = cosx\),后,我无法很方便地计算\(x = 2\)时候的值。
为了避免这种如鲠在喉的感觉,必须得想一个办法让自己避免接触这类函数,即把这类函数替换掉。 可以根据这类函数的图像,仿造一个图像,与原来的图像相类似,这种行为在数学上叫近似。
假设函数\(f(x) = cosx\)的图像,我们的目的是仿造一段一模一样的曲线\(g(x)\),从而避免余弦计算。

想要复制这段曲线,首先得找一个切入点,可以是这条曲线最左端的点,也可以是最右端的点,可以是这条线上任何一点。他选了最左边的点。由于这段曲线过\((0, 1)\)这个点,仿造的第一步,就是让仿造的曲线也过这个点,完成了仿造的第一步,很粗糙,甚至完全看不出来这俩有什么相似的地方,那就继续细节化。开始考虑曲线的变化趋势,即导数,保证在此处的导数相等。经历了第二步,现在起始点相同了,整体变化趋势相近了,可能看起来有那么点意思了。想进一步精确化,应该考虑凹凸性。高中学过:表征图像的凹凸性的参数为“导数的导数”。所以,下一步就让二者的导数的导数相等。起始点相同,增减性相同,凹凸性相同后,仿造的函数更像了。如果再继续细化下去,应该会无限接近。所以泰勒认为“仿造一段曲线,要先保证起点相同,再保证在此处导数相同,继续保证在此处的导数的导数相同……”
有了整体思路,泰勒准备动手算一算。
想仿造一段曲线,应该首先在原来曲线上随便选一个点开始,但是为了方便计算,泰勒选择从\((0, 1)\)这个点入手。
把刚才的思路翻译成数学语言,就变成了:
首先得让其初始值相等,即:\(g(0) = f(0)\)
其次,得让这俩函数在x=0处的导数相等,即:\(g^{'}(0) = f^{'}(0)\)
再次,得让这俩函数在x=0处的导数的导数相等,即:\(g^{''}(0) = f^{''}(0)\)
......
最终,得让这俩图像在x=0的导数的导数的导数的……的导数也相同。
这时候,泰勒思考了两个问题:
第一个问题,余弦函数能够无限次求导,为了让这两条曲线无限相似,我仿造出来的\(g(x)\)必须也能够无限次求导,那\(g(x)\)得是什么样类型的函数呢?
第二个问题,实际操作过程中,肯定不能无限次求导,只需要求几次,就可以达到我想要的精度。那么,实际过程中应该求几次比较合适呢?
综合考虑这两个问题以后,泰勒给出了一个比较折中的方法:令\(g(x)\)为多项式,多项式能求几次导数呢?视情况而定,比如五次多项式\(g(x)=ax^{5}+bx^{4}+cx^{3}+dx^{2}+ex+f\),能求5次导,继续求就都是0了,几次多项式就能求几次导数。
泰勒比我们厉害的地方仅仅在于他想到了把这种生活经验、翻译成数学语言、并运用到仿造函数图像之中。假如告诉你这种思路,静下心来你都能自己推出来。
泰勒开始计算,一开始也不清楚到底要求几阶导数。为了发现规律,肯定是从最低次开始。
先算个一阶的。

可以看出,除了在\((0, 1)\)这个点,其他的都不重合,不满意。
再来个二阶的。

可以看出,在\((0, 1)\)这个点附近的一个小范围内,二者都比较相近。
再来个四阶的。

可以看出,仍然是在\((0, 1)\)这个点附近的一个范围内二者很相近。只是,此时二者重合的部分扩大了。
到这里,不光是泰勒,我们普通人也能大概想象得到,如果继续继续提高阶数,相似范围继续扩大,无穷高阶后,整个曲线都无限相似。

import numpy
import math
import matplotlib
import matplotlib.pyplot
import matplotlib.patches
import mpl_toolkits
import mpl_toolkits.mplot3d
def taylor_cosx():
matplotlib.pyplot.close()
figure = matplotlib.pyplot.figure(figsize = (8, 4))
x = numpy.linspace(0, 20, 1000)
cosy = numpy.cos(x)
try:
for t in range(1, 30):
#
taylory = numpy.zeros(1000)
for n in range(t):
taylory = taylory + (numpy.power(-1, n) * numpy.power(x, 2 * n))/(numpy.math.factorial(2 * n))
matplotlib.pyplot.cla()
matplotlib.pyplot.grid(True)
matplotlib.pyplot.ion()
matplotlib.pyplot.ylim(-2.0, 2.0)
matplotlib.pyplot.plot(x,cosy,label='cos', color = 'red', linewidth = 2)
matplotlib.pyplot.plot(x,taylory,'b--',label='taylor')
matplotlib.pyplot.pause(0.2)
except Exception as err:
print(err)
return True;
if __name__ == '__main__':
taylor_cosx()
然而泰勒当时没有计算机,他只能手算,他跟我们一样,算到四阶就算不动了,他就开始发呆:刚才为什么这么做来着?哦,对了,是为了计算\(cos(2)\)的时候避免出现余弦。所以他从最左端\((0, 1)\)处开始计算,算着算着,他没耐心了,可是离着计算 x = 2 还有一段距离,必须得继续算才能把这俩曲线重合的范围辐射到 x = 2 处。
此时,他一拍脑门,恍然大悟,既然我选的点离着我想要的点还远,我为啥不直接选个近点的点呢,反正能从这条曲线上任何一个点作为切入,开始仿造。近了能省很多计算量啊。想计算\(cos(2)\),可以从\(cos\frac{\pi}{2}\)处开始仿造啊。
所以啊,泰勒展开式就是把一个三角函数或者指数函数或者其他比较难缠的函数用多项式替换掉。
也就是说,有一个\(f(x)\),我再造一个图像与原函数图像相似的多项式函数\(g(x)\),为了保证相似,我只需要保证这俩函数在某一点的初始值相等,1阶导数相等,2阶导数相等,……n阶导数相等。
泰勒算到四阶以后就不想算了,所以他想把这种计算过程推广到n阶,算出一个代数式,这样直接代数就可以了。泰勒就开始了下面的推导过程。
首先要在曲线 f(x) 上任选一个点,为了方便,就选 (0, f(0)),设仿造的曲线的解析式为 g(x),前面说了,仿造的曲线是一个多项式,假设算到n阶。
能求n次导数的多项式,其最高次数肯定也为n。所以,仿造的曲线的解析式肯定是这种形式:
前面说过,必须保证初始点相同,即
\(g(0)=f(0)=a_{0}]\),求出了\(a_{0}\)
接下来,必须保证n阶导数依然相等,即
\(g^{n}(0)=f^{n}(0)\)
因为对 g(x) 求n阶导数时,只有最后一项为非零值,为\(n!a_{n}\),
由此求出\(a_{n}=\frac{f^{n}(0)}{n!}\)
求出了\(a_{n}\),剩下的只需要按照这个规律换数字即可。
综上:\(g(x)=g(0)+\frac{f^{1}(0)}{1!}x+\frac{f^{2}(0)}{2!}x^{2}+……+\frac{f^{n}(0)}{n!}x^{n}\)
知道了原理,然后把原理用数学语言描述,只需要两步即可求出以上结果。背不过推一下就行。
泰勒推到这里,又想起了自己刚才那个问题:不一定非要从x=0的地方开始,也可以从\((x_{0},f(x_{0}))\)开始。此时,只需要将0换成\(x_{0}\),然后再按照上面一模一样的过程重新来一遍,最后就能得到如下结果:
泰勒写到这里,长舒一口气,他写下结论:
有一条解析式很恶心的曲线\(f(x)\),我可以用多项式仿造一条曲线\(g(x)\),那么
泰勒指出:在实际操作过程中,可根据精度要求选择n值,只要n不是正无穷,那么,一定要保留上式中的约等号。
若想去掉约等号,可写成下面形式:
未完待续......
Reference
https://www.zhihu.com/question/25627482/answer/313088784