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


本文始發於個人公眾號: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), 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}\),已經足夠接近了。也就是說我們把原本不太好計算的函數轉化成了若干個多項式的和,可以非常簡單地獲得一個足夠接近的近似值。並且除此之外,我們還能算出它的最大誤差,實在是非常完美了。


思考


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

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

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

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

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

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM