项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步
1.泰勒公式(Taylor’s Formula)
对于一些复杂的函数,为了方便研究与分析,我们往往希望用一些简单的函数来近似表达。其实这也符合人们对事物的认知规律与认知曲线:有浅入深,由易到难,前面研究的比较容易的部分往往是后面推广结论的特例。在比较简单的函数中,多项式算是最简单的一种了。因为多项表达式只有比较简单的加减乘除四则运算,便能求出函数的值。所以,用多项式表达复杂函数往往是我们的首选。
给出泰勒公式的具体表达式:
如果函数
f
(
x
)
f(x)
f(x)在含有
x
0
x_0
x0的某个开区间
(
a
,
b
)
(a,b)
(a,b)内具有
(
n
+
1
)
(n+1)
(n+1)阶的导数,那么对任一
x
∈
(
a
,
b
)
x \in (a,b)
x∈(a,b),有
f
(
x
)
=
f
(
x
0
)
+
f
′
(
x
0
)
(
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) = f(x_0) + f'(x_0)(x-x_0) + \frac{f''(x_0)}{2!}(x-x_0)^2 + \cdots + \frac{f^{(n)}(x_0)}{n!}(x-x_0)^n + R_n(x)
f(x)=f(x0)+f′(x0)(x−x0)+2!f′′(x0)(x−x0)2+⋯+n!f(n)(x0)(x−x0)n+Rn(x)
其中
R
n
(
x
)
=
f
(
n
+
1
)
(
ϵ
)
(
n
+
1
)
!
(
x
−
x
0
)
(
n
+
1
)
R_n(x) = \frac{f^{(n+1)}(\epsilon)}{(n+1)!}(x-x_0)^{(n+1)}
Rn(x)=(n+1)!f(n+1)(ϵ)(x−x0)(n+1)
这里的
ϵ
\epsilon
ϵ是介于
x
x
x与
x
0
x_0
x0之间的某个值,
R
n
R_n
Rn被称为拉格朗日余项。
泰勒公式的初衷是用多项式来近似表示函数在某点周围的情况。取最常见的
e
x
e^x
ex为例,在
x
=
0
x=0
x=0的附近可以用如下多项式近似表示:
e
x
≈
1
+
x
+
x
2
2
!
+
x
3
3
!
+
⋯
+
x
n
n
!
e^x \approx 1 + x + \frac{x^2}{2!} + \frac{x^3}{3!} + \cdots + \frac{x^n}{n!}
ex≈1+x+2!x2+3!x3+⋯+n!xn
2.麦克劳林级数(Maclaurin)
通过函数在自变量零点的导数求得的泰勒级数又叫麦克劳林级数。以前面提到的
e
x
e^x
ex为例,麦克劳林级数即为
e
x
≈
1
+
x
+
x
2
2
!
+
x
3
3
!
+
⋯
+
x
n
n
!
e^x \approx 1 + x + \frac{x^2}{2!} + \frac{x^3}{3!} + \cdots + \frac{x^n}{n!}
ex≈1+x+2!x2+3!x3+⋯+n!xn
3.泰勒展开的小结
1.泰勒公式的核心思想就是:用多项式函数取逼近光滑的函数。注意这里光滑很重要,因为泰勒公式里面要求具有
(
n
+
1
)
(n+1)
(n+1)阶的导数,如果函数“不光滑”,显然不会满足上面的条件。
2.泰勒公式最常见的应用之一就是用于近似计算。以
s
i
n
(
x
)
sin(x)
sin(x)为例:
s
i
n
(
x
)
=
x
−
1
3
!
x
3
+
1
7
!
x
7
−
1
9
!
x
9
+
⋯
sin(x) = x - \frac{1}{3!}x^3 + \frac{1}{7!}x^7 - \frac{1}{9!}x^9 + \cdots
sin(x)=x−3!1x3+7!1x7−9!1x9+⋯
计算机中计算
s
i
n
(
x
)
sin(x)
sin(x)的值,就可以用上面的公式计算。
4.牛顿法(Newton’s method)
牛顿法(Newton’s method)又称为牛顿-拉弗森方法(Newton-Raphson method)。本博主的master论文里主要的理论依据就是牛顿-拉弗森方法。它是一种在实数域和复数域上近似求解方程的方法。牛顿法使用函数 f ( x ) f(x) f(x)的泰勒级数的前面几项来寻找方程 f ( x ) = 0 f(x)=0 f(x)=0的根。所以他跟泰勒展开有天然的关系。
有前面的泰勒展开
f
(
x
)
=
f
(
x
0
)
+
f
′
(
x
0
)
(
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) = f(x_0) + f'(x_0)(x-x_0) + \frac{f''(x_0)}{2!}(x-x_0)^2 + \cdots + \frac{f^{(n)}(x_0)}{n!}(x-x_0)^n + R_n(x)
f(x)=f(x0)+f′(x0)(x−x0)+2!f′′(x0)(x−x0)2+⋯+n!f(n)(x0)(x−x0)n+Rn(x)
取泰勒展开的一次项,忽略后面的高次项,有:
f
(
x
)
=
f
(
x
0
)
+
f
′
(
x
0
)
(
x
−
x
0
)
f(x) = f(x_0) + f'(x_0)(x-x_0)
f(x)=f(x0)+f′(x0)(x−x0)
如果我们将得到的新的坐标为
x
n
+
1
x_{n+1}
xn+1,原来的坐标为
x
n
x_n
xn,通常
x
n
+
1
x_{n+1}
xn+1比
x
n
x_n
xn更接近方程
f
(
x
)
=
0
f(x)=0
f(x)=0的解。因此利用新的坐标为
x
n
+
1
x_{n+1}
xn+1进行下一轮迭代。
由上面的式子,很容易得出迭代公式为:
x
n
+
1
=
x
n
−
f
(
x
n
)
f
′
(
x
n
)
x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}
xn+1=xn−f′(xn)f(xn)
用此式迭代,即可得到方程
f
(
x
)
=
0
f(x)=0
f(x)=0的根。
牛顿迭代的几何意义如下图
5.牛顿迭代实例
http://blog.csdn.net/bitcarmanlee/article/details/52194255 一文中,我们提到用牛顿迭代求解一个数的方根。里面我们给出了迭代公式,但是没有给出具体的推导过程。这里我们就推导一下求解方根迭代公式的过程。
求
n
n
n的方根,即求解
x
2
−
n
=
0
x^2-n=0
x2−n=0
令
f
(
x
)
=
x
2
−
n
f(x) = x^2 - n
f(x)=x2−n,则
f
′
(
x
)
=
2
x
f'(x) = 2x
f′(x)=2x
根据前面求得的牛顿迭代公式:
x
(
n
+
1
)
=
x
n
−
f
(
x
)
f
′
(
x
)
=
x
n
−
x
n
2
−
n
2
x
n
=
1
2
(
x
n
+
n
x
n
)
x_{(n+1)} = x_n - \frac{f(x)}{f'(x)} = x_n - \frac{x_n^2-n}{2x_n} = \frac{1}{2}(x_n + \frac{n}{x_n})
x(n+1)=xn−f′(x)f(x)=xn−2xnxn2−n=21(xn+xnn)
result = 0.5 * (result + (n / result))
这行代码即由上述迭代公司所求得。