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

歐拉法:沿著切線一步步前進

多數微分方程的解都沒有公式可寫——但方程仍然在每一點告訴你斜率。歐拉法把這唯一的禮物變成一套行進配方:站在你所在之處,讀出斜率,沿直線跨一小步,然後重複。

當沒有公式時,就跟著斜率走

到現在,你已經能徒手解出一小撮令人滿意的方程:可分離的、一階線性配方、恰當方程、常係數系統。但這一小撮是例外。本門學科誠實的真相是:多數微分方程沒有封閉形式的解——無論你多聰明,都不存在以初等函數寫成的有限公式。連看起來人畜無害的 y' = x^2 + y^2,都已經擊敗你手上每一招徒手技巧。如果你想要一個真正的答案——一條畫得出來的曲線、一個信得過的數——你就只能用數值方法去算它。

這裡有一個態度上的關鍵轉變。即使你解不出 y' = f(x, y),方程也並非沉默。它依然在平面上每一個點 (x, y) 交給你「通過該點的解曲線」的精確斜率:那個斜率就是 f(x, y)。這正是你最初學著定性地讀方程時遇見的 斜率場。一個數值方法不過就是一套有紀律地跟隨這個場的辦法——把局部的斜率資訊,一小步一小步地轉換成一條全域的曲線。

為了把這件事說具體,我們需要一個明確的出發點,所以數值工作總是從一個 初值問題 開始:方程 y' = f(x, y) 連同一個已知的點 y(x0) = y0。沒有這個錨點,斜率場裡會有無窮多條曲線穿梭其間,沒有任何具體的東西可算。有了這個錨點,我們就握有一個 數值初值問題——一個精確、適定、電腦能咀嚼的東西。

切線就是全部的念頭

站在你已知的點 (x0, y0)。對於「真正的解接下來往哪走」,最好的單一直線猜測是什麼?從單變數微積分你早就知道答案:切線。導數 y' = f(x0, y0) 正是該處解曲線的斜率,所以在一小段水平距離內,曲線幾乎不會偏離它自己的切線。歐拉的念頭,一句話說完:別再信任曲線,就沿著那條切線走一小步,然後再四下張望一次。

選一個步長 h——每一跨的水平寬度。下一個點,是藉由向右移動 h、並上升「斜率乘以 h」而抵達的。接著你就站在一個新的地方;你讀出*那裡*的斜率,也就是 f 在新點的值,再跨出另一條直線小步。如此重複,便給你一串點 x0、x1 = x0 + h、x2 = x0 + 2h,依此類推,配上對應的高度 y0、y1、y2、……。你正把解建構成一條折線——一條由微小切線段連點成路、緊貼著真曲線的路徑。

Given  y' = f(x, y),   y(x0) = y0,   step size h:

    x_{n+1} = x_n + h
    y_{n+1} = y_n + h * f(x_n, y_n)

  read the slope at where you ARE,
  then step straight to the next x.

  example  y' = y,  y(0) = 1,  h = 0.5 :
    y1 = 1 + 0.5*(1)   = 1.5
    y2 = 1.5 + 0.5*(1.5) = 2.25
    y3 = 2.25 + 0.5*(2.25) = 3.375   (true e^1.5 = 4.4817...)
兩行寫完的歐拉更新,再加上對 y' = y 的一次小小試跑。注意那個估計值 3.375 已經落後於真值 4.48——折線正低估了不斷彎曲的指數函數。

走完一次完整的試跑

讓我們刻意把這個迴圈走一遍,因為整套機械裝置就只是這個迴圈。取 y' = f(x, y),配上起點 y(x0) = y0 與選定的 h。為了把圖像握在手裡,先把方程寫成 正規形式——解出 y' 寫作 y' = f(x, y)——會很有幫助,這樣 f 就是一條你能在任何點求值的乾淨配方。然後行進。

  1. 從已知點 (x_n, y_n) 出發;第一步時這就只是 (x0, y0)。
  2. 在那裡求出斜率:s = f(x_n, y_n)。這是微分方程唯一進場的地方——是那個場在告訴你該往哪邊傾斜。
  3. 跨出直線一步:y_{n+1} = y_n + h * s,且 x_{n+1} = x_n + h。你是沿著切線移動,而不是沿著真曲線。
  4. 把 (x_n, y_n) 換成新的點,回到步驟 2 重來。當 x 抵達你所關心區間的終點時就停。

這真的就是全部了——歐拉法是最簡單的數值解法,而本級裡多數其他方法,都是對這同一個迴圈的誠實精緻化。它每一步只花一次斜率求值、一次「乘了再加」。沒有代數要解、沒有公式要積分、沒有東西要反演。你能在紙上徒手走幾步,而電腦眨個眼就能走完幾百萬步。

它為何會漂移,以及步長替你買到什麼

歐拉法誠實但粗糙,而把*為什麼*看清楚是值得的。切線只在你讀取它的那一點才是正確的斜率。你一旦跨步離開,真正的解就已經開始彎曲,於是它的斜率不再是 f(x_n, y_n),而是略有不同的東西——而你在整個一跨之內都忽略了這個變化。你在單獨一步裡撐開的那個小縫,就是局部誤差;它正式的名字是 局部截斷誤差,對樸素的歐拉法而言,當你把 h 縮小時,它以 h^2 的速度收縮。

但這裡有一個下一篇會反覆敲打的微妙之處:誤差不是只出現一次,而是會累積。把 h 減半,每一步的差錯會小四倍——可是你現在需要兩倍多的步數才能跨過同一個區間。這兩個效應互相拉扯,倖存下來的是一個只以 h(而非 h^2)速度收縮的總誤差。這個 h 的單一次方,正是我們說歐拉法一階準確的意思——它的 是一。一階聽起來還行,直到你動手算一算:要多正確一位小數,你大約得把 h 縮小十倍、並做十倍的工。這是個懲罰性的兌換率。

誠實的界線,以及由此往前的路

還有兩個提醒讓歐拉法保持誠實。第一,縮小 h 不能無止盡地推下去:電腦上每一次算術運算都帶著微小的捨入誤差,而當步數高達幾百萬步、每步又極微小時,這些捨入可能淹沒掉所有好處,於是存在一個實務上的下限,過了它再加步數只會把事情弄得*更糟*。第二,有些方程是剛性的——它們含有一個快速衰減的部分,用樸素歐拉法時,這部分會逼你採用一個小得可笑的 h 才能避免數值爆炸,即使解本身其實平滑又懶散。這兩件事——捨入下限與剛性——都會在本級最後一篇得到專屬處理;現在只要知道它們真實存在,且再怎麼聰明的寫程式也無法讓它們消失。

這些都不構成輕視歐拉法的理由——恰恰相反。它是整門學科由以建構起來的概念原子。讀出斜率、跨出一步:這一個動作,就是 龍格-庫塔 方法的種子(它們在決定一步之前,會在好幾個聰明的位置取樣斜率)、是多步法的種子(它們重複利用過去步驟的斜率),也是那些悄悄運行在你日後會用到的每一個科學工具裡的自適應解法的種子。把這個迴圈與它的漂移刻進骨子裡,本級接下來的一切,讀起來都會像是對一個你早已親身感受過的瑕疵所給出的深思熟慮的回答。