M0.2 導航的三十秒:Taylor 展開與「假設直線」
起點:兩次定位之間
手機導航不是每一瞬間都知道你在哪。它每隔一段時間收到一次定位——假設是每 秒一次——兩次之間畫面上的小箭頭是算出來的:拿上一次的位置與速度,假設你維持同樣的速度、同樣的方向直走。
直路上這沒問題。問題在轉彎:你在市區以 36 km/h(每秒 10 公尺)進入一個半徑 20 公尺的彎,導航在你進彎的瞬間拿到最後一次定位,接下來 秒都假設你直走。
請先用直覺回答: 秒時,畫面上的箭頭會偏離你真實位置多遠? 秒呢? 秒呢?寫下數字和你有多確定。
大多數人會猜 秒偏幾公尺、 秒偏大約兩倍。第一個猜得差不多,第二個猜錯了——偏差不是兩倍,是四倍。而 秒的答案,會讓我們看到這個「四倍規律」本身也有它的適用範圍。
課堂提問Q1
把情境翻成數學:這裡的函數是什麼?導航「假設直走」在做什麼運算?我們想估的量是什麼?
先想一想,再展開看整理後的答案
最直覺的說法是「函數是路線」,可以再精確一點。
函數是位置隨時間的軌跡 ——一個輸入時間、輸出平面座標的函數(兩個分量)。最後一次定位發生在時間 ,導航知道的是當時的位置 與速度 (速度由前幾次定位差出來)。
「假設直走」是一個非常明確的運算:用
當作 時的位置。也就是說,導航用經過 、斜率為 的直線取代了真實的曲線。
我們想估的量是這條直線與真實軌跡在 時的距離 。翻譯完會發現,問題其實跟導航無關:任何時候你用「當下的值加上當下的變化率乘時間」去預測未來,你都在假設直線;問題是這個假設在多長時間內可信、差多少。 這就是 Taylor 展開要回答的事。
一把彎的尺
拿一根有點彎的塑膠尺,貼著眼睛看很短的一段——它看起來是直的。看的範圍拉長,彎曲才顯現出來。
重點不在「它到底是不是直的」,而在彎曲顯現得多快。一根幾乎筆直的尺,你可以看很長一段還覺得直;一根很彎的尺,稍微拉長一點就露餡。而且露餡的速度有一個固定的規律:看的長度加倍,「直線假設」偏離真尺的距離變四倍。 這是曲線的普遍性質,不是尺的特殊性質。
導航的情形一模一樣:軌跡是那根尺,「兩次定位之間」是你看的那一段,轉彎的急緩是尺的彎曲程度。
把「直線假設的誤差」寫成數學
先看一個分量。設 是一個對時間的函數(例如位置的 座標),在 附近有二階導數。一階 Taylor 展開說
前兩項就是「假設直線」; 是直線與真實的差,叫 remainder(餘項)。它的形狀值得盯著看:一個 ,乘上這段時間內某一刻的二階導數——對軌跡來說就是加速度。所以直線假設的誤差 :時間加倍、上界四倍;加速度加倍、上界兩倍。
展開細節餘項為什麼是 h²/2 乘二階導數(積分形式,六行)
由微積分基本定理,。再對 用一次:。代回去並交換積分順序:
權重 在 上的積分是 ,所以 ;若 連續,由中間值定理可以把它寫成 。對向量值的 ,逐分量套用,或直接用積分形式得到 。
二階 Taylor 多補一項,把「當下的加速度」也算進去:
規律是一致的:多用一階導數的資訊,餘項就多一個 的次方。 但每一階都有同樣的但書——公式裡出現的是那段時間內的最大導數,而「它是一個好用的估計」需要 小到 在這段時間裡沒有劇烈變化。
回到情境:三個數字
把轉彎寫成數學:半徑 m 的圓弧、速率 m/s。圓周運動的加速度指向圓心、大小 m/s²,而且沿著圓弧處處相同,所以餘項的上界可以直接算:
秒:上界 2.5 m;精確算(把直線終點與圓弧上的真實位置相減)是 2.48 m。 秒:上界 10 m,精確 9.73 m——是 的四倍,不是兩倍。直覺「兩倍」錯在把偏差當成線性累積;實際上直線假設的誤差是 ,因為它漏掉的是加速度的效果,而加速度的效果本來就是 。
秒:上界 m。這個數字是對的(真實偏差確實不超過它),但毫無用處:30 秒內車以 10 m/s 在半徑 20 m 的圓上跑了 300 m,繞了兩圈多,真實位置離出發點不到 40 m,而直線預測跑到 300 m 外——真實偏差約 290 m。上界對、但鬆了將近十倍。原因是 這個量級描述的是「 小到軌跡在這段時間內還像一條拋物線」的情形;30 秒早已超出這個範圍,此時偏差其實接近 (線性),因為真車根本沒走遠。
所以「假設直線」這個做法的判斷是:在 smooth 的軌跡上、步長小到加速度在一步之內沒明顯改變時,誤差是 ,可靠且可預測;步長一大,上界仍然對但變得無資訊,估計本身也失效。 直路上()任何 都沒有誤差——導航在高速公路上更新慢一點沒關係,是這個式子說的。
如果導航多用一個感測器——陀螺儀給轉向率,也就是 ——就能改用二階 Taylor: 秒時餘項上界 m(精確 0.41 m),比 2.5 m 好六倍。這是「多量一階、多賺一個 」的實例;把它變成不需要額外感測器的演算法,是 M2.4 的主題。
回到情境:實際跑一次,再把彎弄急
import numpy as np
def err(h, v=10.0, R=20.0):
th = v*h/R # h 秒內轉過的角度
true = R*np.array([np.sin(th), 1-np.cos(th)]) # 圓弧上的真實位置
pred = np.array([v*h, 0.0]) # 假設直走
return np.linalg.norm(true-pred)
hs = np.array([0.125, 0.25, 0.5, 1, 2, 4])
for R in (20.0, 2.0): # 正常彎 vs 急彎(U-turn)
e = np.array([err(h, R=R) for h in hs])
print(f"R={R}: 誤差 {np.round(e, 2)}")
print(f" h 加倍後誤差的倍率 {np.round(e[1:]/e[:-1], 2)} 上界 {np.round(50*hs**2/R, 2)}")
時,倍率一路是 –,直到 秒才掉到 —— 規律在 小時精確兌現。(一個急迫的 U-turn)時, 秒的誤差 0.39 m 仍與上界吻合,但倍率一路掉: 還有 ,接著是 、、、:加速度大了十倍,「一步之內像拋物線」的範圍縮到零點幾秒,同樣的 在這裡已經算「太大」。
另一種違反是路徑不 smooth:如果司機在兩次定位之間瞬間變換車道(軌跡有一個折角),那一步的誤差與折角之後經過的時間成正比——是 而不是 ,因為 Taylor 展開需要的二階導數在折角處根本不存在。
先消化一下
參考文獻
- Strang, G. Calculus. Wellesley-Cambridge Press;MIT OpenCourseWare RES.18-001 免費全文。(Taylor 展開與餘項的章節。)
- Hairer, E., Nørsett, S. P., Wanner, G. Solving Ordinary Differential Equations I: Nonstiff Problems, 2nd ed. Springer 1993.(第 II 章:用 Taylor 展開分析一步法的局部誤差。)