蛙跳格式(leapfrog scheme)
波動方程 u_tt = c^2 * u_xx 含有時間的「二階」導數,而非一階——振動的弦、聲波、漣漪。它誠實的本性是:不像熱那樣擴散抹平,而是傳播,把特徵帶著走而不撫平。好的格式應映照這點,蛙跳格式做到了:它在時間與空間上都置中,用一個對稱的三層模板「蛙跳」過現在,連起過去與未來。
你用對稱中心模板逼近「兩個」二階導數。時間上,u_tt 變成 (u_j^{n+1} - 2 u_j^n + u_j^{n-1}) / k^2——它回溯到「前一」時間層 n-1、前進到 n+1,不跳過任何層卻對稱看待它們。空間上,u_xx 變成 (u_{j-1}^n - 2 u_j^n + u_{j+1}^n) / h^2。令兩者相等並解出唯一的未來未知量,得 u_j^{n+1} = 2 u_j^n - u_j^{n-1} + (c k / h)^2 * (u_{j-1}^n - 2 u_j^n + u_{j+1}^n)。名稱來自這個樣式:偶數與奇數時間層像兩個交錯的數列各自前進,彼此蛙跳。格式為顯式,在時間與空間上皆二階準確,O(k^2 + h^2)。
蛙跳是波動的天然顯式格式,因為不像擴散格式,它「沒有」數值耗散:以恰當的步長它守恆波的能量,讓波乾淨地行進。代價有二。其一,它只條件穩定——CFL 條件要求庫朗數 c k / h 至多為 1,這是「資訊不得跑得比網格快」的數值陳述。其二,它需要兩個起始層(n 與 n-1),故你必須以別的方法(常用初速的泰勒展開)引導第一步。它還可能支撐一個假性的「計算模式」——時間上的鋸齒,三層模板默默容許的——通常以小濾波器或偶爾的平均步來控制。
撥動的弦取 c = 1、h = 0.1、k = 0.08,得庫朗數 c k / h = 0.8 <= 1(穩定)。起步時你有初始形狀(層 0),並用給定的初速建出層 1,然後蛙跳:每個後續值等於兩倍當前減去前一個,再加上空間曲率項。把 k 推到 0.12 使庫朗數超過 1,波的振幅就無界成長。
波動的三層顯式格式——無耗散,當 c*k/h <= 1 時穩定。
因為它不沾擴散,蛙跳不加任何數值耗散——對能量守恆極佳,但它沒有內建的雜訊阻尼,故高頻誤差與假性計算模式會持續,除非你濾掉它們。相對地,把蛙跳用於「擴散」方程(理查森格式)則無條件不穩定——中心時間對一階時間的 PDE 是錯的。