顯示算法(explicit method) VS 隱式算法(implicit method)

2021-02-19 CAE and CFD

        顯式(explicit)和隱式(implicit)這兩個詞在有限元分析中大家可能經常看到,特別是涉及到動力學分析時。但其實廣義的說他們分別對應著兩種不同的算法:顯式算法(explicit method)和隱式算法(implicit method)。所以不論在動力學或者靜力學中都有涉及到。

        我們都知道有限元分析FEA在計算微分方程(differential equations)時,由於計算本身的局限,比如計算機儲存的位數有限,以及方程本身的複雜性,計算機運用的是數值算法(numerical algorithm)來逼近真實解的。有限元分析中數值算法的基礎是歐拉法(Euler method),歐拉法又分為forward Euler method 和backward Euler method,這兩種方法被簡稱為顯式法(explicit method)和隱式法(implicit method)。


首先我們來看看這兩種算法的區別。

顯式算法(explicit method)(forward Euler method

考慮常微分方程:

初始條件:

設為每一步的時間步長, 在Tn時刻,. (n=0,1,2,3...),在T(n+1)時刻有:

所以在顯式算法中,T(n+1)時刻的值由T(n)時刻決定,也就是說當前時刻的值由上一時刻的值決定。

隱式算法(implicit method)(backward Euler method

考慮同一個方程,在T(n+1)時刻有:

所以在隱示算法中,T(n+1)時刻的值不光由T(n)時刻決定,還由當前時刻T(n+1)決定。也就是說當前時刻的值由上一時刻和當前時刻的值共同決定。隱式算法往往需要求解二次方程。

我們來看看一個具體事例:

設常微分方程:

根據上面的方法,對於顯示算法有:

得出:

對於隱式算法有:

導出二次方程:

求解得:

所以很明顯,在隱式算法中,要求得K+1時刻的值,就需要求解二次方程的根。

關於收斂性

顯式算法的過程(藍色為真實值)


隱式算法的過程(每個時間步長中,通過Newton–Raphson method算法不斷進行收斂迭代,直至接近真實值為止)

時間步長(time integration)的依賴性(時間變量只在動力學中涉及)

運用上面的方法,我們以方程為例,通過數值算法求得f(u)。當把時間步長取為1時,顯式(explicit)和隱式(implicit)的結果如下圖所示:

        可以看出,隱式算法是絕對收斂的,每一步都沒有偏離真實值,而由於時間步長取得很長,所以顯式算法的結果遠遠偏離了真實值。

        當把時間步縮小到0.05時,顯示算法的結果如下圖所示:

        可以看出,當把時間步取得很小時,顯示算法可以很接近真實值。

        上面主要講了隱式和顯式算法的差別,下面我們來看看這兩種方法在動力學分析中的運用和差別。

動力學分析(Dynamics Analysis)

        靜力學(static)分析不考慮質量/阻尼和時間,而動力學分析需要考慮系統阻尼和時間的變化。

        首先大家要知道有限元分析FEA的輸出是什麼,雖然我們可以從仿真後處理中得到很多的結果,如應力,應變,位移等等,但本質上,所有的物理量都是通過先計算出節點處的位移,然後導出應變,再通過應變根據材料力學的理論導出其它物理量的,這一點大家要記住。

        在有限元分析中,動力學分析的基本方程是由如下方程導出和決定的:

[M]{a} + [C]{v} + [K]{x} = {F}

其中[M]是質量矩陣,[C]為阻尼矩陣,[K]為剛度矩陣,a為加速度,v為速度,x為位移,{F}表示外力。如果我們把方程寫為導數的形式,則有:

所以這裡的加速度,速度和位移是彼此關聯的,這很有用。

        這個方程大家可能不陌生,在前面講到模態分析時提到過這個方程,當時說的模態分析是不需要考慮質量和阻尼的,所以方程也較簡單,只考慮剛度。剛度的導出大家可能不怎麼熟悉,剛度在有限元分析中佔有很重要的地位,要了解剛度的一些性質,大家可以閱讀我先前分享的資料(點擊連結:學習資源分享:科羅拉多州立大學有限元學習資料,第一章節就是主要講解剛度的)。

隱式動力學(explicit dynamic)

        在動力學分析中,隱式分析直接計算位移x,而要求得位移x,就需要對剛度矩陣K進行求逆(inversion),而計算機在進行矩陣求逆時,需要耗費大量時間和計算機內存。可能有人會問為什麼需要對剛度矩陣K求逆呢,學過線形代數的都知道,要求位移x,那麼我們需要對方程做如下變動:

而,所以有:

所以對剛度矩陣K求逆是必須的。

顯式動力學(explicit dynamic)

        在動力學分析中,顯式分析先計算加速度a,再通過積分算法分別導出速度v和位移x。比如一旦在時刻n求得了加速度,速度會在n+1/2時刻計算出,然後位移在n+1時刻求出(相當於一個時間步長),然後通過位移導出應變(strain),在通過應變導出應力(stress)。

        可能有人會問,和隱式動力學類似,要求得加速度a,不是一樣要對質量矩陣M求逆嗎,是的,但這裡M的導出遠遠比剛度矩陣簡單很多,而且M可以簡化為對角矩陣,所以對M不需要直接求逆,通過簡單的矩陣乘法就可以得出逆矩陣。

計算的效率

        在動力學分析中,顯式法和隱式法在計算時間上各有優缺點

適用範圍

雖然在計算效率上各有優勢,但總的來說,在動力學分析中,主要還是採用顯式算法,因為在動力學分析中,如頻率響應分析,響應譜分析等等,往往時間很短,要獲得較好的結果,需要取很短的時間步長來捕捉瞬時的響應,這時候顯示動力學就很有用,而且在計算時間上也具有較大優勢。

隱式算法主要還是用於時間周期較長的非線性分析(Nonlinear analysis),屬於靜力學分析的範疇,當然也包括動力學分析裡面特殊的準靜力分析(quasi-static)。

     

         靜力學分析中是不會用到顯式算法的,動力學分析中主要採用顯式算法(特別是響應時間很短的問題),當然也可以採用隱式算法,但需要選擇較為合適的時間步長,當時間步長取得合適時,拋開計算時間,兩種算法的結果是相差不大的,同一個問題大家可以兩種方法都試一試,但總的來說,動力學分析大多數問題還是採用顯示算法的。

顯式算法的例子:

物體以高速(比如2000m/s)落在一個平板上,交互時間為0.2秒時

飛機著陸時的瞬時響應

隱式算法的例子:

鈑金成型過程的非線性分析


相關焦點

  • @classmethod與@staticmethod的區別
    先來看一個簡單示例:class A(object):    def m1(self, n):        print("self:", self)    @classmethod    def m2(cls, n):        print("cls:", cls)    @staticmethod
  • Python 中 staticmethod 和 classmethod 原理探究
    如果能理解那邊描述符的使用方式,那也能很快理解本篇中的 staticmethod 和 classmethod 。他們的主要區別在於,函數的 傳參都是顯式傳遞的 而方法則方法中 傳參往往都會有隱式傳遞的,具體根據於調用方。例如示例中的 C().f 通過實例調用的方式會隱式傳遞 self數據。
  • Python中classmethod和staticmethod的區別
    一般實現書寫類結構體方法有三種,分別是實例方法(instancemethod)、classmethod、staticmethod。如果用一個代碼總結展示就是下面這樣。class MyClass(object):    def instancemethod(self,parameters)                pass    @classmethod        def classmethod(cls):                pass    @staticmethod        def staticmethod
  • 「含蓄的」是「implicit」還是「explicit」?
    但這些詞卻讓眾多剛接觸英語或是正在努力學習英語的小夥伴們很是頭疼~今天我們就一起來學習一組容易混淆的單詞「implicit」和「explicit」的不同以及用法~He likes to show his preferences in an implicit way.他喜歡用含蓄的方式來表現自己的喜好。
  • python面向對象中的self,cls,staticmethod,classmethod
    先給大家拜年,新年第一篇繼續我複習面向對象的知識,這次打算說說我疑惑挺久的self,cls,staticmethod,classmethod是幹嘛的
  • explicit 和 implicit,拼寫接近,意思不同
    explicit [ɪkˈsplɪsɪt] 和 implicit [ɪmˈplɪsɪt] 兩者拼寫很接近,但是意思完全不同,那麼如何區分它們呢?;直截了當的,不隱晦,不含糊的」,例如:I gave her very explicit directions about how to get here.
  • explicit 和 implicit,拼寫很接近,但意思完全不同
    explicit [ɪkˈsplɪsɪt] 和 implicit [ɪmˈplɪsɪt] 兩者拼寫很接近,但是意思完全不同,那麼如何區分它們呢
  • Explicit,一個容易被忽視的關鍵字
    class A{public:  A(){}     //聲明一個不帶參數的構造函數  A(int n)  //聲明一個帶參數的構造函數  {  value=n;  } private:  int value;};實際上,我們上面的構造函數的聲明中,省略了一個關鍵字implicit,意思是隱藏的,類構造函數在默認情況下聲明為implicit
  • Implicit Learning and Explicit Learning
    ImplicitLearning and Explicit Learning 教授講座中首先提到的是一組專業性的術語implicitlearning(內隱性學習)和explicitlearning(外顯性學習)。
  • Python的@staticmethod和@classmethod的作用與區別
    但是使用@staticmethod或@classmethod,就可以不需要實例化。所以@staticmethod或@classmethod作用:使用@staticmethod或@classmethod,就可以不需要實例化,直接類名.方法名()來調用。這有利於組織代碼,把某些應該屬於某個類的函數給放到那個類裡去,同時有利於命名空間的整潔。
  • python:裝飾器@classmethod和@staticmethod
    類定義體中:    含@classmethod裝飾的函數稱為類方法,它改變了調用方法的方式,因此類方法的第一個參數是類本身,而不是實例對象。    含@staticmethod裝飾的函數稱為靜態方法,它實際就是一個放在類中的普通函數,但是跟類中的東西又毫無關聯,只是碰巧在類的定義體中。
  • 我新開的店為什麼payment method顯示的是seller ID?
    我新開的店為什麼payment method顯示的是seller ID? 我是新開店,其他站點也開通了,但是還沒綁定收款帳號,但是我從後臺看到的payment method上顯示的是seller ID,正常的不是顯示的都是綁定的payoneer的帳號名嗎,怎麼現在變成了seller id?另外,怎麼才能看到綁定的payoneer的帳號名?
  • Python,你真的會使用 staticmethod 和 classmethod 嗎?
    @staticmethod裝飾器 @staticmethod 修飾的方法稱為:靜態方法,和普通的函數沒有什麼區別下面將聊聊實際項目中幾種應用場景1、要調用一個靜態方法,一般使用形式是:「 類名.方法名() 」class Web(object):    @staticmethod    def foo_staticmethod():
  • 教程 | matlab實現kmeans聚類算法
    kmeans聚類算法是一種簡單實用的聚類算法,matlab自帶函數kmeans可直接對數據進行kmeans聚類。
  • Python 中的函數與方法 以及 Bound Method 和 Unbound Method
    method(方法) —— A function which is defined inside a class body.Ifcalled as an attribute of an instance of that class, the methodwill get the instance object as its first argument (which isusually called self).
  • 如何理解 Python 之禪:Explicit is better than implicit?
    作者:三點水來源:https://lotabout.me/2021/Explicit-is-Better-than-implicit「Explicit is better than implicit」 是 The Zen of
  • 3分鐘教會你選擇合適的圖像識別算法
    值得注意的是,在TemplateMatching算法的執行結果裡面,有一個'confidence':0.4422764182090759,這個其實就是算法的可信度。之前在「截圖識別成功率太低,究竟該如何補救」這篇推文中,我們介紹過如何合理調整闕值來提高圖片識別成功率 ,那個閾值實際上是算法執行成功之後的可信度閾值(默認為0.7),如果算法識別的可信度(也就是confidence)超過了我們設置的閾值,就會認為識別成功,否則認為失敗。
  • Have a method to your madness
    madness「You may have a method to your madness and know where everything is.Could you explain 「have a method to your madness」?
  • 機器學習的類型及其算法詳解
    (ps :搬運於外網,屬於機器學習的算法科普,基礎型哦~)作者主要從以下3大類別介紹了機器學習的幾大算法2.Polynomial RegressionPolynomial regression it is a form of regression analysis in which the relationship between the observation and the outcome is modeled as an nth degree polynomial, the method