【Python讲优化】S06E02 从函数近似到泰勒级数

1.谈谈$\Delta y$与$dy$

在上一讲的内容中,我们提到了利用$\frac{dy}{dx}$来表示因变量$y$关于自变量$x$的导数,而我们到目前为止,都是将其作为一个整体来看待的。在这一讲的开头,我们尝试分别来单独讨论$dy$和$dx$的含义。

首先我们还是来看导数的含义,如果函数$f(x)$在点$(x_0,y_0)$处是可微的,那么依照定义就有:

$lim_{\Delta x\rightarrow 0}\frac{f(x_0+\Delta x)- f(x_0)}{\Delta x}= f'(x_0)$

从这个式子中我们发现了什么端倪呢?那就是$\Delta x$的值越小,越趋近于$0$,那么式子的左边,即:$\frac{f(x_0+\Delta x)- f(x_0)}{\Delta x}$就越趋近于$x_0$处导数的真实值$f'(x_0)$。

我们简单的对式子进行一下变换就有:

$f(x_0+\Delta x)-f(x_0)\approx \Delta xf'(x_0)$

这个表达式的左侧部分$f(x_0+\Delta x)-f(x_0)$称作是$\Delta y$,顾名思义就是当自变量$x$从$x_0$变到$x_0+\Delta x$时,$y$的真实改变量,而右侧部分$\Delta xf'(x_0)$我们称之为$dy$,他充当的是$\Delta y$的近似值,如下图所示:

图1.y值改变量的近似

图1.y值改变量的近似

因此,$dy$可以作为$\Delta y$的一个近似值来看待,特别是当$\Delta x$越小的时候,近似效果越好。

我们最后来总结一下$\Delta x$,$dx$,$\Delta y$,$dy$这几个概念:

对于自变量为$x$的可微函数$y=f(x)$,$\Delta x$,$dx$,$\Delta y$,$dy$的含义分别总结如下:

$\Delta x$:表示自变量$x$的任意增量。

$dx$:表示自变量$x$的微分,实际上就等于$\Delta x$。

$\Delta y$:表示当自变量$x$变化到$x+\Delta x$时,因变量$y$的真实改变量,即:$\Delta y=f(x+\Delta x)-f(x)$。

$dy$:因变量$y$的微分,实际上$dy=f'(x)dx$,这里请大家注意,微分$dy$可以作为真实值$\Delta y$的一个近似。

因此可以看出,微分的作用非常广,我们这里首要关心的就是他在近似过程中的应用:

$f(x+\Delta x)=f(x)+\Delta y \approx f(x)+dy=f(x)+f'(x)\Delta x$

$\Rightarrow f(x+\Delta x) \approx f(x)+f'(x)\Delta x$

2.线性近似的概念

基于上面的式子,进一步的,我们可以表示出:假如函数$f$在$c$点处可微,由直线方程的写法可以拿出函数$f$的曲线在点$c,f(c)$处的切线方程$g(x)$:

$f'(c)=\frac{g(x)-f(c)}{x-c}\Rightarrow g(x)=f(c)+f'(c)(x-c)$

那么此时,过点$(c,f(c))$的切线$g(x)$就可以看做是原函数$f$在点$c$处的线性近似。

概念还是很空洞的,我们还是结合一个例子简单的说明一下:

我们试着用上面的方法来观察一下函数$f(x)=1+sin2x$在取值$x=\pi/2$处的线性近似情况:

我们首先按照上面的公式写出$x=\pi/2$处的切线方程:

$g(x)=f(c)+f'(c)(x-c)$ $=f(\pi/2)+f'(\pi/2)(x-\pi/2)$ $=1+sin\pi+2cos\pi(x-\pi/2)$ $=-2x+(1+\pi)$

即:$g(x)=-2x+(1+\pi)$

然后我们绘制出函数$f(x)$和$x=\pi/2$处切线的图像,并在不同的自变量区域尺度内观察:

代码片段:

import matplotlib.pyplot as plt
import numpy as np
import seaborn
from math import pi
seaborn.set()

def f(x):
    return 1+np.sin(2*x)

def g(x):
    return -2*x+(1+pi)

fig, ax = plt.subplots(2, 2)

x = np.linspace(0, pi, 1000)
ax[0, 0].plot(x, f(x), color='k')
ax[0, 0].plot(x, g(x), color='r')
ax[0, 0].plot(pi/2, f(pi/2), 'ko', markersize=4)

x = np.linspace(pi/4, 3*pi/4, 1000)
ax[0, 1].plot(x, f(x), color='k')
ax[0, 1].plot(x, g(x), color='r')
ax[0, 1].plot(pi/2, f(pi/2), 'ko', markersize=4)

x = np.linspace(3*pi/8, 5*pi/8, 1000)
ax[1, 0].plot(x, f(x), color='k')
ax[1, 0].plot(x, g(x), color='r')
ax[1, 0].plot(pi/2, f(pi/2), 'ko', markersize=4)

x = np.linspace(7*pi/16, 9*pi/16, 1000)
ax[1, 1].plot(x, f(x), color='k')
ax[1, 1].plot(x, g(x), color='r')
ax[1, 1].plot(pi/2, f(pi/2), 'ko', markersize=4)

plt.show()

运行结果:

图2.切线的线性近似效果

图2.切线的线性近似效果

很明显的是,随着自变量$x$区间的不断收窄,在点$(\pi/2,f(\pi/2))$的领域附近,切线的图像和原函数是高度重合的,因此在$\Delta x$越来越小的时候,线性近似的效果就会显得越好。

但是,如果我们仅仅使用这种线性近似,他的效果毕竟还是不算太好,他的近似精度其实还是有很大的提升空间的,那么我们下一步该如何做呢?也许级数是一个很不错的想法。

3.关于无穷级数

3.1.无穷级数的前$n$项和

这里我们引入一个背景知识进行讨论:当我们用计算机来计算正余弦函数或者是自然对数的幂,即$e^n$的时候,通常是基于下面的无穷数列来给出满足较高精度的近似值:

$sin(x)=x-\frac{x^3}{3!}+\frac{x^5}{5!}-\frac{x^7}{7!}+...$

$cos(x)=1-\frac{x^2}{2!}+\frac{x^4}{4!}-\frac{x^6}{6!}+...$

$e^x=1+x+\frac{x^2}{2!}+\frac{x^3}{3!}+\frac{x^4}{4!}+...$

上面的表达式就是无穷级数。无穷级数的概念很多,我们先看最简单的:一组数字的无穷级数:

$\frac{1}{2}+\frac{1}{4}+\frac{1}{8}+...$

在这个级数当中,如果只包含第一项,那么和就为$1/2$,如果包含前两项,那么和为$1/2+1/4=3/4$,如果只包含前三项,那么和就为$1/2+1/4+1/8=7/8$。

级数的前有限项的和,我们叫作部分和。我们把前$n$项部分和记为是$S_n$,很显然对照上面所描述的就有:$S_1=\frac{1}{2}$,$S_2=\frac{3}{4}$,$S_3=\frac{7}{8}$,显然还可以归纳出$S_n=1-\frac{1}{2^n}$,并且可以看得出,$S_n$收敛于$1$。

而至于说无穷级数的和,我们将其定义为部分和$S_n$的极限:$lim_{n\rightarrow \infty}S_n$

当然,我们脱离上面这些个具体的数字来谈定义,我们给出无穷级数前$n$项和的一般表示方法,即:考虑无穷级数:$a_1+a_2+a_3+a_4+a_5+......$,那么在这种表示方法之下,前$n$项的和我们定义为:$S_n=a_1+a_2+a_3+...+a_n=\sum_{k=1}^{n}a_k$

3.2.级数的收敛性

对于无穷级数,我们最关注的便是级数的收敛性,这里我们给出一个比较严格的定义和说法:

对于一个无穷级数$\sum_{k=1}^{\infty}a_k$,如果由他的前$n$项和构成的数列$\{S_1,S_2,S_3,...,S_n\}$最终收敛于$S$,那么我们就称无穷级数$\sum_{k=1}^{\infty}a_k$收敛并且他的和为$S$。反之,如果数列$\{S_1,S_2,S_3,...,S_n\}$发散,那么无穷级数也是发散的,这个无穷级数是没有和的。

3.3.几何级数

对于无穷级数,我们特别的需要关注以下这种形式:

$\sum_{k=1}^{\infty}ar^{k-1}=a+ar+ar^2+ar^3+...$,其中$a\neq 0$。这种形式所表示的级数,称之为几何级数,这是一种比较常见的级数。更具体的,我们可以把几何级数划分为两大类:

top Created with Sketch.