JOVANA
Explore Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

到底能錯多離譜?誤差公式

上一篇你建好了那個恰好穿過所有資料點的內插多項式。但在點與點之間,它只是個猜測。這一篇給你唯一一條公式,告訴你那個猜測最遠能跑偏多少——而且出人意料地,還告訴你該把點放在哪裡,才能讓它跑偏得盡可能少。

點上精確,點與點之間卻是一場信仰之躍

上一篇你拿了 n+1 個資料點,建出那個穿過每一個點的唯一內插多項式 p——不管你是用拉格朗日形式組裝它,還是用牛頓差商一步步長出它。在每個節點上,p 都和底層函數 f 完全吻合——這本來就是重點。但一條曲線遠不只是幾個點。真正的問題是:在縫隙裡發生了什麼?當你在某個不是節點的 x 處讀取 p,p(x) 離真正的 f(x) 有多近?這道落差 f(x) - p(x) 就是內插誤差,而假裝它在點與點之間是零,是一場信仰之躍——我們馬上要用一個真正的界來取代它。

給你一幅可以抓住的畫面。想像 f 是一座和緩的山丘,你在五根樁子上量它的高度。內插多項式是一條被迫碰到全部五個樁頂的單一平滑曲線。在相鄰兩根樁子之間,曲線會依著多項式「想做」的事下垂或鼓起,而它能垂得多糟,取決於兩件你已經能憑直覺猜到的事:真正的山丘在那裡有多彎(平坦的一段容易猜,急轉彎就難),以及樁子有多寬、間距排得多巧。內插誤差公式正是把這兩個直覺化成數字的那句話。

公式本身,像讀一句話那樣讀它

假設 f 在區間上有 n+1 階連續導數,而 p 是在節點 x_0、x_1、...、x_n 上對它內插的 n 次多項式。那麼對區間裡任何一點 x,都存在某個未知的點 c,藏在節點和 x 之間的某處,使得誤差呈現一個乾淨的形狀。把下面的程式區塊當成一句話來讀:誤差等於 f 的某階導數,除以一個階乘,再乘上一個衡量「到各節點距離」的乘積。

          f^(n+1)(c)
f(x) - p(x) = ---------- * (x - x_0)(x - x_1)...(x - x_n)
           (n+1)!

     for some unknown c between the nodes and x.

three ingredients:
  f^(n+1)(c)  : the (n+1)-th derivative of f  -> how curvy/wiggly f is
  (n+1)!      : a big factorial in the denominator -> our friend, it shrinks error
  product     : (x - x_0)...(x - x_n) -> zero AT every node, grows BETWEEN them
內插誤差公式。它呼應了泰勒展開的餘項——同樣的味道:「某個未知點上的高階導數,除以一個階乘」——只是攤開在 n+1 個節點上,而非全堆在一個點上。

看看每一塊在告訴你什麼。乘積項 (x - x_0)...(x - x_n) 在 x 等於任一節點時恰好為零——這重新證明了 p 在點上是精確的,一個令人安心的健全性檢查。在節點之間,乘積非零,誤差就住在那裡。分母上的階乘 (n+1)! 看起來像個強大的盟友:多加幾個點、把次數抬高,你就除以一個越來越大的數。分子上的導數 f^(n+1)(c) 則是不確定因子——它是真正函數自己的第 n+1 階導數,在一個你無從得知的點上取值。整個內插的戲劇張力,就是那個增長的階乘和那個可能爆炸的導數之間的一場拔河。

一個你能徒手核對的小小實例

讓我們用最友善的情況把它具體化:用一條直線(一次)內插 f(x) = sin(x),只用兩個節點 x_0 = 0 和 x_1 = 1,然後問這條直線在中點 x = 0.5 處錯了多少。當 n = 1 時,公式需要二階導數 f''(x) = -sin(x),它的大小在這個區間上從不超過 1。在 x = 0.5 處的節點乘積是 (0.5 - 0)(0.5 - 1) = -0.25。所以誤差界是 |f''(c)| / 2! 乘上 |乘積| = (至多 1) / 2 乘上 0.25 = 0.125。

現在拿它跟現實核對。穿過 (0, sin 0) = (0, 0) 和 (1, sin 1) = (1, 0.8415) 的直線,在 x = 0.5 處的值是 0.4207,而真正的 sin(0.5) = 0.4794。實際誤差是 0.4794 - 0.4207 = 0.0587。果然 0.0587 舒舒服服地低於我們 0.125 的界——公式沒說謊,它只是給了一個安全的高估,因為我們用的是最壞情況 |f''| = 1,而不是 c 附近的真實值。這就是常態:誤差公式是一個誠實的上界,通常偏鬆,從不承諾精確誤差。它的工作是保證你安全,而不是預測最後一位數。

讀懂公式的警告:好壞間距在哪裡分道揚鑣

誤差公式真正物超所值的地方來了——它不只是個計算器,更是設計的指南。盯著乘積項 (x - x_0)...(x - x_n) 看。你碰不到 f^(n+1)(c);那個導數屬於別人交給你的函數。但節點 x_0、...、x_n 是你能擺的。所以你完全掌控的那唯一一根槓桿,就是讓那個乘積在整個區間上盡可能地小。直覺反射是把節點平均鋪開——等距的點感覺公平又整齊。公式悄悄地警告:「公平」跟「最小」不是同一回事。

用等距節點時,那個乘積在區間中央很小,但在兩端附近會擺盪到巨大的值——多項式在邊緣捲起巨大的振盪。當你為了追求準確度而加更多等距點時,乘積的端點擺盪可能比階乘 (n+1)! 馴服它的速度增長得更快,尤其當 f^(n+1) 本身也很大時。拔河輸了,誤差反而隨著點變多而增長。這場災難有個名字,叫龍格現象,而它正是下一篇的整個主題。現在,只要先記下這份震驚:更多資料可能讓一個高次的等距內插更糟,甚至發散。

但同一條診斷出病症的公式,也開出了藥方。如果麻煩出在乘積於兩端爆掉,那就把更多節點往兩端擠,乘積就會被壓平。最佳的擠法——讓乘積的最壞值小到不能再小的那種擺法——就是著名的一組切比雪夫節點,在邊緣較密、在中央較疏。用切比雪夫節點,那令人聞風喪膽的端點擺盪被馴服了,誤差隨次數上升而可靠地縮小,高次內插也變得值得信賴。那是第五篇的回報;在這裡,重點是:正是誤差公式告訴了我們該往那邊看。

內插不等於最佳逼近

公式還逼出了一個誠實的區別。一個內插必須恰好穿過你選的那些點;至於誤差,在其他每個地方就隨它去了。這跟「要一個處處最接近 f 的多項式」——那個讓整個區間上最大落差最小化的多項式——並不是同一回事。後一個目標叫最佳逼近,更精確地說是極小極大逼近,而它的解通常根本不會內插你的資料;反之,它的誤差會上下擺動,在區間各處以交替的正負號碰到它的最大值。內插把誤差釘在幾個點上的零;最佳逼近拒絕把誤差釘在任何地方,以換取整體上更小的最壞情況。

為什麼在一篇講內插誤差的文章裡,要提最佳逼近?因為兩者以一種優美的方式相遇了。事實證明,在切比雪夫節點上做內插,會驚人地接近那個最佳可能的極小極大多項式——只差它一個小小的、緩慢增長的倍數。所以你不必直接去解那個困難的極小極大問題;在對的點上做內插這個便宜、條件良好的動作,就把你帶到幾乎抵達之處。誤差公式從「我的內插能錯多離譜?」起步,透過揭露節點乘積是我們唯一能控制的東西,把我們一路引到「點該擺在哪,才能幾乎跟現存最好的曲線一樣好?」。