M0.2 導航的三十秒:Taylor 展開與「假設直線」
兩次定位之間
手機導航不是每一瞬間都知道你在哪。它每隔一段時間收到一次定位——假設是每 秒一次——兩次之間畫面上的小箭頭是算出來的:拿上一次的位置與速度,假設你維持同樣的速度、同樣的方向直走。
直路上這沒問題。問題在轉彎:你在市區以 36 km/h(每秒 10 公尺)進入一個半徑 20 公尺的彎,導航在你進彎的瞬間拿到最後一次定位,接下來 秒都假設你直走。
我們漏掉的是進彎後速度方向的變化。能不能用當下的速度、再加上它的變化率,估計這個偏差? 先看短短的一步,再問這個估計放到很長的時間後還能不能用。
課堂提問Q1
把情境翻成數學:這裡的函數是什麼?導航「假設直走」在做什麼運算?我們想估的量是什麼?
先想一想,再展開看整理後的答案
最直覺的說法是「函數是路線」,可以再精確一點。
函數是位置隨時間的軌跡 ——一個輸入時間、輸出平面座標的函數(兩個分量)。最後一次定位發生在時間 ,導航知道的是當時的位置 與速度 (速度由前幾次定位差出來)。
「假設直走」是一個非常明確的運算:用
當作 時的位置。也就是說,導航用經過 、斜率為 的直線取代了真實的曲線。
我們想估的量是這條直線與真實軌跡在 時的距離 。翻譯完會發現,問題其實跟導航無關:任何時候你用「當下的值加上當下的變化率乘時間」去預測未來,你都在假設直線;問題是這個假設在多長時間內可信、差多少。 這就是 Taylor 展開要回答的事。
一把彎的尺
拿一根有點彎的塑膠尺,貼著眼睛看很短的一段——它看起來是直的。看的範圍拉長,彎曲才顯現出來。
把很短的一段用切線取代,誤差來自切線方向之外的變化。對位置隨時間的函數,這個變化用 acceleration 描述。它不只包含轉彎:沿直線加速或減速,同樣會讓「維持當下速度」的預測出錯。若二階項非零且步長夠小,步長加倍,首要誤差會接近四倍,而不是永遠精確四倍。
導航的情形一模一樣:軌跡是那根尺,「兩次定位之間」是你看的那一段,轉彎的急緩是尺的彎曲程度。
圖:平滑曲線離開切線的首要誤差是二階項,量級為 h²。
把「直線假設的誤差」寫成數學
先看一個分量。設 是一個對時間的函數(例如位置的 座標),在 附近有二階導數。一階 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 秒早已超出這個範圍,此時偏差其實接近 (線性),因為真車根本沒走遠。
因此要分清兩件事:加速度在區間內有界時, 是上界;加速度在短短一步內變化不大時, 才是好用的首要近似。等速直線的加速度為零,預測才完全精確;沿直線加減速仍有誤差,不能只看路線彎不彎。
若能估計 acceleration,就可以補上二階項。在這個等速圓周的例子,速率加上轉向率足以算出 acceleration;一般情況還要考慮速率的變化。 秒時,二階 remainder 上界約 0.42 m,比一階近似更小。能不能不直接量 acceleration,而用幾次 velocity 查詢取得類似資訊?這會是 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 展開分析一步法的局部誤差。)