FDM、FVM、FEM之間到底有沒有聯繫? | 知乎問答精選

 

A-A+

FDM、FVM、FEM之間到底有沒有聯繫?

2018年10月27日 知乎問答精選 暫無評論 閱讀 21 ℃ 次

【朱輝的回答(12票)】:

用三句話給你說明白:

FDM(有限差分法)=用差分近似導數

FVM(有限體積法)=在單元上積分守恆

FEM(有限單元法)=在單元上加權殘差為零

!===========吐槽節目開始===============

本質上三種方法完全不同。

而且,學得越深入你就越知道差別有多大。

凡是有人跟你說「都差不多」的時候,基本你就可以判定他在忽悠你了。

【陳仙客的回答(7票)】:

這個問題也困擾我好久,這些花裡胡哨的名號後邊到底有何玄機?

以一維問題為例,你分別用三種方法進行二階中心差分離散,你會發現得到的係數矩陣都是一樣的三對角矩陣。因為二階中心差分的情況下,大家都是利用『直接鄰居』的信息,所以三種方法得到的離散形式的是全等的。「Different numerical methods are usually more similar than they are distinct.」--The Mathematical Theory of Finite Element Methods。

但是再更高階的情況下,三種方法就分道揚鑣了,各自用不同的策略尋找高階信息。

關於三種方法思路的區別,J.S HestHaven 有一個很形象的闡述。參見這個講稿,Discontinuous Galerkin methods Lecture 1 - Brown University。在他的書《Nodal discontinuous Galerkin methods》裡,稍微詳細地闡述這一觀點。

我現在是覺得,學界有兜售概念的傾向,畢竟這樣顯得創新更多。其實大家都差不多那麼回事。

【YolandaHou的回答(17票)】:

先下結論吧,FEM應用最廣,尤其在固體力學(橢圓方程)這板塊有著巨大的優勢。

FDM、FVM、FEM三種方法恰好對應了求解PDE的三種不同思路。(具體細節看參詳其他人的答案

@毛穎博)

假設有一PDE, L*u(x)+f(x)=0, s.t. BCs., L 是微分算子。

1. FDM出現最早,也最符合人類直覺。把求解域離散為規則分佈的點data points , 然後通過無所不能的Taylor expansion進行恰當的合併同類項然後優雅地導出一個代數公式D*u_i來近似L*u(x),其中D*u_i只與x_i鄰域的data points和間距 h 有關。

因此,FDM的優缺點非常顯然:好處是直觀易懂,就是粗暴直接地近似L,當然還要近似f, 但同理。而缺點就是FDM的成功嚴重依賴data points的規則排布,尤其在高維問題中,要導出簡潔而高階精確的近似公式需要匹配的間距hx,hy,hz來cancel out 一些泰勒展開項。其次,規則的網格也不適合描述複雜的邊界情況。一句話來說,FDM的離散域太需要regulization了,不夠flexibility. 所以FDM只在大尺度,形狀規則的問題中廣泛應用,那就是流體。

2. FEM 的思路通過引入一個權函數w(x)讓PDE「弱」滿足。具體就是讓w*(L*u+f)在域上積分等於0,同時利用分部積分和高斯散度定理來降低關於u的微分算子L的階數,提高對w的微分階數。這是一個劃時代的idea,因為真實物理問題中,L往往是偶數項,所以這個「弱積分」+散度定理的處理不但降低了u的求導階數進而降低數值近似的光滑性要求,而且巧妙地讓w和u處於同樣的光滑性要求下。這樣巧妙的設計好處很多:1. 能用低階連續的插值函數來離散w和u(系統的複雜性是由w和u中含有最高階導數的那一個決定的);2. 如果L是偶數,則能用同一個插值函數來近似w和u, 而離散方程往往(半)正定且對稱。3. 使用緊集的插值函數(構建單元)讓FEM的離散方程有著和FDM一樣的稀疏性,但更能適合複雜的幾何形狀。4. 根據Peano kernel定理,可以容易地使用不同精度的插值函數來得出不同精度的FEM。5. 還有等參元的使用。

所以FEM和FDM區別其實很大,FDM如洪拳,上來就直接強解微分方程;FEM如太極,接力w打力u。

3. FVM是在FD框架下融入了一些FEM的思維。但由於FDM的特殊性,使用範圍比較狹窄,一般只適用於帶有散度(diffusion)的項(一階導數)。運用散度定理,把diffusion的體積積分上轉化為邊界積分,同樣起到了降低對u的光滑性要求。但由於沒有使用對偶函數w,而且只對散度項進行處理,FVM和FEM有著明顯的鴻溝,而更接近FDM。

總結:FDM是「strong form",在應用數學和流體中有著廣范的應用,有歷史原因,也因為易理解易實現,而且Taylor展開的框架容易對其進行穩定性和精度分析。FEM,「weak form",在橢圓方程,拋物方程中有著統治地位,簡單易用,理論框架、數學證明也非常成熟,甚至在流體能比FDM更有可為。FVM,"semi-weak form"就是一個特殊產物,甚至算不上和FDM、FEM同地位的一個方法體系。

當然,在處理固體力學中得衝擊大變形,fragmentation問題,FDM、FEM由於要求網格的關連而顯得無能為力。從80、90s開始發展的一套針對傳統方法缺陷的新體系,無網格法(meshfree or meshless)應運而生。此方法能採用strong form 或 weak form, 在某些問題是展現出強大的能力,在這裡就不展開了。有興趣的讀者可以按照關鍵字查看。

------------------------------------------------------------------------------------------------------

【毛穎博的回答(16票)】:

謝邀。

其實這三貨之間的關係很簡單,FDM(Finite Differencing Method)和FVM(Finite Volumn Method)是零階的FEM(Finite Element Method)。而在網格完全均勻且垂直的情況下,FDM完全等價於FVM。

容我慢慢道來。

已上圖為例。網格中的坐標表示網格中心點的編號,同時我們約定,每個面的編號,在相應方向上以前一個網格為準,如下圖 (假設上下向為y軸,左右向為x軸。同事請注意上下兩圖括號的區別,()表示網格中心,[ ]表示網格的面):

以網格中心式算法為例,假設我的目的是要update第(i , j)個網格中心處的梯度,那麼二階精度的FDM和FVM的算法依次如下:

FDM:

,

其中下標x,y表示方向。

FVM:

,

原理請參見高斯散度定理。CV表示control volumn。

因為是網格中心算法,所以我們只知道網格中心的數值,因而面上的數值須要按下列公式計算:

相信寫到這,題主應該差不多明白了吧,如果網格完全均勻且垂直,你會發現FVM和FDM的離散形式是完全吻合的。不信?自己把公式代進去算算就明白了。

什麼?你問我那FEM呢?FEM和上述兩者的不同,體現在:

其中Function可以使任何函數,而m,n據階次不同,可取不同的值,而不是僅僅限制在i+1,i-1這些與網格(i , j)相鄰的角標。

這也就是為什麼FDM和FVM被稱為零階或者低階的FEM。

另外,題主提到收斂性。收斂性標準只是一個估計,它是由五維流體特徵方程系統計算出來的安全值,實際上如果題主對線性代數和偏微分方程很熟悉,你完全可以自己算出一個收斂性標準,這個全看你希望你的code有多robust而已,如果你的收斂標準很保守,那麼相應的,你的收斂速度就會非常慢。這和是不是FDM或者FVM沒有關係。當然,這些東西的細節不在這個問題的範圍內,而且我也沒法在知乎教你怎麼算這個,太繁瑣了。

事實上,商用軟件中用的多是隱性算法,這樣就不需要收斂標準了,因為隱性算法一直都會收斂。原因嘛,商用軟件大部分用戶不懂啥是收斂性標準,他們只知道如果這個軟件跑了三次都沒收斂,那麼這個軟件就是garbage。競爭很激烈的。

TVD的話,我不說了,我當年花了近一整年學數學,就為了自己推算TVD的東西,一言兩語我真說不清楚。

就醬吧!

P.S:我其實特不愛答這種要寫好多公式的答案。即便問的是我的專業。希望知乎提高公式編輯的便捷程度。

【馬拉轟的回答(2票)】:

FDM和FEM是更廣泛的數值方法,FVM特別對有散度和通量的問題適用。

FDM是近似微分算符,FEM是近似解空間,從想法和分析手段上完全不同。當然,在某種特殊情況下最終形式是相同的。

【程迪的回答(1票)】:

本人很少寫程序,但是自認對固體的FEM,流體的FDM和FVM理論比較瞭解。

下面從數值方法的角度來說說。

  • 所有求解方程的數值方法第一核心是插值算子

簡單的說:有N個插值點

, 上面的函數值

你都知道了,插值算子I就是一個映射:把

映射成給定域上的u(x)函數。

另外,從實現方便的角度,通常這個插值為線性的,也就是這樣:

有了插值算子,同時插值又是線性的,我們就可以求出微分算子和積分算子。

比如:

微分算子:

積分算子:

方程假設是

的形式,

是微分算子(不一定是線性的),把上述微積分算子給倒騰進去,就可以得到:

形式的方程。

這樣,要求的連續解u(x)我們就可以用一堆離散的係數u_i表示出來了,只要我們把u_i求對了,問題就解決了~~,而對應的

就是所謂基函數 basis function或形函數shape function,這些基函數所張成的n維線性空間就是我們能求出來的解可能存在的空間,是u(x)實際可能存在的無窮維空間的一個子集,這個近似程度就是通常所說的n階精度。

推廣一點:這個空間點x_i可以是在計算域上的空間點,也可以是某個頻率空間上的一個頻率;函數值u_i可以是該點的函數值u(x = x_i),也可以是這點的導數(緊致格式?)或者譜空間的係數。

另外需要注意,方程的不同項,插值方法可以不一樣!根據不同項的特點,可以選取不同的插值方法取得更好的效果;FVM為例,Fluent和OpenFOAM的FVM,把點放在網格中心位置,可以認為採用的基函數是一階線性的大平板:-),這樣只要有中心點的值和中心點的梯度,就能重構出單元內的解,但是對於對流項和擴散項,可以採用其他的格式。

類似的,不同的離散單元,插值方法也可以不一樣!,比如上風格式upwind scheme,當地速度方向不一樣,採用的插值點也不一樣~~

同樣的,不同維度的插值方法也可以不一樣,比如時間和空間,不過文獻裡一般先對空間進行離散,時間算子

先不離散,把空間的搞清楚了,就成了一個超大型ODEs常微分方程組,接下來再玩Euler,龍格庫塔,隱式等問題。FVM和FEM都是空間離散方法。FDM可以離散時間。

甚至,多個計算步驟的插值方法也不一樣,插值算法也不一定能顯式地描述出來(Fluent的最小二乘法求梯度)~

反正只要是想要得到你手裡沒有的值,又沒有函數可以算,就得插一下~~

  • 上面只是達成解的離散,方程還是連續的,計算機還是沒法解。下面要把方程也給離散了,計算機才會玩~~這涉及到數值方法的另一個核心:投影,搞FEM的人叫加權余量法,玩FDM和FVM的我感覺還沒想這麼深入~~。其實就是把方程和一個試函數test function 即

    進行積分,得到一個數字,然後令其為0~~~:逼格高點兒的說法是把高維問題投影成一系列低維問題去解

這樣就可以把一個連續的方程,變成M個代數形式的方程,每個方程有N個未定的係數u_i

下面是一些細節:

假設L算子是線性的,u_i可以提出來,最終形式差不多是 A*u=b的線性代數矩陣形式。如果是非線性的,會有u_i的交叉相乘項,很麻煩。

如果phi和psi是正交的,並且L是線性的,那麼A就是對角矩陣(三對角、5對角之類的)~~u直接可以求出來。。。所以正交性一大好處是交叉項莫名其妙沒有了:-)

理論上,如果phi和psi一樣,對於自伴隨算子,矩陣A能搞成對稱的,

如果phi和psi能搞成算子自伴隨算子L的特徵函數,貌似可以達到A=I ==> x=b,直接求出來了。。。

如果試函數和基函數取成一樣,那麼這類方法叫Galerkin方法,好處是可以重複使用基函數~~

例子:最簡單的FDM,方程只要在x=x_i這些插值點上成立即可,psi_j(x) = delta(x),也就是狄拉克函數,這種方法又叫配點法,老簡單了~~;但是注意,對於配點法,投影點和插值點可以不一樣!

對於FVM,

....

對於FEM,更高級一點,真正是要玩積分的~~

  • 通量重構問題~

上述所謂討論的都是一個單元的情況,對於單純的FDM,反正玩配點,配遍整個計算域,把方程個數搞夠就行~但流體力學方程的三個基本性質導致CFD有額外的問題:1.非線性,動量方程對於速度u 存在u*grad(u)非線性,會出激波;2.對流性,密度溫度等物性隨著速度跑來跑去,跟下游沒啥關係; 3.守恆性,單元界面進出應該一樣。

方程進行體積分之後,利用Gauss公式可以把通量項精確地化為面積分,大家一般認為體積分難算,面積分好算,所以就都這麼幹了~可惜這麼幹的時候暴露了一個問題,兩個單元分別計算出的同一個公共界面的積分通量是不一樣的,這與守恆性是矛盾的。所以要進行界面通量的重構。

對於不那麼純粹的FDM,也有類似的問題,計算導數時插值點可以從上游多取幾個,也可以從下游多取幾個,同樣的,計算的對流通量

在構造方程中通量的微分

時又可以進行插值的選擇~~搞得大家頭大得不行~

對於FEM和FVM而言,情況還簡單點兒,一個界面兩側只有兩個單元,所以只要重構一個

就行了(對於FDM,還可以搞得更複雜)。這還對這個通量提出一個對稱性要求

一個簡單方法是兩邊平均一下算了,但是波形會被拉寬~,精度不高;而且由於非線性,這東西很不好搞~然後有大神就搞出一堆重構通量的格式和Riemann求解器之類的玩意兒~總之要把它搞對,並使得到的解的發展滿足一定的數學物理限制,比如很有名的TVD,單調,保單調等概念,就是對解的發展的一種限制:後面的速度再快也不穿越能跑到前面去。

  • 離題已經萬里了,回到題主的CFD算法的區別和聯繫,不同的數值方法教科書上的推導方法千奇百怪,但是可以歸結到這樣的框架下。

  1. 先看方程每一步算法用是怎麼插值
  2. 再看用了什麼樣的投影,用了什麼試函數。
  3. 對於CFD問題,還要看怎麼重構對流通量

比如Fluent,它用的FVM,投影的試函數是1。而非定常項在時間上根據階數取不同的階的多項式,空間上應該是取的線性基函數;後面的對流項首先也是假設基函數為線性,基於標量的Green-Gauss定理,用邊界面上的值重構出中心點的梯度,(但是此時邊界的標量值還不知道呢。。。又要通過邊界周圍的單元中心點插值來構造。。。)得到了中心點梯度之後,單元內就搞清楚了;再用界面兩側單元的中心點值和梯度,構造邊界的值,這個梯度在使用的時候還會受到Limiter的限制。構造完邊界的值之後,還要根據規則構造出通量Flux,最後帶到方程裡計算。。。

寫的太亂了,總結一下關鍵特點,FDM基函數是多項式,插值點是網格點,試函數是Dirac函數,投影點一般在半網格點;FVM通常形函數是線性的,但是額外有梯度限製器,試函數是1,通量還有重構;FEM最廣義,啥都有;

同時還有個額外的特點,FVM和FEM的空間刨分是不重合的很多單元,但是FDM如果按照包含的點來計算,是交錯的。所以並行需要用Ghost cell,交換的數據量大。

補充,FEM還可以在搞帶曲線/曲面邊界的問題~比如等參元把基函數當單元的變形形函數再用一遍~~

p.s.隨便轉載,我也懶得加參考文獻,cfd online wiki都有,FLUENT Theory Guide也很詳細~~

【知乎用戶的回答(0票)】:

對系統的處理方法不一樣 fem是在整體上質量守恆 但是對個體的點上不是 fvm是一定的質量守恆 但是不能很好處理和界面平行的流體 fdm最簡單實現 但是不好處理特別結構的系統

【StDawn的回答(0票)】:

這些方法能研究彩票中獎號碼分佈麼?

標籤:-流體力學 -計算流體力學(CFD)


相關資源:





給我留言