科學計算實務:軟體、驗證與可重現性

驗證與確認的分別(verification vs validation)

假設你為一座橋建了一個電腦模擬,它預測這座橋在荷載下會下陷兩公分。有兩個完全不同的問題,決定你該不該信任那個數字。第一:我的程式是否正確地算出了方程式所說的東西?第二:那些方程式是否真的描述了這座真實的橋?第一個問題是「驗證」(verification);第二個是「確認」(validation)。讓兩者不混淆的口號是:驗證問「我們是不是把方程式解『對』了?」,確認問「我們解的是不是『對的』方程式?」。它們是不同的活動,用不同的工具,而你兩者都需要。

驗證關乎程式碼與數學,完全不涉及真實世界。你是在檢查你的數值解是否收斂到你所選方程式的精確解,以及有沒有臭蟲悄悄混進來。它的工具是內部的:製造解法(method of manufactured solutions)、確認誤差隨網格細化以預測速率縮小的收斂階研究、與有已知精確答案的問題作比較,以及單元測試與回歸測試。你可以在把真實世界關掉的情況下完成整個驗證——它是數學與軟體工程。相對地,確認需要把你的模擬輸出,與來自實驗或對實際物理系統觀測的「量測值」作比較。它的工具是實驗資料、不確定性量化與統計比較。確認只能在驗證「之後」進行:拿一個有臭蟲的程式去和現實比較毫無意義,因為你分不清不符是編碼錯誤還是建模錯誤。

為何要堅持這個區別?因為這兩種失敗模式是互相獨立的,而且有不同的解藥。一個被完美驗證過的程式(沒有臭蟲、收斂正確),若其底層模型錯了,仍可能毫無用處——比方說它忽略了重要的溫度效應——再多的除錯也修不好它;你必須改模型。反過來,一個物理上健全的模型若實作時帶著臭蟲,會因為一個與物理毫不相干的理由而與現實不符,此時改模型恰恰是最錯誤的反應。把兩者混為一談,是計算科學中最常見也最昂貴的錯誤之一。誠實的總結:驗證認證的是軟體,確認認證的是模型,而一個兩者都還沒通過的結果,還算不上是科學。

一個團隊寫了一個熱流求解器。「驗證」:他們餵給它一個製造出來的問題(其精確解是他們自己發明的),細化網格,並確認誤差如預測般以 h^2 下降——程式沒有臭蟲,且為二階精度。「確認」:他們接著在一根真實的金屬棒上執行它,把預測溫度與熱電偶讀數比較,發現模型漏掉了輻射散熱。程式是對的;方程式不完整。

驗證沒抓到臭蟲;確認揭露了模型漏掉了物理。是兩道分開的檢查。

順序很重要:先驗證,後確認。若你對一個有臭蟲的程式做確認,與現實的不符就有歧義——你分不清編碼錯誤與建模錯誤,於是你對自己的模型一無所獲。

又称
V&Vcode verification and model validation驗證與確認VV