1. 程式人生 > >看完這篇讓你高數不掛科之——泰勒公式

看完這篇讓你高數不掛科之——泰勒公式

本文始發於個人公眾號:**TechFlow**,原創不易,求個關注
今天的文章我們來討論大名鼎鼎的**泰勒公式**,[泰勒公式](https://book.douban.com/subject/2112359/ "高等數學(上海交大第五版)")真的非常有名,我相信上過高數課的一定都記得它的大名。即使你翹掉了所有的課,也一定會在考前重點裡見過。 我對它的第一映像就是比較難,而且感覺沒有太多意思,就是一個近似的函式而已。最近重溫了一下有了一些新的心得,希望盡我所能講解清楚。
## 泰勒公式的用途
在看具體的公式和證明之前,我們先來了解一下它的用途,然後帶著對用途的理解再去思考它出現的背景以及原理會容易許多。這也是我自學這麼久總結出來的規律。 泰勒公式本質解決的是**近似的問題**,比如說我們有一個看起來很複雜的方程,我們直接計算方程本身的值可能非常麻煩。所以我們希望能夠找到一個近似的方法來獲得一個足夠近似的值。 從這裡,我們得到了兩個重點,一個是近似的**方法**,另一個是近似的**精度**。我們既需要找到合適的方法來近似,同時也需要保證近似的精度是可控的。否則一切都沒有意義,結合實際其實很好理解,比如我們用機床造一個零件。我們都知道世界上不存在完美的圓,實際上我們也並不需要完美,但是我們需要保證偏差是可控的,並且在一定的範圍內。泰勒公式也是一樣,它既可以幫助我們完成近似,也可以保證得到的結果是足夠精確的。
## 泰勒公式的定義
我們下面來看看泰勒公式的定義,我們已經知道了它的用途是求一個函式的近似值。但是我們怎麼來求呢,其實一個比較樸素的思路是**通過斜率逼近**。 舉個例子: ![](https://user-gold-cdn.xitu.io/2020/3/6/170ad608076725f3?w=300&h=209&f=png&s=23655) 這是一張經典的導數圖,從上圖我們可以看到,隨著$\Delta x$的減小,點$P_0$和$P$也會越來越接近,這就帶來了$\Delta y$越來越接近$\Delta x \cdot f'(x_0)$。 當然,當$\Delta x$比較大的時候顯然誤差就會比較大,為了縮小誤差,我們可以引入二階導數、三階導數以及高階導數。由於我們並不知道函式究竟可以有多少階導數,我們不妨假設f(x)在區間內一直有(n+1)階導數,我們試著寫出一個多項式來逼近原函式: $$P_n(x)=a_0+a_1(x-x_0)+a_2(x-x_0)^2+\cdots+a_n(x-x_0)^n$$ 我們希望這個式子與原值的誤差**越小越好**,究竟要多小才算足夠好呢?數學家們給出了定義,希望它是$(x-x_0)^n$的高階無窮小。也就是說誤差比上$(x-x_0)^n$的極限是0。 我們前面說了,我們是通過導數來逼近的,所以我們假設: $$ \begin{aligned} P_n(x_0) &= f(x_0), P_n'(x_0) = f'(x_0) \\ P_n''(x_0) &= f''(x_0), \cdots, P_n^{(n)} = f^{(n)}(x_0) \end{aligned} $$ 按照這個假設我們可以很方便地得到係數了,其實很簡單,我們構造係數使得求導之後相乘的常數項全部約掉。 $$ \begin{aligned} a_0 = f(x_0), 1\cdot a_1 = f'(x_0) \\ 2!\cdot a_2 = f''(x_0), \cdots, n!\cdot a_n = f^n(x_0) \end{aligned} $$ 我們把這兩個式子帶入一下,可以得到: $$P_n(x)=f(x_0)+f'(x_0)(x - x_0)+\frac{f''(x_0)}{2!}(x - x_0)^2+\cdots+\frac{f^{(n)}}{n!}(x-x_0)^n$$
## 泰勒公式的證明
其實上面的式子就是泰勒公式的內涵了,也就是說我們通過**高階導數**來逼近了原函式。最後我們只需要證明這個式子就是我們想要的,也就是它的誤差足夠小。 我們同樣用一個函式$R(x)$來表示$P_n(x)$與原函式$f(x)$的差值。我們直接比較比較困難,所以數學家採取了一系列花裡胡哨、歎為觀止的操作。 我們帶入一下可以發現,$R(x_0)=0$,不僅如此,$R'(x_0)=R''(x_0)=\cdots=R^{(n)}(x_0)=0$。 以上步驟完全不需要證明,我們直接帶入求導就可以得到。因為存在$x-x_0$的項,很明顯當$x=x_0$的時候,可以得到如上的結論。 到這裡,我們需要進行一個猜測,這裡的步驟有一點跳躍。就連課本上都沒有詳細的解釋,沒有詳細解釋的原因也很簡單,因為需要用到積分的知識。而讀者在這裡是還沒有接觸過積分的,不過,我們不是嚴謹的論文,可以稍稍放鬆一些。其實根據上面的公式,我們是可以有些猜測的。根據上面的規律,以及我們的目標——證明這個$R(x)$函式是一個關於$(x-x_0)^n$的無窮小,所以我們可以猜測它應該是一個與$(x-x_0)^{n+1}$相關的函式。 有了這個猜測之後,我們套用一下柯西中值定理: $$\frac{f(b) - f(a)}{F(b) - F(a)}=\frac{f'(\xi)}{F'(\xi)}$$ 我們令$f(x)=R_n(x), F(x)=(x-x_0)^{n+1}$,套用中值定理可以得到: $$\frac{R_n(x)}{(x-x_0)^{n+1}}=\frac{R_n(x)-R_n(x_0)}{(x-x_0)^{n+1}-0}=\frac{R'_n(\xi_1)}{(n+1)(\xi_1-x_0)^n}, (\xi_1 \in (x_0, x))$$ 有了這個結論之後,我們再對函式$R_n'(x)$和$(n+1)(x-x_0)^n$在區間$(x_0, \xi_1)$上再次應用柯西中值定理: $$\frac{R_n'(\xi_1)}{(\xi_1 - x_0)^n}=\frac{R'_n(\xi_1)-R_n'(x_0)}{(n+1)(\xi_1-x_0)^n-0}=\frac{R''_n(\xi_2)}{n(n+1)(\xi_2-x_0)^{n-1}}, (\xi_2 \in (x_0, \xi_1))$$ 接下來就是熟悉的**套娃環節**了,經過一共n+1次套娃之後,我們可以得到: $$\frac{R_n(x)}{(x-x_0)^{n+1}}=\frac{R^{(n+1)}_n(\xi)}{(n+1)!}, (\xi \in (x_0, \xi_n))$$ 我們對$P_n(x)$求n+1次導數,可以得到0,因為所有項最多隻有n次,求n+1次導數之後全部變成0。也就是說$P^{(n+1)}_n(x)=0$,所以$R^{(n+1)}_n(x)=f^{(n+1)}_n(x)$,我們把這項代入上式,可以得到: $$R_n(x)=\frac{f^{(n+1)}(\xi)}{(n+1)!}(x-x_0)^{n+1}, (\xi \in (x_0, x))$$
## 證明一下誤差
接下來我們要證明這個誤差$R_n(x)$是$(x-x_0)^{n+1}$的高階無窮小。 到這裡,證明就很簡單了,在固定的區間(a, b)中,很明顯函式$f^{(n+1)}(x)$存在最大值,我們**假設這個最大值是M**。也就是說$f^{(n+1)}(x) \leq M, x \in (a, b)$ 那麼: $$\lim_{x\to x_0}\frac{R_n(x)}{(x-x_0)^n} \leq \lim_{x\to x_0} \frac{\frac{M(x-x_0)^{n+1}}{(n+1)!}}{(x-x_0)^n}=\lim_{x\to x_0}\frac{M(x-x_0)}{(n+1)!}$$ 由於x逼近$x_0$,M是一個常數,所以這個極限趨向於0,我們可以用極限的定義很容易證明。於是我們證明了,誤差$R_n(x)$是比$(x-x_0)^n$更高階的無窮小。 所以我們可以得到: $$f(x)=f(x_0)+f'(x_0)(x - x_0)+\frac{f''(x_0)}{2!}(x - x_0)^2+\cdots+\frac{f^{(n)}}{n!}(x-x_0)^n+R_n(x)$$ 由於我們一共用到了n階導數來表達原函式,所以我們稱為這是原函式f(x)的**n階泰勒展開**。最後的$R_n(x)=\frac{f^{(n+1)}(\xi)}{(n+1)!}(x-x_0)^{n+1}, (\xi \in (x_0, x))$,我們稱它為拉格朗日餘項。我們也可以簡寫為$o[(x-x_0)^n]$,它稱為佩亞諾型餘項,其實和拉格朗日餘項是一回事,只是寫的形式不同。 我們如果令$x_0=0$的話,還可以將式子進一步化簡。由於$\xi$在0和x中間,所以我們可以令$\xi=\theta x, (0 < \theta < 1) $,原公式可以寫成: $$f(x)=f(0)+f'(0)x + \frac{f''(0)}{2!}x^2+\cdots + \frac{f^{(n)}(0)}{n!}x^n+\frac{f^{(n+1)}(\theta x)}{(n+1)!}x^{n+1}, (0 < \theta < 1)$$ 和上面的式子相比,這個式子要簡單許多,它也有一個名字,叫做**麥克勞林公式**。在麥克勞林公式下的佩亞諾餘項寫成$o(x^n)$,看起來非常簡單。 如果覺得上面的式子有點多記不過來可以忽略原式,只需要記住麥克勞林公式即可。對於拉格朗日餘項,我們也只會在計算誤差的時候用到,在不需要考慮誤差的場景下也可以忽略。
## 舉例
下面我們來看一個實際的例子,來感受一下泰勒公式的強大。 我們都知道有一些函式的值我們很難直接計算,比如$f(x)=e^x$,和正弦餘弦函式等。由於e本身就是一個無理數,有沒有想過我們怎麼來求一個帶e的函式值?其實很多時候,就是用的泰勒公式。 我們就用$f(x)=e^x$舉例,看看怎麼利用泰勒公式來計算$e^x$。 為了簡化計算,我們顯然考慮麥克勞林公式。由於$x=0$時,$e^x=0$,並且$f'(x)=e^x$。 所以我們可以得到: $$f'(0)=f''(0)=f'''(0)=\cdots =f^{(n)}(0)=1$$ 我們代入泰勒公式,可以得到: $$e^x=1 + x + \frac{1}{2!}x^2+\frac{1}{3!}x^3+\cdots+\frac{1}{n!}x^n+\frac{e^{\theta x}}{(n+1)!}x^{n+1}$$ 我們如果把最後一項當成誤差,那麼可以得到: $$e^x\approx 1 + x + \frac{1}{2!}x^2+\frac{1}{3!}x^3+\cdots+\frac{1}{n!}x^n$$ 當n=10時,x=1,產生的誤差為: $$\frac{e^{\theta x}}{(n+1)!}x^{n+1}\leq \frac{e}{11!}<\frac{3}{11!}$$ 我們稍微算一下就可以知道,這個誤差小於$10^{-6}$,已經足夠接近了。也就是說我們把原本不太好計算的函式轉化成了若干個多項式的和,可以非常簡單地獲得一個足夠接近的近似值。並且除此之外,我們還能算出它的**最大誤差**,實在是非常完美了。
## 思考
到這裡還沒有結束,看完所有的推導和計算之後,不知道你們有沒有一個疑惑,這麼一個牛叉並且複雜並且有用的公式,泰勒**是怎麼靈光一閃想到的**?好像用一時的靈感很難解釋。畢竟人的靈感往往都是一瞬間對某個點的頓悟,而這麼多公式和結論是很難頓悟的。 之前上學的時候我完全沒有意識到這個問題,這次重溫的時候才覺得不對。當然你可能會說這裡有這麼多數學家的名字,顯然不是一個人的功勞。但即使是這樣,我仍然好奇,**究竟是什麼起因引出了這麼偉大的公式?** 直到我無意間看到知乎[撒歡大神](https://www.zhihu.com/question/20887356 "撒歡大神的回答")的回答才恍然大悟。 我們設想一個問題,如果f(x)=g(x),那麼顯然f(x)和g(x)的各階導數全都相等。那麼問題來了,如果我們人為地構造一個函式h(x),使得它的各階導數和g(x)吻合,那麼是不是可以認為這個我們人為構造出來的函式也和g(x)相等呢? 然而有些函式的高階導數是無窮無盡的,我們不可能人工全部擬合,所以只能退而求其次,擬合其中的n項。顯然這樣會有誤差,那麼我們需要知道誤差的大小。於是就有了後面的拉格朗日餘項大小的推算。 泰勒公式的出現和推導過程正是基於這樣的思路,想到這裡,我又有了新的想法。如果把各階導數的項看成是特徵,那麼這個問題其實轉化成了機器學習當中的**迴歸問題**,只不過在機器學習當中我們是設定優化目標和優化方法,讓模型自行訓練來擬合逼近,而泰勒公式其實是通過思維和數學的力量推算出了結果,兩者的目的和結果是一樣的,但是過程完全迥異,兩個看似完全風馬牛不相及的問題殊途同歸,不得不說數學的魅力真的令人折服。 今天的文章就是這些,如果覺得有所收穫,請**順手掃碼點個關注**吧,你們的舉手之勞對我來說很重要。 ![](https://user-gold-cdn.xitu.io/2020/3/6/170ad61dd84712c6?w=258&h=258&f=png&