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

本文始發於個人公眾號:TechFlow,原創不易,求個關注

今天的文章我們來討論大名鼎鼎的泰勒公式泰勒公式真的非常有名,我相信上過高數課的一定都記得它的大名。即使你翹掉了所有的課,也一定會在考前重點裡見過。

我對它的第一映像就是比較難,而且感覺沒有太多意思,就是一個近似的函數而已。最近重溫了一下有了一些新的心得,希望盡我所能講解清楚。

泰勒公式的用途

在看具體的公式和證明之前,我們先來了解一下它的用途,然後帶著對用途的理解再去思考它出現的背景以及原理會容易許多。這也是我自學這麼久總結出來的規律。

泰勒公式本質解決的是近似的問題,比如說我們有一個看起來很複雜的方程,我們直接計算方程本身的值可能非常麻煩。所以我們希望能夠找到一個近似的方法來獲得一個足夠近似的值。

從這裡,我們得到了兩個重點,一個是近似的方法,另一個是近似的精度。我們既需要找到合適的方法來近似,同時也需要保證近似的精度是可控的。否則一切都沒有意義,結合實際其實很好理解,比如我們用機床造一個零件。我們都知道世界上不存在完美的圓,實際上我們也並不需要完美,但是我們需要保證偏差是可控的,並且在一定的範圍內。泰勒公式也是一樣,它既可以幫助我們完成近似,也可以保證得到的結果是足夠精確的。

泰勒公式的定義

我們下面來看看泰勒公式的定義,我們已經知道了它的用途是求一個函數的近似值。但是我們怎麼來求呢,其實一個比較樸素的思路是通過斜率逼近

舉個例子:

這是一張經典的導數圖,從上圖我們可以看到,隨著(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), 1cdot 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_{xto x_0}frac{R_n(x)}{(x-x_0)^n} leq lim_{xto x_0} frac{frac{M(x-x_0)^{n+1}}{(n+1)!}}{(x-x_0)^n}=lim_{xto 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^xapprox 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}),已經足夠接近了。也就是說我們把原本不太好計算的函數轉化成了若干個多項式的和,可以非常簡單地獲得一個足夠接近的近似值。並且除此之外,我們還能算出它的最大誤差,實在是非常完美了。

思考

到這裡還沒有結束,看完所有的推導和計算之後,不知道你們有沒有一個疑惑,這麼一個牛叉並且複雜並且有用的公式,泰勒是怎麼靈光一閃想到的?好像用一時的靈感很難解釋。畢竟人的靈感往往都是一瞬間對某個點的頓悟,而這麼多公式和結論是很難頓悟的。

之前上學的時候我完全沒有意識到這個問題,這次重溫的時候才覺得不對。當然你可能會說這裡有這麼多數學家的名字,顯然不是一個人的功勞。但即使是這樣,我仍然好奇,究竟是什麼起因引出了這麼偉大的公式?

直到我無意間看到知乎撒歡大神的回答才恍然大悟。

我們設想一個問題,如果f(x)=g(x),那麼顯然f(x)和g(x)的各階導數全都相等。那麼問題來了,如果我們人為地構造一個函數h(x),使得它的各階導數和g(x)吻合,那麼是不是可以認為這個我們人為構造出來的函數也和g(x)相等呢?

然而有些函數的高階導數是無窮無盡的,我們不可能人工全部擬合,所以只能退而求其次,擬合其中的n項。顯然這樣會有誤差,那麼我們需要知道誤差的大小。於是就有了後面的拉格朗日余項大小的推算。

泰勒公式的出現和推導過程正是基於這樣的思路,想到這裡,我又有了新的想法。如果把各階導數的項看成是特徵,那麼這個問題其實轉化成了機器學習當中的回歸問題,只不過在機器學習當中我們是設定優化目標和優化方法,讓模型自行訓練來擬合逼近,而泰勒公式其實是通過思維和數學的力量推算出了結果,兩者的目的和結果是一樣的,但是過程完全迥異,兩個看似完全風馬牛不相及的問題殊途同歸,不得不說數學的魅力真的令人折服。

今天的文章就是這些,如果覺得有所收穫,請順手掃碼點個關注吧,你們的舉手之勞對我來說很重要。