式逼近復(fù)雜函數(shù),只用加減乘除)
泰勒展開是那種第一眼特別勸退的數(shù)學(xué)工具公式里有導(dǎo)數(shù)、有階乘、有求和符號(hào)還沒開始學(xué)先被符號(hào)嚇住了。但如果你把它一項(xiàng)一項(xiàng)寫開會(huì)發(fā)現(xiàn)計(jì)算過程到最后只剩加減乘除也就是小學(xué)二年級(jí)數(shù)學(xué)課上學(xué)過的那幾樣運(yùn)算。標(biāo)題就是這個(gè)意思——泰勒展開不是天外飛仙它的本質(zhì)是“用多項(xiàng)式去逼近一個(gè)復(fù)雜函數(shù)”而多項(xiàng)式在計(jì)算機(jī)里只需要乘法和加法就能算。下面我從三個(gè)角度把它講透先說明泰勒展開到底在解決什么問題再用 Python 把它親手實(shí)現(xiàn)一遍看精度怎么一步步提高最后聊聊誤差邊界以及在優(yōu)化、數(shù)值計(jì)算和工程近似里它為什么無處不在。適合正在學(xué)微積分但還沒把原理串起來的同學(xué)也適合寫算法時(shí)看著 math 庫(kù)里的 sin、exp 想知道背后邏輯的工程師。1. 先把這個(gè)標(biāo)題翻譯成一句人話1.1 泰勒展開到底在做什么一個(gè)復(fù)雜函數(shù) f(x)比如 sin(x)、e^x、ln(x)在你關(guān)心的某個(gè)點(diǎn) a 附近可以用一個(gè)多項(xiàng)式來近似表示f(x) ≈ f(a) f(a)(x-a) f(a)(x-a)^2/2! f(a)(x-a)^3/3! ...當(dāng) a 0 時(shí)這個(gè)式子叫麥克勞林展開是泰勒展開最常見的特例。右邊的核心特點(diǎn)只有一個(gè)它是一個(gè)多項(xiàng)式。多項(xiàng)式長(zhǎng)什么樣就是一堆系數(shù)乘以 x 的冪次然后加起來。這種函數(shù)在數(shù)學(xué)庫(kù)里是最容易處理的求值只需要乘法和加法求導(dǎo)有非常固定的規(guī)則比較大小也直觀。為什么要干這件事因?yàn)?sin、exp、log 這類函數(shù)在 CPU 指令集層面并沒有真正的“sin 單元”或“l(fā)og 單元”。硬件擅長(zhǎng)的是加減乘除和訪存剩下的事要靠軟件逼近。如果你能把 sin(x) 在某個(gè)范圍里寫成一個(gè)多項(xiàng)式那么算 sin(x) 就變成了幾十次乘法和加法速度立刻不一樣。泰勒展開就是這座橋把“復(fù)雜函數(shù)”變成“計(jì)算機(jī)擅長(zhǎng)處理的多項(xiàng)式”。很多教程會(huì)把重點(diǎn)放在推導(dǎo)和證明上但實(shí)際工程里最重要的就是你記住這個(gè)替換關(guān)系——復(fù)雜函數(shù)可以局部替換成多項(xiàng)式而多項(xiàng)式只需要四則運(yùn)算就能算。1.2 為什么說它只用了小學(xué)二年級(jí)的運(yùn)算展開式里確實(shí)有 x3、3! 這類看起來很唬人的東西。但你拆開看x3 就是 x * x * x三次連乘。3! 就是 3 * 2 * 1。負(fù)號(hào)就是乘 -1。整個(gè)多項(xiàng)式求和就是反復(fù)相加。求多項(xiàng)式值最常用的方式叫霍納方法中文教材里也常叫秦九韶算法。它的核心想法很簡(jiǎn)單不要先算 x 的各個(gè)冪次再乘系數(shù)而是把多項(xiàng)式重新組織成一層套一層的括號(hào)a0 a1*x a2*x^2 ... an*x^n ((...(an*x a_{n-1})*x ... a1)*x a0每一步只有一次乘法和一次加法def horner(coeffs, x): # coeffs 按高次到低次排列例如 [1, 0, -1/6, 0, 1/120] res 0.0 for c in coeffs: res res * x c return res所以標(biāo)題說“小學(xué)二年級(jí)就學(xué)過”是有道理的展開式的數(shù)值求值部分確實(shí)只有加減乘除。但必須把話說清楚這不代表小學(xué)生真的能推導(dǎo)泰勒展開。那些系數(shù)是怎么來的靠的是導(dǎo)數(shù)導(dǎo)數(shù)是微積分的內(nèi)容。標(biāo)題強(qiáng)調(diào)的是“展開之后算多項(xiàng)式”這一層只需要四則運(yùn)算至于“怎么求出這些系數(shù)”那才是真正需要學(xué)的地方。把這兩個(gè)階段分開思路就會(huì)清晰很多先求系數(shù)再算多項(xiàng)式。求系數(shù)是數(shù)學(xué)問題算多項(xiàng)式是算術(shù)問題。2. 拆開公式每一項(xiàng)都不是黑魔法2.1 導(dǎo)數(shù)、階乘、冪次分別管什么事泰勒展開的每一項(xiàng)都有明確分工不是符號(hào)堆砌。先看 (x-a)^k。它描述的是“離展開點(diǎn) a 的距離”。k 0 時(shí)這項(xiàng)是常數(shù)k 越大(x-a) 的冪次越高離 a 越遠(yuǎn)時(shí)這項(xiàng)影響越大。所以整個(gè)展開式天然有一個(gè)特點(diǎn)在 a 附近最準(zhǔn)離得越遠(yuǎn)誤差越難控制。再看 f(a)、f(a) 這一串導(dǎo)數(shù)。它們攜帶的是函數(shù)在 a 點(diǎn)的變化信息。f(a) 告訴你起點(diǎn)在哪里f(a) 告訴你起點(diǎn)處斜率是多少f(a) 告訴你斜率變化得有多快也就是彎曲程度。展開式之所以能逼近原函數(shù)是因?yàn)樗尪囗?xiàng)式在 a 點(diǎn)處的 0 階、1 階、2 階……導(dǎo)數(shù)值分別和原函數(shù)完全一致。最后是 k!。它為什么必須出現(xiàn)在分母可以這樣推導(dǎo)設(shè)多項(xiàng)式里有一項(xiàng) c_k (x-a)^k對(duì)它求 k 次導(dǎo)數(shù)會(huì)得到 c_k * k!。我們希望這一項(xiàng)在 a 點(diǎn)的 k 階導(dǎo)數(shù)等于 f^(k)(a)于是c_k * k! f^(k)(a) c_k f^(k)(a) / k!階乘不是天上掉下來的。它是 (x-a)^k 求導(dǎo) k 次之后自然出現(xiàn)的系數(shù)需要在外面除一次才能把兩邊對(duì)齊。2.2 從 e^x 和 sin(x) 看逐階逼近e^x 在 0 這個(gè)點(diǎn)有一個(gè)天然優(yōu)勢(shì)它的任意階導(dǎo)數(shù)都是 e^x在 0 處都是 1。所以展開式非常干凈e^x 1 x x^2/2! x^3/3! x^4/4! ...取 x 1左邊就是 e 本身。每多保留一項(xiàng)部分和就更接近 e保留到的項(xiàng)部分和與 e 的誤差第 0 項(xiàng)11.7182...第 1 項(xiàng)20.7182...第 2 項(xiàng)2.50.2182...第 3 項(xiàng)2.6666...0.0516...第 4 項(xiàng)2.7083...0.0099...第 5 項(xiàng)2.7166...0.0016...第 10 項(xiàng)2.7182818...約 2.7e-8這個(gè)表比任何文字都有說服力。每次加一項(xiàng)誤差按數(shù)量級(jí)往下掉。再看 sin(x)。它在 0 處的偶數(shù)階導(dǎo)數(shù)是 0奇數(shù)階導(dǎo)數(shù)交替為 1 和 -1所以展開式只剩奇數(shù)項(xiàng)sin(x) ≈ x - x^3/3! x^5/5! - x^7/7! ...這里有一個(gè)很自然的物理直覺如果只用第一項(xiàng) sin(x) ≈ x這就是高中物理里“小角度單擺”近似多保留幾項(xiàng)精度就會(huì)快速提升。所謂“逐階逼近”就是你每多對(duì)齊一階導(dǎo)數(shù)多項(xiàng)式和原函數(shù)就多了一層相似性。3. 用 Python 親手算一遍從錯(cuò)誤寫法到正確遞推3.1 環(huán)境準(zhǔn)備一個(gè)腳本文件就夠這部分不需要 GPU不需要新框架。Python 3.8 以上一個(gè)臨時(shí)目錄一個(gè) taylor_demo.py就夠了。對(duì)比結(jié)果用標(biāo)準(zhǔn)庫(kù) math如果要做符號(hào)驗(yàn)證再裝一個(gè) sympy。我一般建議先建一個(gè)臨時(shí)目錄不要為了測(cè)試去搭完整環(huán)境mkdir taylor_demo cd taylor_demo python --version確認(rèn)能跑 Python 之后直接新建腳本。第一次跑通之后再想批量對(duì)比和畫誤差曲線的事。3.2 關(guān)鍵寫法用遞推不要每次重新算階乘新手最容易犯的錯(cuò)是在循環(huán)里每次重新算 x 的冪次和階乘# 不推薦每次循環(huán)都重新算階乘和冪次 for k in range(n): term x ** k / math.factorial(k) total term這個(gè)寫法在 n 比較小時(shí)能出結(jié)果但有兩個(gè)問題第一浪費(fèi)。冪次和階乘可以從前一項(xiàng)遞推出來沒必要每次從頭算。第二會(huì)溢出。170! 大約 7.26e306已經(jīng)逼近 double 型能表示的上限 1.8e308171! 直接超過 double 范圍。只要 n 到 171程序就會(huì)出問題。正確做法是用遞推關(guān)系讓新的一項(xiàng)從舊的一項(xiàng)推出來。對(duì) e^xterm_0 1 term_{k1} term_k * x / (k1)對(duì) sin(x)term_0 x term_{k1} -term_k * x^2 / ((2k2)(2k3))看代碼import math def taylor_exp(x, n20): 在 x0 處展開 e^x返回前 n 項(xiàng)部分和 total 0.0 term 1.0 for k in range(n): total term term term * x / (k 1) return total def taylor_sin(x, n10): 在 x0 處展開 sin(x)返回前 n 項(xiàng)部分和 total 0.0 term x for k in range(n): total term term -term * x * x / ((2 * k 2) * (2 * k 3)) return total if __name__ __main__: print(taylor_exp(1.0, 20) , taylor_exp(1.0, 20)) print(math.exp(1.0) , math.exp(1.0)) print() print(taylor_sin(0.5, 10) , taylor_sin(0.5, 10)) print(math.sin(0.5) , math.sin(0.5))sin(x) 那兩行遞推需要仔細(xì)看符號(hào)每次翻轉(zhuǎn)所以乘 -1x 的冪次從 2k1 變成 2k3所以乘 x2分母從 (2k1)! 變成 (2k3)!所以除以 (2k2) 和 (2k3)。正常輸出會(huì)是這樣taylor_exp(1.0, 20) 2.7182818284590455 math.exp(1.0) 2.718281828459045 taylor_sin(0.5, 10) 0.479425538604203 math.sin(0.5) 0.479425538604203到這里你已經(jīng)親手實(shí)現(xiàn)了兩個(gè)常用函數(shù)的泰勒展開并且精度和標(biāo)準(zhǔn)庫(kù)幾乎一致。3.3 驗(yàn)證逐項(xiàng)打印、單點(diǎn)對(duì)比、換 x 再測(cè)只看最后一位對(duì)不對(duì)不足以說明實(shí)現(xiàn)可靠。我建議按三步驗(yàn)證。第一步逐項(xiàng)打印中間結(jié)果確認(rèn)每一項(xiàng)的大小確實(shí)在下降def taylor_exp_debug(x, n8): total 0.0 term 1.0 for k in range(n): total term print(fk{k} term{term:.8f} partial_sum{total:.8f}) term term * x / (k 1) return total輸出大致是k0 term1.00000000 partial_sum1.00000000 k1 term1.00000000 partial_sum2.00000000 k2 term0.50000000 partial_sum2.50000000 k3 term0.16666667 partial_sum2.66666667 k4 term0.04166667 partial_sum2.70833333 ...項(xiàng)在減小說明遞推方向?qū)?。如果哪一?xiàng)突然變大或者符號(hào)規(guī)律亂了第一件事就是檢查遞推公式的分子分母有沒有寫反。第二步單點(diǎn)對(duì)比 math 庫(kù)。不要把 n 拉滿先對(duì)比有限項(xiàng)下的誤差是否在預(yù)期范圍。第三步換不同的 x 再測(cè)。x 取 0.1、0.5、1、2不要只測(cè)一個(gè)點(diǎn)。你會(huì)發(fā)現(xiàn) x 越接近展開點(diǎn)收斂越快x 越大同樣的 n 誤差越大。這是泰勒展開最基礎(chǔ)的直覺。如果想驗(yàn)證系數(shù)本身可以用 sympyimport sympy as sp x sp.symbols(x) print(sp.series(sp.sin(x), x, 0, 10)) # 輸出: x - x**3/6 x**5/120 - x**7/5040 x**9/362880 O(x**10)sympy 適合用來對(duì)系數(shù)但不適合用來理解原理。原理還是得靠手寫循環(huán)。注意如果算出來的值和 math 庫(kù)差距很大按這個(gè)順序排查——先看 x 的絕對(duì)值是不是太大再看展開點(diǎn)是否在定義域內(nèi)然后看項(xiàng)數(shù)是不是真的夠最后看遞推公式的分子分母是不是寫反了。4. 誤差從哪來什么時(shí)候會(huì)翻車4.1 余項(xiàng)公式誤差不是玄學(xué)泰勒展開不是等式而是近似。截?cái)嗟降?n 項(xiàng)之后剩下的誤差用一個(gè)余項(xiàng)來表示最常見的拉格朗日余項(xiàng)長(zhǎng)這樣R_n(x) f^(n1)(ξ) / (n1)! * (x-a)^(n1)其中 ξ 是 a 和 x 之間的某個(gè)點(diǎn)。這個(gè)公式看著抽象但信息量很大誤差由三件事決定。一是 f^(n1)(ξ)也就是下一階導(dǎo)數(shù)有多大。如果函數(shù)在 a 和 x 之間變化劇烈誤差天然就大。二是 (x-a)^(n1)。如果 x 離 a 很近這個(gè)因子很小加階數(shù)會(huì)讓誤差按指數(shù)下降如果 x 離 a 很遠(yuǎn)這個(gè)因子反而會(huì)把誤差放大。三是 (n1)!。它隨 n 增長(zhǎng)極快所以理論上階數(shù)越高誤差越小。余項(xiàng)公式告訴我們一個(gè)工程判斷方法判斷誤差不要只看階數(shù)還要看 |x-a| 和下一階導(dǎo)數(shù)的量級(jí)。4.2 收斂半徑在半徑內(nèi)加階數(shù)才有意義不是所有函數(shù)在任何點(diǎn)展開都能無限逼近。典型例子是1/(1-x) 1 x x^2 x^3 ...等式右邊只在 |x| 1 時(shí)收斂。x 1 時(shí)左邊無定義右邊直接發(fā)散x 2 時(shí)右邊各項(xiàng)越來越大加多少項(xiàng)都沒用。這就是收斂半徑。ln(1x) 在 0 處展開ln(1x) x - x^2/2 x^3/3 - x^4/4 ...收斂半徑也是 1。而且端點(diǎn)要單獨(dú)討論x -1 時(shí) ln 沒有定義x 1 時(shí)級(jí)數(shù)恰好收斂到 ln 2。如果 x 超出了當(dāng)前展開點(diǎn)的收斂半徑有兩種解法。一是換展開點(diǎn)比如 ln(x) 在 0 處沒法展開但在 1 處可以二是做變量替換把大數(shù)映射到小區(qū)間這在浮點(diǎn)計(jì)算里尤其常見。對(duì)初學(xué)者來說最重要的不是背誦各種收斂半徑的判斷技巧而是建立“泰勒展開只在展開點(diǎn)附近有效”這個(gè)直覺??吹酱髤?shù)先別急著加階數(shù)要想想它離展開點(diǎn)有多遠(yuǎn)。4.3 浮點(diǎn)數(shù)下的三個(gè)坑數(shù)學(xué)上收斂不代表浮點(diǎn)數(shù)下算得準(zhǔn)。這里有三類常見坑。第一類直接算大階乘會(huì)溢出。如前面說的double 最多表示到約 1.8e308171! 就超了。所以工程實(shí)現(xiàn)里幾乎都用遞推而不是每次重新算階乘。第二類大參數(shù)下正負(fù)項(xiàng)相消。sin(x) 的泰勒展開符號(hào)交替如果 x 很大比如 50每一項(xiàng)的絕對(duì)值都很大但最后結(jié)果只有 -0.26 左右。浮點(diǎn)數(shù)的有效位數(shù)只有 16 位左右兩個(gè)大數(shù)相減真實(shí)信息會(huì)從低位丟光。解決辦法是做參數(shù)壓縮先把 50 對(duì) 2π 取模映射到 [-π/2, π/2] 這個(gè)小區(qū)間再展開。def sin_safe(x, n10): # 先把 x 折回 [-pi, pi]再調(diào)用泰勒展開 x x % (2 * math.pi) if x math.pi: x - 2 * math.pi if x -math.pi: x 2 * math.pi return taylor_sin(x, n)第三類大正數(shù)下小項(xiàng)被大和吃掉。e^x 在 x 100 時(shí)前面若干項(xiàng)非常大后面才逐漸變小。如果把小項(xiàng)逐個(gè)加到已經(jīng)很大的部分和上低位數(shù)字直接丟失。工程上一般拆成整數(shù)次冪乘小數(shù)次冪例如 e^100 e^64 * e^36對(duì)小數(shù)部分用展開式。這三類問題不是泰勒展開本身的問題而是“浮點(diǎn)表示”和“數(shù)學(xué)級(jí)數(shù)”之間的差異。寫代碼時(shí)要同時(shí)考慮兩層。4.4 不是階數(shù)越高就一定越好理論上 n 越大誤差越小但浮點(diǎn)環(huán)境下高階項(xiàng)可能反而把舍入誤差放大。我自己測(cè)試時(shí)有個(gè)習(xí)慣對(duì)同一個(gè) x分別用 n 5、10、20、50 跑一遍把誤差打出來看。你會(huì)發(fā)現(xiàn)一開始誤差快速下降然后變平甚至在高階時(shí)略微反彈。這項(xiàng)練習(xí)能幫你建立“夠用就好”的感覺。另外一個(gè)相關(guān)現(xiàn)象是多項(xiàng)式逼近里的 Runge 現(xiàn)象用高階多項(xiàng)式插值時(shí)區(qū)間端點(diǎn)附近經(jīng)常出現(xiàn)大幅震蕩。泰勒展開不是插值但它同樣提醒你多項(xiàng)式逼近在展開點(diǎn)附近最可靠離得遠(yuǎn)就有風(fēng)險(xiǎn)。所以工程上通常是分段逼近把大范圍切成小段每段用低階多項(xiàng)式而不是在一個(gè)展開點(diǎn)上堆無限高階。5. 工程和算法里泰勒展開到底在哪兒5.1 數(shù)學(xué)庫(kù)里的 sin、exp 背后是多項(xiàng)式逼近標(biāo)準(zhǔn)數(shù)學(xué)庫(kù)里的 sin、exp、log 具體實(shí)現(xiàn)通常不是直接截?cái)嗵├占?jí)數(shù)而是先做參數(shù)壓縮再在小區(qū)間上用多項(xiàng)式近似。常用的已經(jīng)不是原始泰勒級(jí)數(shù)而是 Remez 算法這類“極小極大”方法讓誤差在區(qū)間內(nèi)盡量均勻分布。但思路同源把復(fù)雜函數(shù)轉(zhuǎn)換成多項(xiàng)式求值。如果你在代碼里看到一堆來歷不明的小數(shù)系數(shù)不用驚訝那大概率就是某個(gè)多項(xiàng)式逼近的系數(shù)表。學(xué)習(xí)時(shí)從泰勒展開入手最順因?yàn)樗o了你一個(gè)理解一切多項(xiàng)式近似的起點(diǎn)。5.2 優(yōu)化算法里的一階展開和二階展開在機(jī)器學(xué)習(xí)里梯度下降可以看作一階泰勒展開的直接應(yīng)用。在優(yōu)化點(diǎn) x 附近把損失函數(shù)展開f(x Δ) ≈ f(x) f(x) * Δ要讓 f 下降沿著負(fù)梯度方向走一步就得到梯度下降更新x_{k1} x_k - η * f(x_k)η 是學(xué)習(xí)率。為什么學(xué)習(xí)率太大容易震蕩因?yàn)橐浑A泰勒展開只在局部成立步子邁大了Δ 超出展開有效的范圍近似就失效了。這個(gè)直覺來自泰勒展開而不是來自某個(gè)具體框架。如果把展開做到二階f(x Δ) ≈ f(x) f(x)Δ 1/2 * f(x) * Δ^2對(duì) Δ 求導(dǎo)并令其為 0就得到一維形式的牛頓法Δ -f(x) / f(x)這就是二階信息的使用。深度學(xué)習(xí)里的自適應(yīng)優(yōu)化器雖然實(shí)現(xiàn)方式更工程化很多也是在近似地估計(jì)二階信息。理解了一階、二階泰勒展開再去看這些算法會(huì)清晰很多。5.3 工程近似中的線性化工程里的“線性化”幾乎都長(zhǎng)著泰勒展開的臉。單擺在小角度下用 sin θ ≈ θ這是把 sin 在 0 處展開后只保留一階項(xiàng)。電路里二極管、三極管在工作點(diǎn)附近的小信號(hào)模型本質(zhì)是把非線性關(guān)系在靜態(tài)工作點(diǎn)做一階展開??刂葡到y(tǒng)里的靈敏度分析、誤差傳遞也經(jīng)常依賴一階偏導(dǎo)。學(xué)完泰勒展開再回頭看這些公式會(huì)發(fā)現(xiàn)它們不是孤立的知識(shí)點(diǎn)而是同一個(gè)思想在不同場(chǎng)景下的投影復(fù)雜的非線性關(guān)系在局部用簡(jiǎn)單的多項(xiàng)式去替代夠用就行。6. 想真正掌握建議按這個(gè)順序練6.1 先把六個(gè)常用展開式背下來函數(shù)在 0 處的展開收斂半徑e^x1 x x2/2! x3/3! ...全體實(shí)數(shù)sin xx - x3/3! x?/5! - ...全體實(shí)數(shù)cos x1 - x2/2! x?/4! - ...全體實(shí)數(shù)1/(1-x)1 x x2 x3 ...ln(1x)x - x2/2 x3/3 - ...(1x)^α1 αx α(α-1)/2! x2 ...注意收斂半徑無窮大只代表數(shù)學(xué)級(jí)數(shù)收斂不代表浮點(diǎn)數(shù)下一定算得準(zhǔn)。e^x 在 x 1000 時(shí)雖然級(jí)數(shù)收斂但直接用浮點(diǎn)展開會(huì)有精度問題。數(shù)學(xué)收斂和數(shù)值穩(wěn)定是兩件事。6.2 每個(gè)練習(xí)都要做的四步自查每次做完一個(gè)展開按這個(gè)順序過一遍確認(rèn)展開點(diǎn)和定義域。ln(x) 不能在 0 處展開√x 也不能在小于 0 的區(qū)域展開。確認(rèn) |x - a| 是否落在收斂半徑內(nèi)。半徑以外加階數(shù)沒有意義。確認(rèn)需要的階數(shù)。如果要求誤差到 1e-6需要幾項(xiàng)可以先估算余項(xiàng)再實(shí)測(cè)驗(yàn)證。和 math 庫(kù)或 sympy 對(duì)照。不要只看一個(gè)點(diǎn)至少換三個(gè) x 測(cè)一遍。這四步做完才算真的把一個(gè)展開式吃透。6.3 三個(gè)值得記住的實(shí)戰(zhàn)建議第一個(gè)建議先用小參數(shù)驗(yàn)證。x 從 0.1、0.5 開始不要一上來就跑 x 100。小參數(shù)下誤差容易控制也方便你確認(rèn)實(shí)現(xiàn)邏輯是否正確。第二個(gè)建議不要盲目追求高階數(shù)。對(duì)同一個(gè)點(diǎn)把 n 5、10、20、50 的誤差都打出來看曲線從什么時(shí)候開始變平甚至變差。你會(huì)在實(shí)際數(shù)據(jù)里體會(huì)到“夠用就好”的分寸。第三個(gè)建議工程里需要多項(xiàng)式逼近時(shí)優(yōu)先用成熟工具。numpy、sympy、scipy 以及硬件廠商的數(shù)學(xué)庫(kù)都比你手寫可靠。自己手寫泰勒級(jí)數(shù)適合學(xué)習(xí)、快速原型以及范圍受控且精度要求不高的場(chǎng)景。自己寫可以但上線前要評(píng)估范圍和誤差別讓“看起來對(duì)”騙了你?;氐綐?biāo)題那句話。泰勒展開確實(shí)不是什么高不可攀的東西它的數(shù)值計(jì)算部分就是小學(xué)二年級(jí)的加減乘除復(fù)雜的只是背后的微積分邏輯。先把 e^x 手算到第 5 項(xiàng)再用 Python 把小參數(shù)下的誤差打出來很多恐懼感會(huì)自然消失。真正踩過幾次坑之后你會(huì)發(fā)現(xiàn)多數(shù)問題不是泰勒展開太難而是你還沒把一個(gè)具體函數(shù)在具體點(diǎn)的展開真刀真槍地寫出來過。