在數字分析的領域中,數值穩定性是數學算法一項非常可取的屬性。穩定性的精確定義取決於上下文,尤其在數值線性代數和通過離散近似解決常微分方程及偏微分方程的算法中,這一點尤為顯著。
“穩定性可以確保在對輸入數據做微小更改時,最終結果不會劇烈波動。”
在數值線性代數中,主要關注在近乎奇異的問題附近出現的不穩定性,例如非常小的或幾乎重合的特徵值。而在解決微分方程的數值算法中,則關注於舍入誤差或初始數據的小波動可能導致最終答案與精確解之間的巨大偏差。一些數值算法可能會消減輸入數據中的小波動及誤差,其他的則可能放大這些誤差。那些被證明不會放大近似誤差的計算稱為數值穩定的。
數字分析的一個常見任務是選擇穩健的算法,這意味著當輸入數據發生微小變化時,結果不會產生天壤之別的情況。相反的現象則是算法的不穩定性。通常,算法涉及到一種近似方法,而在某些情況下,可以證明該算法在使用實數而非浮點數時會趨近於正確解。然而,在這種情況下,並不保證它會收斂到正確的解,因為浮點數的舍入或截斷誤差可能被放大,造成從正確解的偏差指數性增長。
在數值線性代數中,穩定性的概念可以用幾種不同方式來形式化。常用的前向、後向和混合穩定性的定義通常出現於這一領域。令我們考慮一個被數值算法解決的問題,這裡的函數 f 將數據 x 映射為解 y。算法的結果 y* 通常會偏離 “真實” 解 y。造成誤差的主要原因是舍入誤差和截斷誤差。
“算法的前向誤差是結果與解之間的差距;而後向誤差則是最小的 Δx,使得 f(x + Δx) = y*。”
前向誤差是 y* 與 y 之間的差異;而後向誤差則是滿足 f(x + Δx) = y* 的最小 Δx。前向誤差與後向誤差之間存在著條件數的關係:前向誤差的大小至多為條件數與後向誤差之間的乘積。在許多情況下,更自然的做法是考慮相對誤差。當後向誤差針對所有輸入 x 都很小時,我們稱該算法為後向穩定。當然,「小」是一個相對的術語,其定義將取決於具體的上下文。
通常數值穩定性的定義更為通用,稱為混合穩定性,它結合了前向誤差和後向誤差。如果一個算法能夠大致解決一個相鄰問題,即存在一個小的 Δx,使得 f(x + Δx) - y* 也小,則該算法是穩定的。因此,一個後向穩定的算法總是穩定的。相對於前向穩定性而言,若一個算法的前向誤差除以問題的條件數相對較小,則該算法就是前向穩定的。
在求解微分方程的過程中,穩定性的定義卻有所不同。在數值常微分方程中,存在多種數值穩定性的概念,例如 A-穩定性。這些概念通常與動力系統中的某些穩定性概念相關,特別是 Lyapunov 穩定性。當求解剛性方程時,使用穩定的方法非常重要。
“穩定性有時需要通過引入數值擴散來實現,這樣可以確保計算中的舍入誤差不會累積到危險的程度。”
對於線性演化型偏微分方程的解算法來說,若在步長趨向於零時數值解的總變化保持有界,則該算法被認為是穩定的。Lax 等價定理表明,如果一個算法是一致的且穩定的,則它會收斂。然而,對於非線性偏微分方程,穩定性的定義則複雜得多,因為非線性方程中的許多性質在其線性對應中是不存在的。
計算平方根 2(約為 1.41421)是一個良定義的問題。許多算法通過從一個初始近似 x0 開始來解決此問題,例如 x0 = 1.4,然後不斷計算改進的猜測 x1、x2 等等。著名的巴比倫(Babylonian)方法是一個典型的可能會被使用的方法,其公式為 xk+1 = (xk + 2/xk) / 2。
而另一種方法稱作「方法 X」,其公式為 xk+1 = (xk^2 − 2)² + xk。該表格下記錄了每種方法的一些迭代,並且看到巴比倫方法無論初始猜測為何都能快速收斂,而方法 X 則在 x0 = 1.4 時收斂非常緩慢,在 x0 = 1.42 時則稀奇地發散。因此,巴比倫方法被認為是數值穩定的,而方法 X 則是數值不穩定的。
數值穩定性還受到機器保留有效位數的影響。如果一個機器只保留四位有效數字,就可能給出一個良好的例子,說明顯著性喪失可能會造成的後果。比如考慮 equivalent functions f(x) 和 g(x)。在計算 f(500) 和 g(500) 時,即使這兩個函數是相等的,但卻得出截然不同的結果,顯示了小的誤差如何導致大的變異。
總而言之,數值穩定性在數字分析中至關重要,它影響著我們解決問題的準確性與效率。然而,在你心中,什麼樣的算法或方法能在不穩定的條件下依然保持穩定性呢?