M2.1 13 分鐘閱讀 2026年9月

M2.1 從一片葉子到一群葉子:Flow Map 與 Pushforward

本篇重用M2.0河面上的箭頭:Vector Field 與 ODE·M1.0兩台體重計:Gaussian 的線性組合

一千片葉子

上一篇(M2.0)解決了一片葉子的問題:水流地圖 uu 已知,葉子從 x0x_0 出發,一分鐘後在一個確定的位置。

現在換個玩法。你抓起一把葉子——一千片——從橋上撒下去。它們不會落在同一點,而是散在橋下一小塊水面上:靠中間多、靠邊少。一分鐘後,這一千片葉子會散成什麼樣子?哪裡密、哪裡稀?

先用直覺回答,並寫下你有多確定。常見的答案是:「每片葉子各自順著箭頭走,所以整群葉子就是原本那團的形狀被水流『搬』到下游」。這個答案抓到了一件對的事——每片葉子的命運彼此無關;但它漏了一件事:水流有地方快、有地方慢,有地方匯合、有地方分開,搬過去的那團形狀會變。快的地方葉子被拉開、變稀;匯合的地方葉子被擠在一起、變密。那麼密到多密、稀到多稀?能不能不靠撒一千片葉子去數,直接算出來?

課堂提問Q1

翻成數學。「一千片葉子的散佈」是什麼物件?「一分鐘後的散佈」又是什麼?我們想求的量,跟上一篇的 x(60)x(60) 有什麼關係?

先想一想,再展開看整理後的答案

課堂上第一個反應通常是「一千個點的位置」。這沒錯,但它是樣本,不是我們想要的東西。一千片葉子是從某個分佈抽出來的:撒葉子的手決定了「落在橋下哪個位置」的機率密度 p0(x)p_0(x)——中間高、邊緣低。所以:

起點是一個隨機變數 X0p0X_0\sim p_0,一千片葉子是它的一千個獨立樣本。

每片葉子接下來的路是確定的。 上一篇說,從 x0x_0 出發的葉子在時刻 tt 的位置是 ODE 的唯一解。把這個對應寫成一個函數:

Φt(x0)  =  從 x0 出發、順著 u 走到時刻 t 的位置.\Phi_t(x_0)\;=\;\text{從 }x_0\text{ 出發、順著 }u\text{ 走到時刻 }t\text{ 的位置}.

Φt:RdRd\Phi_t:\mathbb R^d\to\mathbb R^dflow map:它不是一片葉子的路,而是「所有起點同時被送到哪」的一張總表。

一分鐘後的散佈是隨機變數 Xt=Φt(X0)X_t=\Phi_t(X_0) 的分佈,記成 ptp_t。我們想求的就是 ptp_t。它和上一篇的關係是:上一篇算的是一個特定輸入 x0x_0 的輸出 Φt(x0)\Phi_t(x_0);這一篇是把整個分佈送進 Φt\Phi_t。這個操作有名字,叫 pushforward(把分佈往前推),寫成 pt=(Φt)#p0p_t=(\Phi_t)_\#\,p_0

先看畫面:一塊會變形的果凍

把橋下那團葉子想成一塊軟果凍,每一小塊果凍就是一小群葉子。水流帶著果凍往下游走,同時把它揉變形:流速在前進方向變快的地方,果凍被拉長,同樣多的葉子占了更大的面積,變稀;水流往中央匯合的地方,果凍被壓扁,變密。

但有兩件事水流做不到。第一,它不能讓兩塊不同的果凍融成一塊——那需要兩片不同的葉子在同一時刻到達同一點,上一篇說這不會發生。第二,它不能把果凍撕開——軌跡是連續的。所以一分鐘後的果凍,是原本那塊被連續、不重疊地變形的結果:每一小塊有多少葉子沒變,只是占的面積變了。密度 = 葉子數 ÷ 面積,所以密度的變化完全由面積的伸縮決定

寫成數學:flow map、pushforward、change of variables

Flow map 的性質。M2.0 的存在唯一(Lipschitz 條件下):

  1. Φ0=id\Phi_0=\mathrm{id};且 Φt\Phi_tx0x_0 是 continuous 的(起點差一點、終點差一點,差距至多放大 eLte^{Lt} 倍——這是 M2.3 裡 Grönwall 不等式的內容,先當結論)。
  2. 可逆。 Φt\Phi_t 是一對一的:若 Φt(a)=Φt(b)\Phi_t(a)=\Phi_t(b),兩條軌跡在時刻 tt 相交,唯一性說它們整條相同,故 a=ba=b。反函數就是「把時間倒著走」:Φt1\Phi_t^{-1} 是 vector field u(x,ts)-u(x,t-s)tt 秒的 flow map。所以 Φt\Phi_t 是一個 diffeomorphism(可微、可逆、反函數也可微的映射),只要 uu 夠 smooth。
  3. uu 不隨時間變,還有 Φs+t=ΦsΦt\Phi_{s+t}=\Phi_s\circ\Phi_t:先走 tt 秒再走 ss 秒,等於一次走 s+ts+t 秒。

Pushforward 的定義。 給一個可測映射 Φ\Phi 與一個分佈 p0p_0Φ#p0\Phi_\#p_0 是「先從 p0p_0X0X_0、再算 Φ(X0)\Phi(X_0)」得到的分佈。用集合寫:對任何區域 AA

(Φ#p0)(A)  =  p0(Φ1(A))(\Phi_\#p_0)(A)\;=\;p_0\big(\Phi^{-1}(A)\big)

——落在 AA 的機率,等於「會被送進 AA 的那些起點」在 p0p_0 下的機率。這個定義對任何映射都成立,不需要可逆。

密度公式(change of variables)。Φ\Phi 可逆且可微,pushforward 有密度:

pt(y)  =  p0(Φt1(y))  detΦt1(y)  =  p0(x)detΦt(x),x=Φt1(y).p_t(y)\;=\;p_0\big(\Phi_t^{-1}(y)\big)\;\Big|\det\nabla\Phi_t^{-1}(y)\Big| \;=\;\frac{p_0(x)}{\big|\det\nabla\Phi_t(x)\big|}\,,\qquad x=\Phi_t^{-1}(y).

三行推導:取 yy 附近的小方塊 AA,它的原像 Φt1(A)\Phi_t^{-1}(A)xx 附近的一個小平行體,體積是 detΦt1(y)vol(A)|\det\nabla\Phi_t^{-1}(y)|\cdot\mathrm{vol}(A)(Jacobian 就是「局部把體積放大多少倍」)。兩邊的機率相等:pt(y)vol(A)p0(x)detΦt1(y)vol(A)p_t(y)\,\mathrm{vol}(A)\approx p_0(x)\,|\det\nabla\Phi_t^{-1}(y)|\,\mathrm{vol}(A)。消掉 vol(A)\mathrm{vol}(A) 即得。\square

這正是上一節「密度變化完全來自面積伸縮」的公式版:detΦt|\det\nabla\Phi_t| 就是果凍那一小塊被放大的倍數。

展開細節一維的完整例子:ẋ = −x,起點是標準 Gaussian

flow map 是 Φ_t(x) = e^(−t) x(代入:d/dt e^(−t)x = −e^(−t)x = −Φ_t ✓)。反函數 Φ_t^(−1)(y) = e^t y,導數 e^t。若 p₀ = N(0,1),則 p_t(y) = p₀(e^t y)·e^t = (2π)^(−1/2) e^t exp(−e^(2t) y²/2), 也就是 N(0, e^(−2t)):所有葉子往原點收攏,分佈越來越窄,但總質量不變(積分仍是 1,因為多出來的 e^t 正好補償變窄)。這個例子在下一篇會再用一次,用另一條路算出同一個答案。

回到河面:直覺的一半對、一半漏

起點問題的直覺答案是「那團葉子的形狀被搬到下游」。對的部分:每片葉子確實各走各的,所以整群的分佈就是 p0p_0Φt\Phi_t 的 pushforward——不多不少,沒有葉子憑空出現或消失。漏掉的部分:「形狀不變」隱含假設了 detΦt1|\det\nabla\Phi_t|\equiv1,也就是水流處處保體積。一般的水流不是這樣;只有 u=0\nabla\cdot u=0 的場(M0.1)才會保體積。所以正確的說法是:葉子的數目守恆,密度按 Jacobian 反比縮放。

這個判斷依賴什麼?依賴 Φt\Phi_t 可逆——也就是上一篇的 Lipschitz 條件。若河面某處水流不是 Lipschitz 的,兩片葉子可能在同一點分道揚鑣,或者反過來說「哪些起點會被送到這裡」不再唯一,pushforward 的集合定義仍然成立(它不需要可逆),但密度公式失效:可能在一個點堆出無限大的密度。

回到河面:數葉子,還是算公式

兩種方法都能得到 ptp_t數葉子是抽 NNX0X_0、各自解 ODE、畫直方圖,誤差來自有限樣本,大約隨 1/N1/\sqrt N 縮小(M1.0 那類 variance 相加的算法);算公式是對每個 yy 反解 Φt1(y)\Phi_t^{-1}(y) 並算 Jacobian,沒有取樣誤差,但每個 yy 都要解一次反向 ODE。

import numpy as np
t, N = 1.0, 1000
x0 = np.random.randn(N)                 # p0 = N(0,1)
xt = np.exp(-t) * x0                    # Phi_t for xdot = -x(此例有 closed form)
ys = np.linspace(-2, 2, 200)
p_formula = np.exp(t) * np.exp(-(np.exp(t)*ys)**2/2) / np.sqrt(2*np.pi)
hist, edges = np.histogram(xt, bins=40, range=(-2, 2), density=True)
# 直方圖與 p_formula 應重合;N 改成 100 看直方圖變毛

先消化一下

想一想

你把一張照片的每個像素座標經過同一個可逆的幾何變形(例如魚眼鏡頭效果)。「原圖中某區域的像素密度」與「變形後對應區域的像素密度」之間的關係,該用哪個工具?

想一想

若水流地圖不是 Lipschitz 的,導致兩片從不同起點出發的葉子在時刻 tt 到達同一點。這時:

想一想

u(x,y)=(y,x)u(x,y)=(-y,\,x)(整條河在原地打轉)把 p0=N(0,I)p_0=\mathcal N(0,I) 推到時刻 ttptp_t 是:

參考文獻

  1. Hirsch, M. W., Smale, S., Devaney, R. L. Differential Equations, Dynamical Systems, and an Introduction to Chaos. Academic Press, 3rd ed., 2013.(第 7 章:flow 的定義與性質,Φs+t=ΦsΦt\Phi_{s+t}=\Phi_s\circ\Phi_t。)
  2. Villani, C. Topics in Optimal Transportation. AMS Graduate Studies in Mathematics 58, 2003.(第 1 章:pushforward(transport of measure)的定義與 change of variables。)
  3. Grimmett, G., Stirzaker, D. Probability and Random Processes. Oxford University Press, 3rd ed., 2001.(第 4 章:隨機變數的函數與密度的變數變換公式。)