算子分裂(operator splitting)
許多真實的偏微分方程把好幾種不同的物理效應綑在一條方程裡——比方說對流加擴散加反應。每種效應單獨都有理解透徹、高效的求解器,但合在一起要一次離散卻很彆扭。算子分裂是務實的策略:在一個短時間步內依次求解每一塊,彷彿其餘的暫時凍結,然後循環走過它們。你把困難的組合問題拆成一串你早已知道如何解得好的簡單子問題。
把方程寫成 u_t = (A + B) u,其中 A 與 B 是兩種不同效應的算子(例如 A = 對流、B = 擴散)。最簡單的格式 Lie 分裂,在一步 dt 內如此推進:先就整步求解 u_t = A u(只用對流求解器),再拿那個結果就整步求解 u_t = B u(只用擴散求解器)。先 A 後 B 會引入正比於 dt 的分裂誤差,因為兩個算子不可交換(先對流再擴散,不同於先擴散再對流)。標準的修正是 Strang 分裂,一種對稱的三明治:做「半步」A,再做「整步」B,再做「半步」A。這個對稱性消去了主誤差項,方法在時間上變成二階精度——一個便宜而優雅的升級。
分裂在大型模擬中無處不在,因為它讓你能用專門、優化的積木組裝出一個複雜的求解器——對流部分用黎曼求解器、剛性的擴散或反應部分用隱式求解器,各自以適合自己的步長運行。它也馴服剛性:剛性的反應項可隱式積分,而非剛性的傳輸則顯式進行。誠實的提醒:不可交換的算子總會帶來分裂誤差(故 dt 須適中,且 Lie 分裂只有一階);邊界條件要正確地分裂可能很微妙;而對強耦合的效應(算子每一瞬間都緊密互動),分裂可能不準,全耦合的格式更佳。
對反應-擴散方程 u_t = D u_xx + R(u),在一步 dt 內的 Strang 分裂為:半步純反應(對 u_t = R(u) 的常微分方程求解器),再整步純擴散(隱式的熱方程求解器),再半步反應。每個子求解器對其那一塊都是同類最佳,而整體格式在時間上是二階。
用各自最佳的求解器解每種物理效應,再交替進行——對稱地進行以達二階。
只要算子不可交換,分裂誤差便不可避免,因此答案取決於步長與(對 Lie 分裂而言)你施加 A 與 B 的順序。Strang 分裂消去主項但非全部——分裂並非精確,只是收斂。