一個答案,並不附帶它自己誤差的判決
在前三篇裡,你拿一條偏微分方程,寫下它的弱形式,在一張網格上挑選形狀函數,組裝出剛度矩陣 K 與載荷向量 f,然後解 K u = f。跑出來的是一個節點值向量,以及一幅你能畫出來的連續圖像。接著最自然的問題——也是一位真正的工程師在敢信任一座橋或一片機翼之前,必須回答的問題——很直接:你算出來的 u_h,距離那個你永遠看不到的真解 u,到底有多遠?一幅看起來平滑又合理的圖,幾乎什麼都沒告訴你;伽遼金法非常擅長在爛網格上吐出看起來自信滿滿的胡說。
u - u_h 這個落差有個從第一級就一直在用的名字:離散化誤差,是你拿一個由帽函數張成的有限維空間,去替換無窮維函數空間所付出的代價。它和求解器引入的捨入是兩種不同的野獸,而且實務上大得多:就算用精確算術,你的網格也根本無法表示真解的每一個波折。本篇講的就是理解、界定,然後刻意地縮小這份誤差——而掌控這一切的槓桿,就是網格。
Céa 引理:你頂多和網格允許的一樣好
這是有限元素裡最令人安心的單一結果。伽遼金解 u_h 不只是你網格空間 V_h 裡的某個函數——它(差一個常數倍)就是所能達到的最好的那一個。Céa 引理說:||u - u_h|| <= (C/alpha) * (在 V_h 中所有 v_h 上取的)min ||u - v_h||。慢慢讀。右邊是你的網格所能提供的最佳近似的誤差——就算有個神仙把它直接交到你手上也一樣。Céa 引理保證伽遼金落在那位神仙的一個固定倍數之內。你從不因方法本身受罰——只因你所選空間的極限受罰。
為什麼這是天大的好消息?因為它把一個難題——「我的求解器有多準?」——轉成一個純粹的近似論問題:「在這張網格上,分段多項式能把真解 u 近似得多好?」而這個我們早就會回答。從插值那一級,插值誤差公式告訴我們:對一個光滑函數做分段線性插值,在尺寸為 h 的網格上,函數本身的誤差是 O(h^2) 量級、其導數的誤差是 O(h) 量級。Céa 把伽遼金誤差直接交給這些已知的收斂率。
O(h^p) 的收斂率:細化到底買到什麼
把 Céa 與插值合起來,你就得到那條頭條結果。對多項式次數為 p 的元素,作用在一個夠光滑的解上,能量範數誤差遵守 ||u - u_h|| = O(h^p),其中 h 是最大的元素直徑。線性帽(p = 1)給出能量範數 O(h) 與解值 O(h^2);二次(p = 2)給出 O(h^2) 與 O(h^3);以此類推。這就是收斂階,也是你賴以為生、成敗繫之的數字,因為它在你花掉任何一分計算之前,就告訴你功夫與精度之間的匯率。
把這講具體些。用線性元素(能量誤差 O(h)),把 h 減半大致把誤差減半——但在二維裡這會讓元素數變四倍,而解 K u = f 在一個更大、更稀疏的系統上更花成本。用二次元素,把 h 減半則把能量誤差砍到四分之一。所以你有兩個旋鈕:縮小 h(更多、更小的元素——h 細化)或提高 p(每個元素用更豐富的多項式——p 細化)。兩者並用就是 hp 細化,在光滑解上它能讓誤差隨功夫指數下降,遠快於任何固定次數的 h 細化。
量出收斂率,以及它背後的網格品質
就算不知道 u,你也能用人造解的方法實證驗證收斂率:挑一個你喜歡的 u,把它代進偏微分方程算出對應的右端項,求解,於是你就知道精確的誤差了。在 h、h/2、h/4 的一連串網格上跑,看著誤差下降。如果誤差按 C*h^p 變化,那麼把 h 減半就讓誤差乘上 2^(-p),於是把 log(誤差) 對 log(h) 作圖會是一條直線,斜率就是 p。把預期的斜率還原出來,正是檢查你的組裝與邊界條件有沒有臭蟲的標準理智測試。
mesh h error E ratio E/E_prev est. order p
-------- --------- -------------- -----------
1/8 1.97e-2 - -
1/16 4.99e-3 0.253 log2(1/0.253) = 1.98
1/32 1.25e-3 0.251 log2(1/0.251) = 2.00
1/64 3.13e-4 0.250 log2(1/0.250) = 2.00
ratio -> 1/4 each halving => O(h^2) (linear elements, L2 norm)但如果你的元素形狀畸形,單看 h 就是個謊言。插值界藏著一個常數,會隨三角形變得又細又像碎片而爆掉——一個又長又像針的元素有巨大的長寬比,它的梯度插值會嚴重退化。因此網格產生器拚命要讓元素接近正三角形(好的「網格品質」,以最小角或長寬比衡量),而角落裡單單一個碎片元素,就可能悄悄主宰你整份誤差預算。只細化 h 卻不管形狀,就像買了更銳利的鏡頭、卻把它裝歪了。
讓解自己挑哪裡該細化
到處都細化太浪費了:大部分區域風平浪靜,誤差只集中在幾個熱點——一個角、一層、一道陡峭的鋒面。聰明的做法是只在要緊處細化,但這需要一個不知道 u 也能估量局部誤差的辦法。後驗誤差估計子登場:一個在求解之後、只從 u_h 算出的量,標出哪些元素扛了最多誤差。經典的材料是殘差——把 u_h 逐元素代回強形式的偏微分方程;它無法平衡之處、以及梯度跨元素邊界跳變之處,誤差就大。
這是「先驗對後驗」這一對裡的後驗那一半:Céa 給的 O(h^p) 界是先驗的,在你計算之前就已知,適合用來挑 p 與一張起始網格;估計子是後驗的,從實際的解算出,適合用來決定下一步該怎麼做。把這些逐元素的誤差指標餵進一個迴圈,你就得到自適應網格細化:求解、估計、標出最糟的元素、只細化那些、再重複。網格恰好在物理困難之處變密,在容易之處保持粗——而且全自動。
- 在當前網格上解有限元素方程組 K u = f,得到 u_h。
- 估計:從 u_h 算出每個元素的誤差指標(元素殘差加上梯度跨邊的跳變)。
- 標記:標出指標最大的那些元素——比方說最糟的 20%,它們合起來扛了大部分總誤差。
- 細化:只分裂被標記的元素(h 細化),或提高它們的次數(p 細化),過程中讓網格保持形狀規則。
- 重複,直到全域估計誤差降到你的容忍度以下——然後你才信任這個答案,且有一個數字撐腰。
在你歡呼之前,有兩個誠實的提醒。估計子本身也是個估計——它把真誤差夾在常數倍之間,所以「可靠又高效」的估計子會從上方與下方界定誤差,但在奇異點附近若其假設被破壞,它仍可能誤導。而且自適應並非免費:每一輪都要重解一個線性系統,標記與細化增添簿記,而過度激進地自適應的網格還會產生懸掛節點、使組裝變複雜。即便如此,對於具有局部特徵的問題,自適應網格達到目標精度所需的未知數,遠少於均勻細化——常常正是「算得動」與「算不動」之間的差別。
你站在哪裡,以及第五篇補上什麼
你現在握有有限元素法從頭到尾的精度全貌。Céa 引理說伽遼金是準最優的——和網格允許的一樣好。插值論把它變成具體的 O(h^p) 收斂率,只在解保持光滑、元素保持形狀良好時成立。一次收斂階研究讓你查驗收斂率;一個後驗估計子讓你把網格導向誤差藏身之處。每個值仍是近似——網格帶來的離散化誤差,加上底下解 K u = f 的捨入——但如今你能對前者套上一條誠實、可量化的繩索。
標準有限元素法沒有免費奉送的一件事,就是精確守恆——離散解可能在連續物理會滴水不漏地守住之處,悄悄漏掉一點質量或能量。對於流體流動,精確守恆質量與動量是不可妥協的,這領域便轉向一個建立在控制體積與通量、而非弱形式上的姊妹方法。那就是有限體積法,以及它為了在陡峭鋒面上保持穩定所需的迎風——計算流體力學的引擎。那正是本級的壓軸,第五篇。