計算機數值模擬方法的局限?
相比於理論方法、實驗方法。
如果只說局限的話,那就是這些了:
1、計算機數值模擬不論用多麼真實的假設,都是基於某個理論框架或者某些假設的,都不是真正的現實,不能代替實驗的作用。2、計算模擬具有全部其所基於的理論框架以及假設的局限性。比如分子動力學模擬,基於牛頓力學、電磁學和分子的彈簧模型。嗯,於是求認真的物理學家就會批評說「你做分子運動不考慮量子力學這結果會對么?」。如果理論模型本身或者假設有問題,模擬結果自然也不會準確。
3、計算模擬算的是近似的數值解,而不是精確解。精度會受演算法以及計算機數字存儲的精度影響。如果演算法中誤差控制做得好,問題不大,但如果控制不好,可能結果會南轅北轍。比如用前向歐拉法解微分方程,結果很可能導致誤差越來越大最後發散掉。當然,一般做純的常微分方程模型時,我們會選用隱式Rosenbrock演算法,不但有4階的精度,而且能處理剛性方程……
4、因為計算機模擬算的是數值解,所以往往僅僅是某種特定的條件/參數選擇下的具體的解,沒有解析解那樣具有普遍性,也難以從中看出與某些變數的全局的依賴關係。
5、bug難以調試。如果自己寫程序,而且計算模擬規模很大,其中程序寫錯一點點的可能性會大大增加。這種bug非常隱蔽,非常難以檢查出。比如某個小量不慎被乘以2,不是語言錯誤不是邏輯錯誤,既不會報錯,結果也看不出明顯區別。直到在某個時候你發現程序結果和預期差很遠,或許才會意識到之前算的都是錯的。
當然優點甚至說不得不做模擬的理由也有很多:
1、計算機模擬比實驗便宜。實驗可能用到極其昂貴的材料,不敢浪費,或者實驗花費時間太長,有可能會需要先做模擬來找出合適的實驗條件。2、計算機模擬比實驗乾淨。實驗常常可能有意料之外的因素在起作用,甚至有些因素是無法取出的。而模擬加入的因素是人為的,所以人可以更清楚地研究各個因素對結果的作用。
3、解析解壓根算不出來或沒有有限形式時,使用數值模擬更容易分析。比如三體問題(以及絕大多數非線性微分方程系統)是沒有有限形式的解析解的,這種時候的分析時常需要求助計算機模擬。
演算法我沒當成問題……其實做模擬時演算法很重要,如果演算法沒選好,模擬時間、誤差、計算開銷都會是問題……不過,大多數問題總能找到演算法的,何況很多經典問題已經有非常成熟的演算法甚至是軟體,這一點還是不用擔憂的……數值模擬,或者叫做模擬,作為研究問題的手段並不是一種獨立的方法,而是要與理論、實驗相結合才能起作用的。
要利用數值模擬的方法來研究一個問題的過程,可以粗略的分為這樣幾個步驟:
1. 由實際的問題簡化出物理模型;2. 由物理模型得到數學模型;
3. 對得到的數學模型進行分析、化簡;4. 利用數值方法對數學模型進行計算,得到結果;5. 對數值結果進行數據處理、分析;6. 用實驗的結果驗證從1-5步得到的結果。在解決實際問題時,能夠完整的按照以上流程走一遍的幾乎沒有。有些問題,例如金融、運籌學,就沒有物理模型,直接建立的是數學模型;有的問題太複雜,沒有得到可用的物理模型,這類問題通常直接做實驗而不用數值模擬;有的問題太過理想化,最終用於計算的模型與實際問題相差太多,實驗條件達不到,所以沒有實驗。
在1-6步中,1-3屬於理論分析,4、5是數值模擬,6是實驗。這三個部分會相互影響,各部分不是獨立的進行的。理論部分會需要按照數值模擬所能採取的手段來進行,因為有的數學問題有成熟的數值方法,有的數學問題的數值計算相當困難。從理論分析中得到的「壞」的數學模型會直接導致數值模擬的結果不理想。而實驗也會影響數值模擬的部分,因為有的實驗做不出來,數值模擬的數學模型就只能按照能做的實驗來建立。比如航天器正常的工作狀態是真空無重力,而地面上只能做有空氣阻力、有重力的實驗,因此數值模擬的對象就該是有空氣阻力有重力的模型,雖然這時候無摩擦無重力的數學模型可以建立而且比有重力有空氣阻力的模型更簡單。如果實驗的對象比需要研究的問題更複雜,那麼數值結果和實驗結果還可以接受;但是如果實驗的對象比實際問題簡單,那麼其結果是否可用就完全不是理論-數值-實驗這套方法可以解決的了。
這1-5步中每一步都會引起最終結果與原問題的差別:在簡化得到物理模型的時候很多次要因素就被忽略了,這是非常必要的否則得到的數學模型會非常複雜,但是某一因素可以被忽略的理由是否始終成立並不是理論本身能解決的問題,這要依靠大量的實踐才能確定忽略某因素的合理性。在從物理模型到數學模型的過程中也可能出現了簡化,例如用線性的數學模型描述非線性的物理問題、用插值的方法去逼近一條曲線、用頻域分析代替時域的過程中對高頻的捨棄或者濾波。對數學模型的簡化主要包括局部的線性化、對高階項的丟棄等等。在數值計算的過程中除了各種誤差的引入之外,還可能出現演算法的失穩,例如對於剛性微分方程一般的顯示積分方法就會失效;即使模型正確,所用數值方法正確但結果也不一定就滿足要求,還拿常微分方程做例子:天體力學的問題通常需要用保結構演算法(保辛),而通常的演算法都是不保結構的。數值計算結果的處理其實也是一個比較重要的問題,現在流行的是數值計算可視化;而對結果的分析也比較麻煩,很多時候即使計算結果是可靠的,但也會搞不清結果是偏大還是偏小。
結論就是:數值模擬失敗的原因很多,可能是理論部分給出的模型就有問題,可能是實驗要求的條件在建模時沒有得到滿足;而僅僅是數值模擬本身也並不是簡單的用計算機做計算,演算法的問題、數據處理的問題都可能導致數值模擬的結果不可靠。要利用數值模擬來解決問題,必須對原問題有足夠的理解甚至有實際操作的經驗,需要對相關理論比較熟悉,最後才是對數值模擬技術的掌握。
補充:很多問題的數值模擬問題都有成熟商用軟體,以有限元為例:ANSYS、ABAQUS、ADINA等等。在國內,通常這些軟體都被工程師當做黑箱來使用,計算結果大部分是錯的,但問題通常出在對模型的簡化不合理以及對軟體的操作錯誤,並不能說數值模擬的方法本身有問題。
1,理論限制,模擬作為理論方法的近似數值實現,理論搞不定的問題模擬也搞不定,比如非線性模態2,數值限制,通過解方程組獲取結果的時候,會遇到數值求解方法方面的困難,有可能得到錯誤的結果(數值分析里N多例子),或者長時間模擬上誤差累計明顯影響有效解。比如長時間振動的相位模擬的,或者天氣預報這種,即使初始條件邊界條件完美無缺,也無法得到長期的準確結果。3,程序限制,很多模擬軟體為了求解效率,對理論的實現上做了很多簡化,所以可能需要的一些參數類型或者方程形成方式在商用軟體上是沒有的或者需要自己寫子程序補充。4,和理論方法實驗方法一樣,需要專業上的能力才能做好。
正好前段時間寫論文用到,也說一下我自己的理解。我用的岩土方向的數值模擬軟體,就使用感受而言,大致有以下幾點:1、幾何模型概化的精度問題;2、邊界條件和初始應力場的問題;3、本構模型匹配問題;
4、計算結果怎麼使用的問題。
第一個幾何模型的概化,牽涉到複雜地質體的時候,這個很難辦,而且還要考慮模型尺度、單元類型、網格劃分等等,要想完全反應現實情況,幾乎不可能;第二個邊界條件和初始應力場,邊界條件基本上都是自己參考實際情況施加的,但本身模型已經經歷過一次概化,而施加的邊界條件,基本不可能跟實際情況一致。另外初始應力場也是一個大麻煩,通過有限數據回歸反演出來的東西,雖然都做的又相關性分析,但始終感覺不盡如人意。第三個本構模型,這個問題就更大了,即便成熟的商業軟體,內置的本構模型也是原來的經典模型,對於複雜地質體來說,怎麼賦本構模型,本構模型能不能描述這種材料的特性,怕是很少有人敢打包票。第四個計算結果,根據不同的計算理論,計算結果也是有一定差異的,其收斂標準如果細細琢磨,其中也有值得商榷的地方。還有就是計算結果的使用,什麼結果能反應已知的現象或你本身想模擬的效果,這個綜合計算得到的各類數據,怕是也比較頭大,而且各類數據中彼此衝突的部分,怎麼解釋,是由什麼原因造成的,比較無解。總之,相較於理論方法,這個我接觸不多,不敢妄言。相較於實驗,數值模擬只能給出一個定性判斷,量化的東西都不怎麼可信。私以為現階段數值模擬只能作為一種輔助手段,起驗證作用。補充一點,你所建立的有限元模型的受力,邊界條件等都是依據你個人的經驗,實際上與實際的也許並不一致,導致結果與實際有誤差,而判斷有限元計算結果是否可靠很多時候靠的是經驗,所以很多新人在很短的時間內就能建立有限元模型,但是他無法判斷自己的計算結果是否正確
推薦閱讀:
※你對計算機科學與技術(CS)專業的認識是怎樣的?
※非計算機專業,有一點計算機基礎需要一個學習路線求推薦?
※美國IT巨頭為何強烈抨擊CISA《網路安全信息共享法案》?
※如果想系統地學習計算機專業課程,看斯坦福大學計算機科學類公開課可以嗎?具體學習的順序應該是怎樣的?