M2.0 河面上的箭頭:Vector Field 與 ODE
一條河與一片葉子
你站在橋上往下看。這條河的水面不是均勻往前流的:靠岸的地方慢,中間快;過了橋墩以後水流微微往左彎,再往前又擺回來。假設你有一張完整的「水流地圖」——河面上每一個位置都標好了此刻水往哪個方向流、流多快。
現在你把一片葉子輕輕放在腳下的水面上。一分鐘後,它會在哪裡?
先用直覺回答,並且順手寫下兩件事:你有多確定?依據是什麼?大多數人的答案是「它會順著箭頭走,一步一步接下去就知道了」。這個答案是對的。但請再多問自己一句:如果我在同一個位置放兩片葉子,它們一定會漂到同一個地方嗎?如果兩片葉子從不同地方出發,有可能在某一刻剛好漂到同一點、之後又分開嗎?直覺這時候開始猶豫——這正是需要數學的地方。
課堂提問Q1
把這個情境翻成數學問題。「水流地圖」是什麼樣的數學物件?「葉子的位置」是什麼?「順著箭頭走」要怎麼寫成一條式子?
先想一想,再展開看整理後的答案
最直覺的說法是「地圖是一堆箭頭」,這已經抓到了一半。往下把它寫精確:
水流地圖是一個函數。 河面上每個位置 ,在時刻 ,對應一支箭頭 ——方向是水流方向,長度是流速。這樣「把位置對到向量」的函數叫做 vector field(每點一支箭頭的場)。如果水流不隨時間改變,就寫 ,叫 autonomous(不依賴時間)。
葉子的位置是一條隨時間變化的曲線 , 是你放葉子的地方。
「順著箭頭走」是說:葉子此刻的速度,等於它所在位置的水流。 速度是位置對時間的導數,所以
這就是一條 ODE(ordinary differential equation:只對一個變數 微分的方程式)加上一個初始條件。我們想知道的量是 ——一分鐘後的位置。注意這裡沒有隨機變數:水流地圖給定、起點給定,葉子的路徑是被決定的。這是這個 class 叫 deterministic 的原因;有亂流的河留給下一個 class。
先看畫面:一張地圖,一條路
想像水流地圖是一張畫滿短箭頭的紙,葉子是一支筆尖。筆尖落在某一點,就沿著那點的箭頭滑一小段,到了新位置再看新位置的箭頭,再滑一小段。把「一小段」縮到無限小,筆畫出來的線就是葉子的軌跡。
這個畫面已經暗示了兩件事。第一,軌跡上每一點的切線方向就是那一點的箭頭——軌跡「貼著」場走。第二,只要箭頭的方向從一點到鄰近的點是連續變化的,從同一點出發的兩支筆應該畫出同一條線,因為每一刻它們看到的箭頭都一樣。第二件事「應該」成立,但它需要一個條件,下面說。
寫成數學:存在、唯一、不交叉
定義。 一個 vector field 是函數 。給定 ,ODE 初值問題是找一條可微曲線 滿足 且 。這樣的 叫這個初值問題的解,也叫從 出發的 trajectory(軌跡)。
定理(Picard–Lindelöf,只講結論)。 如果 對 是 continuous 的,並且對 是 Lipschitz 的——存在常數 使得對所有 都有 (相鄰兩點的箭頭差,不超過距離的 倍)——那麼對每個 ,解存在且唯一,至少在一小段時間內;若 的成長不超過線性,解可以延伸到整段 。
Lipschitz 是「箭頭不能變得太突然」的精確版本:任何 有界的場都滿足( 取 Jacobian norm 的上界即可)。證明的想法是把 ODE 改寫成 ,然後證明右邊那個「把一條猜測曲線送進去、吐出一條新曲線」的操作,在 Lipschitz 條件下每做一次就把兩條猜測之間的差距縮小一個固定比例,反覆做會收斂到唯一的固定點。這門課只用結論,細節見 [1–3]。
推論(軌跡不交叉)。 設 、 都是同一個 ODE 的解。若存在某時刻 使 ,則 對所有 成立。
證明只要三行:把 當成新的起始時刻, 與 都是「從 出發」這個初值問題的解;唯一性說這樣的解只有一條;所以它們是同一條。(往前與往後都成立,因為把時間反向 之後 仍然 Lipschitz。)
要小心的是「交叉」的意思。若 不隨時間變(autonomous),推論說的是兩條不同的軌跡在空間裡永遠不會碰到同一點——葉子畫出的線不會相交。若 隨時間變,兩片葉子可以在不同時刻經過同一個位置(水流那時已經不同了),推論只保證它們不會在同一時刻出現在同一點。畫在 的空間裡,軌跡依然不交叉。
展開細節唯一性失效的例子:ẋ = x^(1/3),x(0) = 0
這個場在原點不是 Lipschitz 的:x^(1/3) 的斜率在 0 附近趨近無限大。結果從 x(0)=0 出發至少有兩條解:x(t) ≡ 0,以及 x(t) = (2t/3)^(3/2)。直接代入驗證第二條:d/dt (2t/3)^(3/2) = (3/2)(2t/3)^(1/2)·(2/3) = (2t/3)^(1/2) = x^(1/3)。事實上還有無限多條:先在 0 停留任意久、再開始沿第二條走,也都是解。這就是「同一個位置放兩片葉子卻漂去不同地方」的數學版本。
另一個常見的失效是「解在有限時間內跑到無限遠」:ẋ = x²,x(0)=x₀>0 的解是 x(t) = 1/(1/x₀ − t),在 t = 1/x₀ 時爆掉。這裡 Lipschitz 只在每個有界區域內成立(局部 Lipschitz),所以只保證短時間內的存在唯一。
回到河面:直覺對了,但要說出條件
回頭看起點問題。「順著箭頭一步一步走」是對的,而且我們現在能說清楚它為什麼對:Lipschitz 條件下軌跡唯一,所以不論你用什麼方法沿著箭頭走,只要走得夠細,都會逼近同一條線;一分鐘後的位置是一個確定的答案 。
同一位置放兩片葉子會漂到同一處——在 Lipschitz 的河面上是對的。兩片葉子從不同地方出發會不會在某刻重合又分開——不會,這是不交叉推論。直覺在這裡沒有錯,它缺的只是「依賴什麼假設」:真實的河面在礁石邊、漩渦中心,水流方向會在極短距離內劇烈改變,Lipschitz 常數 很大甚至不存在,這時「同一點放兩片葉子」的結果就不再由地圖決定,任何微小的擾動都會被放大。理論的價值不在於重申直覺,而在於告訴你在哪裡該不相信直覺。
回到河面:動手放葉子
用電腦「順著箭頭走」最簡單的做法,就是把上面「滑一小段」的畫面直接寫成程式:每隔 秒看一次箭頭,往那個方向走 。
import numpy as np
def u(x, t): # 水流地圖:往右流,上下擺動
return np.array([1.0, 0.5*np.cos(x[0])])
def drift(x0, T=60.0, h=0.1):
x, t = np.array(x0, float), 0.0
while t < T - 1e-12:
x = x + h*u(x, t); t += h
return x
print(drift([0.0, 0.0])) # 應接近 (60, 0.5*sin 60)
這個場有 closed form 解 、(自己代入檢查:),所以可以對答案。 縮小十倍,數值解與 closed form 解的差距也大約縮小十倍——這個「差距怎麼隨 縮小」的規律,本 class 後面兩篇會精確算出來。
先消化一下
參考文獻
- Strogatz, S. H. Nonlinear Dynamics and Chaos: With Applications to Physics, Biology, Chemistry, and Engineering. Westview Press, 2nd ed., 2015.(第 2、6 章:一維與二維 vector field 的幾何直覺,存在唯一定理的結論式陳述。)
- Hirsch, M. W., Smale, S., Devaney, R. L. Differential Equations, Dynamical Systems, and an Introduction to Chaos. Academic Press, 3rd ed., 2013.(第 7 章:Picard–Lindelöf 的完整證明。)
- Hairer, E., Nørsett, S. P., Wanner, G. Solving Ordinary Differential Equations I: Nonstiff Problems. Springer, 2nd ed., 1993.(第 I 章:存在唯一定理與數值方法的共同起點。)