Taylor级数的python实验
引言
众所周知,对于任意一个函数,我们可以选用一组基函数拟合这个函数。什么,你不知道!好吧,没有关系,这是一个很简单的东西,相信在我的解释下,你很快就懂了!
泰勒级数
高等数学里我们学习了一个叫Taylor公式的玩意,即:
f
(
x
)
=
f
(
x
0
)
0
!
+
f
′
(
x
0
)
1
!
(
x
−
x
0
)
+
f
′
′
(
x
0
)
2
!
(
x
−
x
0
)
2
+
.
.
.
+
f
(
n
)
(
x
0
)
n
!
(
x
−
x
0
)
n
+
R
n
(
x
)
f(x)=\frac{f({{x}_{0}})}{0!}+\frac{{{f}^{'}}({{x}_{0}})}{1!}(x-{{x}_{0}})+\frac{{{f}^{''}}({{x}_{0}})}{2!}{{(x-{{x}_{0}})}^{2}}+...+\frac{{{f}^{(n)}}({{x}_{0}})}{n!}{{(x-{{x}_{0}})}^{n}}+{{R}_{n}}(x)
f(x)=0!f(x0)+1!f′(x0)(x−x0)+2!f′′(x0)(x−x0)2+...+n!f(n)(x0)(x−x0)n+Rn(x)
这里我们从选择
x
0
=
0
x_0 = 0
x0=0来拟合任意一个函数,这样我们的公式就变成麦克劳林公式。
python实验
我们就用上面的泰勒级数里的每一项作为基来拟合 s i n ( x ) sin(x) sin(x)好了,看一下拟合的效果。首先上代码:
import torch
from matplotlib import pyplot as plt
import math
from matplotlib_inline import backend_inline
X = torch.arange(-20, 20, 0.1, dtype=torch.float64)
Y_sin = torch.sin(X)
def sin_taylor(X):
m = 10 # 指Tyle公式的阶数
Y = torch.zeros_like(X)
for i in range(1, m + 1):
Y += (-1)**(i - 1) / math.factorial((2 * i - 1)) * torch.pow(X, 2 * i - 1)
return Y
Y_taylor = sin_taylor(X)
f = plt.figure(figsize=(10, 3))
backend_inline.set_matplotlib_formats('svg')
axes = f.gca()
axes.set_ylim(-2, 2)
axes.plot(X, Y_sin, 'r-', X, Y_taylor, 'b--')
注意我们
s
i
n
_
t
a
y
l
o
r
sin\_taylor
sin_taylor函数里的
m
m
m用来指示我们用多少阶的泰勒来拟合,即泰勒公式多项式的个数。这个多项式的个数决定了我们拟合的精确度,让我们改变阶数看一下实际效果就清楚了。
很明显因为我们选用
x
0
=
0
x_0 = 0
x0=0来拟合
s
i
n
(
x
)
sin(x)
sin(x),所以在
0
0
0附近曲线基本上一致,但离远了就不行了。不过随着阶数(order)的提高,这个一致的范围会变大。可以猜想如果阶数趋于无穷的话,泰勒公式是可以完全拟合任意一个函数的。
向量空间
学过线性代数的我们肯定知道什么是向量空间,那一个函数能否看成一个向量能?很显然是可以的,例如
s
i
n
(
x
)
sin(x)
sin(x)可以看成
[
s
i
n
(
x
1
)
,
s
i
n
(
x
2
)
,
s
i
n
(
x
3
)
.
.
.
s
i
n
(
x
n
)
]
[sin(x_1), sin(x_2), sin(x_3)...sin(x_n)]
[sin(x1),sin(x2),sin(x3)...sin(xn)]其中:
n
=
+
∞
n = +\infty
n=+∞,这是一个无穷维的向量。那么这个向量肯定存在于一个无穷维的线性空间中,那么这个线性空间对应的基应该也有无穷个才对。
最后,很自然的如果要拟合一个函数的话就需要无穷多个基才行,这就解释了为什么泰勒公式上面的实验现象
后记
优快云 just a pice of shit,还不支持 s v g svg svg╰(‵□′)╯