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

標竿問題(benchmark problem)

在信任一輛新車之前,你可能會把它開到一條熟悉的測試賽道上繞圈——在那裡你早已知道單圈該跑多快、哪些彎角最刁鑽。標竿問題就是一個數值軟體的測試賽道:一個標準、有完整文件、有已知或被廣泛認可答案的問題,整個社群用它來檢查並比較各種程式。當你全新的求解器把標竿做對了,你就更有信心它對陌生問題也會做對;當各種程式在標竿上彼此不合,社群就學到了些東西。

標竿有幾種風味。有些有精確的封閉形式答案(一個製造解,或一個可手算的問題),這些用於驗證——你程式對精確答案的誤差必須以正確的速率縮小。另一些沒有封閉形式,但有一個由許多高品質的獨立計算或細心實驗所一致認可的「參考」答案;這些既用來確認模型,也用來公平地比較不同方法。不同領域的經典例子包括計算流體力學中的頂蓋驅動方腔流(一個方盒、一面牆會動,其流場被列表記到許多位數)、線性代數的標準測試矩陣,以及剛性 ODE 測試集。一個好的標竿會附上精確的規格——確切的幾何、邊界條件、參數——這樣兩個解「同一個」問題的團隊才真的是在解同一個問題。

標竿之所以重要,是因為它讓信任可轉移、讓比較公平。它讓審查者能重現你的宣稱、讓新手能拿一個程式對著既有結果校準、讓相互競爭的方法能在相同的基礎上受評判。它也是回歸測試的關鍵成分:把一個標竿的答案凍結起來,在每次改程式後重跑它,以抓出意外的損壞。誠實的提醒:通過一個標竿證明的是程式能處理「那個」問題,不是所有問題——一個程式可能被(甚至無意識地)調校到在某個著名標竿上拿滿分,卻在你真正在意的那個案例上失敗。而且一個標竿的「參考」答案,好不過它背後那些計算或實驗;參考值偶爾也被修訂過。標竿是正確性的必要證據,從不是充分的證明。

一個新的流體求解器在雷諾數 1000 的頂蓋驅動方腔上受測——一個單位正方形、頂牆滑動。沿垂直中線的水平速度,已被許多獨立研究列表記到好幾位數。若你的求解器在網格細化時重現了那些列表值,它就通過了一個被廣泛信任的確認標竿;明顯的不符會送你去獵捕一個臭蟲或一個漏掉的物理項。

一個有列表答案的社群參考問題,讓各個獨立的程式能在平等的基礎上被比較。

通過標竿是必要的,但不充分:一個程式可能被(甚至無意地)調校到在某個著名測試上拿滿分,卻在你真正的問題上失敗。而且參考值好不過它背後的工作——有些值多年來已被修訂。

又稱
test problemreference problemvalidation benchmark標準測試問題基準問題