Featured image of post 泰勒展開與麥克勞林展開:用多項式近似複雜函數的魔法

泰勒展開與麥克勞林展開:用多項式近似複雜函數的魔法

詳細講解微積分的秘訣——泰勒展開和麥克勞林展開,從直觀含義到數學推導,再到程式設計和物理學中的應用。

引言

泰勒多項式藉由使某一點的函數值與有限階導數相符,近似該點附近的函數。將這些導數所決定的係數排成無窮和,就得到泰勒級數;展開中心為0時,稱為麥克勞林級數。級數是否收斂,以及其和是否等於原函數,必須分別確認。

本文以指數函數與三角函數的近似為例,說明係數如何決定、展開式成立的條件,以及有限項截斷後的誤差。最後提供一個用 Python 近似計算0附近 \(\sin x\) 的教學範例。

為什麼要用多項式來近似函數?

首先,為什麼有必要將一個函數表示為多項式( \(a + bx + cx^2 + \dots\) )呢?

  flowchart LR
    A["在展開中心附近解析的函數"] -->|"收斂範圍內的泰勒展開"| B["冪級數"]
    B -->|"有限項截斷"| C["多項式近似"]
    C -->|"僅基本算術運算"| D["高速電腦計算"]

用多項式近似非線性函數,有時能簡化求值、微分與積分。係數確定後,多項式可用加法與乘法求值。不過,近似的適用範圍與精確程度,必須根據餘項和數值計算誤差判斷。

麥克勞林展開的直觀理解

先考慮在 \(x=0\) 附近近似函數的麥克勞林展開。 假設函數 \(f\) 在0附近具有所需階數的導數。選定有限次數 \(n\),決定以下多項式 \(P_n\) 的係數:

\[ P_n(x) = c_0 + c_1 x + c_2 x^2 + \dots + c_n x^n \]

令0處的函數值與各階導數相符,就能決定係數。以下二階條件適用於 \(n\ge2\) 的情況。

  1. 函數值條件:\(P_n(0)=f(0)\),因此 \(c_0=f(0)\)。常數項使0處的函數值相符。
  2. 一階導數條件:\(P_n'(0)=f'(0)\),因此 \(c_1=f'(0)\)。\(P_1(x)=f(0)+f'(0)x\) 是0處的切線近似。
  3. 二階導數條件:要求 \(P_n''(0)=f''(0)\)。由於 \(P_n''(0)=2c_2\),可得 \(c_2=f''(0)/2!\)。對含有高次項的一般 \(P_n\),整個 \(P_n''(x)\) 並不恆等於常數 \(2c_2\)。
  4. 一般條件:對 \(k\le n\),要求 \(P_n^{(k)}(0)=f^{(k)}(0)\),即可決定 \(c_k=f^{(k)}(0)/k!\)。展開中心附近的誤差以下文的餘項估計。

麥克勞林展開的公式與推導

若 \(f\) 可無限次微分,就能用這些係數構成麥克勞林級數。不過,要像下式一樣與原函數 \(f(x)\) 以等號連接,級數必須在該點收斂到 \(f(x)\)。例如,函數在0附近解析時,等式在適當的鄰域內成立。僅有無限次可微分這項條件仍不足夠。

\[ f(x) = f(0) + f'(0)x + \frac{f''(0)}{2!}x^2 + \frac{f^{(3)}(0)}{3!}x^3 + \dots \]

用求和記號可寫為:

\[ f(x) = \sum_{n=0}^{\infty} \frac{f^{(n)}(0)}{n!} x^n \]

這裡, \(f^{(n)}(0)\) 是將函數 \(f(x)\) 微分 \(n\) 次後代入 \(x=0\) 得到的值,而 \(n!\) 表示 \(n\) 的階乘( \(n \times (n-1) \times \dots \times 1\) )。

典型函數的麥克勞林展開

以下指數函數、正弦與餘弦的級數,對所有實數 \(x\) 都收斂到對應的函數。三角函數的引數以弧度表示。

1. 指數函數 \(e^x\)

指數函數 \(f(x)=e^x\) 無論微分幾次,仍為 \(e^x\)。因此,各階導數在0處的值都為 \(1\)(\(f^{(n)}(0)=1\))。

\[ e^x = 1 + x + \frac{x^2}{2!} + \frac{x^3}{3!} + \dots = \sum_{n=0}^{\infty} \frac{x^n}{n!} \]

2. 三角函數 \(\sin x\) 和 \(\cos x\)

反覆對 \(\sin x\) 微分時,導數依序循環為 \(\cos x, -\sin x, -\cos x, \sin x, \dots\)。代入 \(x=0\) 後,只有奇數階導數的值非零,偶數階導數的值為 \(0\)。

\[ \sin x = x - \frac{x^3}{3!} + \frac{x^5}{5!} - \frac{x^7}{7!} + \dots = \sum_{n=0}^{\infty} \frac{(-1)^n}{(2n+1)!} x^{2n+1} \]

同樣,對於 \(\cos x\),只有偶數階的項保留下來。

\[ \cos x = 1 - \frac{x^2}{2!} + \frac{x^4}{4!} - \frac{x^6}{6!} + \dots = \sum_{n=0}^{\infty} \frac{(-1)^n}{(2n)!} x^{2n} \]

推廣到泰勒展開

將展開中心從0移到 \(a\),就得到泰勒級數。若 \(f\) 在 \(a\) 附近解析,則在級數表示原函數的範圍內,以下等式成立。只假設有限階可微分的近似,則以下文的有限泰勒多項式與餘項處理。

\[ f(x) = f(a) + f'(a)(x-a) + \frac{f''(a)}{2!}(x-a)^2 + \dots = \sum_{n=0}^{\infty} \frac{f^{(n)}(a)}{n!} (x-a)^n \]

當你想要預測在距離 \(x=a\) 稍微有一段距離的位置( \(x = a + \Delta x\) )的函數值時,這個公式就顯示出了它的威力。

泰勒展開的應用

物理學中的線性近似

物理學常用泰勒多項式作線性近似。對單擺而言,將角度 \(\theta\) 以弧度表示,並假設 \(|\theta|\ll1\),就可採用正弦的一階近似:

\[ \sin \theta \approx \theta \quad (\text{當 } \theta \text{ 足夠小時}) \]

這項近似使單擺方程式線性化,並在小振幅近似下得到週期與振幅無關的等時性。實際單擺的週期會隨振幅改變,不能將相同近似直接套用到大振幅擺動。

程式設計與數值計算

函數的數值求值可採用多項式近似等多種方法。CPython 的 math 模組主要呼叫平台的 C 數學函式庫,具體演算法依實作而定。以下是在0附近(例如 \(|x|\le1\))累加少量項的教學範例,並非標準函式庫內部實作的重現。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
import math

def approx_sin(x, terms=10):
    """
    在0附近計算 sin(x) 有限麥克勞林和的教學函式
    x: 以弧度為單位的角度
    terms: 累加的項數(正整數,本例為10項)
    """
    result = 0.0
    for n in range(terms):
        # 計算每一項: (-1)^n * x^(2n+1) / (2n+1)!
        sign = (-1) ** n
        numerator = x ** (2 * n + 1)
        denominator = math.factorial(2 * n + 1)
        result += sign * (numerator / denominator)
    return result

# 測試: x = 1.0 弧度 (約 57.3 度)
x_val = 1.0
print(f"近似值: {approx_sin(x_val)}")
print(f"math.sin 的值(供比較): {math.sin(x_val)}")

收斂半徑與泰勒定理

收斂半徑 \(R\) 是一個數,表示冪級數在距中心 \(a\) 滿足 \(|x-a|<R\) 的範圍內收斂,而不是區間本身的名稱。\(R=0\) 或 \(R=\infty\) 也可能出現。端點 \(|x-a|=R\) 必須另行檢查。例如,\(\ln(1+x)\) 的麥克勞林級數收斂半徑為1,在實數範圍 \(-1<x\le1\) 上等於原函數;在 \(x=1\) 處條件收斂,在 \(x=-1\) 處發散。

對於有限的近似,假設 \(f\) 在連接 \(a\) 與 \(x\) 的區間上屬於 \(C^{n+1}\) 類,泰勒定理便給出:

\[ f(x)=P_{n,a}(x)+R_n(x),\qquad P_{n,a}(x)=\sum_{k=0}^{n}\frac{f^{(k)}(a)}{k!}(x-a)^k \]\[ R_n(x)=\frac{f^{(n+1)}(\xi)}{(n+1)!}(x-a)^{n+1} \]

其中 \(\xi\) 位於 \(a\) 與 \(x\) 之間。若區間上 \(|f^{(n+1)}|\le M\),則 \(|R_n(x)|\le M|x-a|^{n+1}/(n+1)!\)。要證明函數等於其無窮泰勒級數,可以驗證此餘項在 \(n\to\infty\) 時趨近0。

上述程式碼累加10項,即到 \(x^{19}\) 為止。正弦級數的20次項係數為0,因此泰勒定理給出 \(x=1\) 時的截斷誤差不超過 \(1/21!\),約為 \(1.96\times10^{-20}\)。這是以實數精確計算有限和時的誤差;Python 浮點運算的捨入誤差必須另外考慮。math.sin 的輸出也是供比較的浮點值,並非數學上的精確真值。

光滑函數的級數也可能不表示原函數

\[ g(x)=\begin{cases}e^{-1/x},&x>0,\\0,&x\le0.\end{cases} \]

這個函數可無限次微分,且在0處的各階導數都為0。因此,它在0處的泰勒級數恆為0,對所有 \(x\) 都收斂。但當 \(x>0\) 時,\(g(x)>0\),級數的和並不等於原函數。這個例子說明,必須區分「級數收斂」與「級數的和等於原函數」。

結論

泰勒多項式提供局部近似,餘項則估計近似誤差。將泰勒級數當作等式使用時,需要確認收斂範圍及其和是否等於原函數。掌握這些區別,有助於在物理與數值計算中判斷近似的適用範圍和所需精確程度。

參考資料

comments powered by Disqus