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

誤差、階數,以及尤拉法為何力有未逮

上一篇你沿著一條條切線把解往前推進,它卻偏離了真正的曲線。這一回我們誠實地丈量那份偏離:誤差在哪裡誕生、它如何堆疊,以及為什麼把步長減半只能把損害減半。那一個令人失望的事實,正是「一階」的意思——而治好它的藥方,也讓下一篇成為可能。

你早已見過的那份偏離,終於有了名字

上一篇裡,你踏出了一個尤拉步:站在某點 (t, y),讀出方程交給你的斜率 f(t, y),再沿著那條切線直走一小段距離 h,落到 y + h f(t, y)。再做一次、又一次,一道由小直線段拼成的階梯便代替平滑的真解向前爬行。你幾乎一定注意到了麻煩:才走幾步,你的數值曲線就明顯地坐在真實曲線的下方或上方,而那道縫隙還持續變寬。那道縫隙有個名字,而學會丈量它,正是本篇全部的工作。

那道擴大的縫隙裡,藏著兩種截然不同的錯誤,而把它們混為一談,是整個主題裡最常見的單一誤解。第一種,是*單獨一步*所犯的錯——你用一條直切線換掉了一段彎曲的真解,所以縱使你恰好從真實曲線上起步,落點也會略微偏離它。第二種,是走過許多步之後*累積*的錯誤,是你最終數值與真值之間的總距離。我們把前者喚作局部截斷誤差,把後者喚作全域截斷誤差,而幾乎一切有趣之事,都出自前者如何餵養後者。

單獨一步錯在哪裡

要把局部誤差看個透徹,就問真解在一步之內做了什麼,再拿尤拉法所做的去比。微積分恰有一件為此而設的工具——泰勒展開。若 y(t) 是真解,而你前進一步、步長為 h,那麼 y(t + h) = y(t) + h y'(t) + (h^2/2) y''(t) + (h 的更高次項)。尤拉步只留下頭兩塊:它用 y(t) + h y'(t),因為 y'(t) = f(t, y(t)) 恰是方程給出的斜率。於是尤拉法扔掉了 (h^2/2) y''(t) 這一項及一切更小的東西。那被扔掉的一塊,*正是*單獨一步的局部截斷誤差。

讀懂那個剩下的項,許多事就清楚了。局部誤差的主導塊約為 (h^2/2) y'',所以它像 h^2 那樣縮小——是步長的*平方*。把 h 減半,單步誤差便掉到四分之一;把 h 砍到十分之一,單步便忠實一百倍。而那個因子 y'' 也道出一個真實的幾何故事:y'' 丈量解的彎曲程度,所以真實曲線彎得越急之處,直切線就越快地離開它;而解幾乎筆直之處,尤拉法幾乎毫無差錯。局部誤差,是「在一步的長度內把曲線當成直線」這份假裝所付的代價。

從一次閃失到整段旅程

這裡有個第一次見到幾乎讓所有人意外的轉折。每一單步讓你付出約 h^2 大小的誤差——小得可愛。但要橫越一段固定的時間區間,譬如從 t = 0 到 t = 1,你需要約 1/h 步:把 h 減半,你就得走兩倍多的步數。總誤差非常粗略地說,是(步數)乘以(每步誤差),約為 (1/h) 乘以 h^2 = h。局部誤差裡那兩個 h 的因子被吃剩成一個。所以在固定區間上,全域誤差只像 h 那樣縮小,而非像 h^2。

這就是整件事令人洩氣的核心。把步長減半,你便做了兩倍的工——但最終答案只精確*兩倍*,而非四倍。要再多換得一位小數的精度,你必須把 h 縮小十倍,做十倍的算術,只為一位數字。尤拉法是以一個糟糕透頂的匯率在購買精度。那精確的關係——全域誤差正比於 h 的一次方——正是尤拉法被冠以一階之名的緣由,也正是何以它縱然對培養直覺有用,卻沒有人拿它來做正經的計算。

把「階數」說精確

方法的階數,是你能貼在任何逐步格式上的最重要的單一數字,所以讓我們不含糊地把它說清。一個方法具有 p 階,若在固定區間上,當步長 h 被逼向零時,它的全域截斷誤差表現得像一個常數乘以 h^p。p 越高就好得驚人:它意味著當你加密網格,誤差崩塌得快上太多。一階(尤拉)讓你用十倍的代價換得十倍的精度;四階則讓你用同樣的十倍加密,換得 10^4 = 一萬倍。那道鴻溝,正是何以「階數」是人人據以採買的貨幣。

那定義裡疊著一句誠實的警語:階數是關於 h 縮小之*極限*的陳述。它承諾的是改進的速率,而非在任一特定 h 下誤差的絕對大小。一個高階方法在粗步長下仍可能錯得離譜——它前頭的常數或許很大,或者解彎曲得猛烈。反過來說,同階的兩個方法在實務上也可能相差一個大常數因子。所以「四階」是關於誤差*隨著你加密*而消亡之快慢的承諾,而非單獨一次計算就精確的保證。把階數讀成「永遠精確」,是一個微妙卻真實的誤解。

  method            local error    global error    order
  ---------------------------------------------------------
  Euler             ~ h^2          ~ h             1
  improved Euler    ~ h^3          ~ h^2           2
  classical RK4     ~ h^5          ~ h^4           4
  ---------------------------------------------------------
  refine h -> h/10 :  order-1 error / 10
                      order-2 error / 100
                      order-4 error / 10000
從三個主力方法上讀出階數。每一個從局部到全域誤差都損失一個 h 的次方,而底部那一塊展示了報酬:把網格加密十倍,一階誤差縮小十倍,四階誤差卻縮小一萬倍。這正是接下來兩篇所要攫取的那份槓桿。

藥方:別再只信一個斜率

若尤拉法的瑕疵在於它認準了單一斜率——步首的那一個——那麼藥方幾乎自己寫了出來:在決定落點之前,沿著整步多蒐集些斜率資訊。最簡單的修補,是先試走一個尤拉半步或整步,看看*那裡*的斜率,再用一個平均斜率或中點斜率(而非起點斜率)來踏步。那多看的一眼抵消了主導的 (h^2/2) y'' 誤差項,把方法從一階提升到二階。這正是改良尤拉法與中點法背後的構想,而它只讓你每步多付一兩次斜率求值。

把同一構想推得更狠——在步內幾個巧妙挑選的點上取樣斜率,再用精心調校的權重把它們調和,好讓更多泰勒項抵消——你便抵達了著名的龍格—庫塔法。那個有名的四階成員 RK4,每步求值斜率四次,並把它們組合起來,使得直到 h^4 的誤差項都消失,交付出表中那一萬倍的槓桿。整篇下一文都獻給建造 RK4,並看清那四個斜率為何協同得如此漂亮。你在此丈量的一切——局部對全域、那個丟失的 h 次方、階數的意義——正是你將用來證明 RK4 名副其實的那把尺。

臨行前的兩句誠實話

兩句叮嚀讓整幅圖像保持誠實。第一,提高階數並非一頓你能永遠吃下去的免費午餐。上面的一切都假設截斷誤差——把泰勒級數截短的誤差——是室內唯一的誤差。但真實的電腦還會犯捨入誤差:它以有限位數儲存數字,而每一次算術運算都丟掉幾位。截斷誤差隨你把 h 變小而縮小,捨入誤差每步卻大致固定,而 h 縮小時你又走*更多*步——所以把 h 推到荒謬地小,捨入誤差終將增長並淹沒那份收益。存在一個甜蜜點,而非一道無盡的下降。

第二,一個方法在通過一道更基本的考驗之前,根本不配擁有階數。它必須是相容的——它的單步誤差必須隨 h 趨於零而消失,好讓每一步至少*瞄準*正確的斜率——而且它必須是穩定的,意即當步驟層層累積時,微小的誤差不會被放大到失控。唯有兩者皆成立時,加密網格才真正把全域誤差逼向零,這性質喚作收斂。那一束——相容性、穩定性與收斂性——是每個方法都得立足其上的基岩;日後關於多步法與關於剛性的篇章,正是穩定性從一道形式手續變為決定性問題之處。階數告訴你收斂得多快;相容性與穩定性,則是讓你能收斂的那回事。