
發布
注冊
/
登錄列主元求解方程組求解的案例
C語言實現方程組求解 - 列主元高斯消去法和LU分解
首先是頭文件數據信息
然后是要進行基本操作的函數文件:
==> 這里調用的上三角形方程組求解的實現過程如下:
主函數的測試案例為:
==> 下面進行矩陣的LU分解,進而求解方程組.
==> 關于下三角形方程組求解函數試下如下:
==> 這里的兩個工具類函數,如下所示:
==>
高斯消去的計算結果為:
LU分解的計算結果為:
==> 標準數據為:
標準結果為:
==> 我們所完成的兩種方法的計算結果是正確的。
支付寶贊助
微信:
Python 實現方程組的直接求解,用于求解力/位移方程組 ¥3.33
本程序實現了三種方法,分別是列主元高斯消去法,直接三角分解法,列主元三角分解法
計算結果展示:
a. 列主元高斯消去法
b. 直接三角分解法
c. 列主元三角分解法求解
【數值算法】系數矩陣非對稱時,線性方程組如何求解?-穩定雙共軛梯度法(Bicgstab)求解線性方程組
enddo
write(*,*)"the solution of equation:"
write(*,"(es18.8)")x
end subroutine bicgstab
依據上述過程編寫程序,計算前述非對稱矩陣線性方程組求解結果:
采用matlab求解該方程組的解:
通過對比可知11次迭代已經獲得即為準確的結果。實際上,對于該方法也可以通過一定的預處理方式,使得其所需要的迭代次數更少。
以上,就是穩定雙共軛梯度法求解線性方程組的內容,感謝您的閱讀!
歡迎關注公眾號 有限元術
展開 C語言實現方程組求解-指針操作
在有限元的計算過程中,當我們得出剛度矩陣之后,接下來是帶入邊界條件來求解方程組中的未知量。
1. 求解方程組中的未知量的具體方式分直接法和迭代法,一般在有限元計算過程中都采用的是迭代法,但是對于那些很小的問題便可以采用直接法來直接得到。
2. 本次主要討論的是列主元高斯消去法。
==》 順道吐槽一下這個自帶的插入代碼的功能,很差勁。

轉貼:變參數非線性方程組的求解!
變參數非線性方程組的求解!
對于求解非線性方程組一般用fsolve命令就可以了,但是對于方程組中某一系數是變化的,該怎么求呢?
%定義方程組如下,其中k為變量
function F = myfun(x,k)
H=0.32;
Pc0=0.23;W=0.18;
F=[Pc0+H*(1+1.5*(x(1)/W-1)-0.5*(x(1)/W-1)^3)-x(2);
x(1)-k*sqrt(x(2))];
%求解過程
H=0.32;
Pc0=0.23;W=0.18;
x0 = [2*W; Pc0+2*H]; % 取初值
options = optimset('Display','off');
k=0:0.01:1; % 變量取值范圍[0 1]
for i=1:1:length(k)
kk=k(i);
x = fsolve(@(x) myfun(x,kk), x0, options);%求解非線性方程組
x1(i)=x(1);
x2(i)=x(2);
end
plot(k,x1,'-b',k,x2,'-r');
xlabel('k')
legend('x1','x2')
[ 本帖最后由 studyboy 于 2006-7-30 17:38 編輯 ]
圖片附件: k-x1.x2.bmp (2006-7-5 23:07, 689.12 K)
展開 scipy求解常微分方程組
Scipy求解常微分方程組有scipy.integrate.solve_ivp和scipy.integrate.odeint,后者是較老的版本主要是采用 FORTRAN 的odepack庫里面的lsoda 方法,而前者是后面更新的函數,支持的方法也更多,按照官方的文檔介紹大致有如下的方法。
【數值算法】共軛梯度法求解線性方程組
在有限元程序開發中,線性方程組的求解是一個重要組成部分。在百萬自由度大規模計算的情況下,線性方程組的高效快速求解對整個求解器的計算效率有著至關重要的作用。無論實際上計算的是線性問題,還是各種非線性問題,最終都需要落實到線性方程組的求解上去。非線性方程組的求解實際上往往就是多次求解線性方程組。
目前,線性方程組的求解主要分為直接法和迭代法兩種。
在之前的文章[數值算法與編程]高斯消去法中,我們討論的高斯消去法就是直接法的一種。而本文即將討論的共軛梯度法,是迭代法的一種,并且,其屬于目前求解對稱線性方程組的主要迭代方法。各大商業有限元軟件,在面臨對稱線性方程組的求解時幾乎都會選用各種變化形式的共軛梯度法進行求解。
共軛梯度法的具體原理和算法如下:
假定要求解的對稱線性方程組是:
其中,A是對稱正定的系數矩陣。
則實際上待求的解也是方程
取得最小值的時候的解。
求該方程的最小值的常見方法是最速下降法,該方法算法偽代碼如下:
該方法實際上是沿著負梯度方向進行搜索,直至殘量接近0,較為簡便,但是在條件數很大時,該方法收斂很慢。
展開 如何采用simulink求解常微分方程組
通常來說,求解一個系統的話采用常微分方程組去做。前面也有采用scipy進行了常微分方程組的求解簡單介紹,當然需要用到Python。其實完全可以不用任何代碼,只用一些simulink模塊以搭積木的形式完成這個過程,而且還會方便很多。下面就介紹一下相關的方法。
所用到的核心模塊其實就是integrate模塊,只需要啟動matlab打開simulink然后脫出一個該模塊就可以了。
首先以如下方程為例,假設初始值為0,求解區間為【0-10】
采用如下的方式搭建
simulink中的模塊求解的結果
當然這個有點簡單,來一個稍微復雜一點的
計算過程的模塊搭建如下
simulink中的模塊
計算結果如下
simulink中求解結果
當然完全完全可以求解更加復雜的問題,比如以下面的一個方程組為例
那么他的搭建模塊如下所示
方程組越大,則模塊會越復雜,一般可以把一部分單獨拿出來做一些封裝,然后把這個作為自己的模塊老使用,作為演示,我這里也有一個例子,就是pemfc燃料電池的例子,方程組的關系如下。
pemfc的系統所用到的方程
那么對應的模塊搭建如下,可見對于較大的模型搭建還是比較難得
展開 大型稀疏線性方程組求解技術——工業仿真的底層核心
背景
在工業仿真領域,對各種現實世界的問題進行數值模擬時,如流體動力學分析、電磁場仿真、結構力學應力應變分析等,其控制方程通常是偏微分方程組,在經過不同方法的隱式離散之后最終都可轉化為大型稀疏線性方程組。隨著人們對計算精度要求的不斷提高,方程組的階數也從上千階、幾十萬階提高到百萬、千萬階甚至更高,所需的計算量以及存儲需求也隨之迅速膨脹。根據一般經驗,方程組求解時間會占總計算時間的70%以上,往往是整個計算過程中的性能瓶頸。如果說求解器是工業CAE軟件的核心模塊,那么大型稀疏線性方程組的求解技術將毫無疑問是底層求解器的核心。
NASA翼型網格經過離散得到的稀疏矩陣(素材來源于網絡)
方法
眾所周知,稀疏線性方程組的求解方法可以分為直接法和迭代法 ,兩類方法各有優劣,特點比較如下:
迭代法[1]:
對于不同類型稀疏矩陣表現差異較大,存在收斂性與收斂速度問題,催生了許多預處理技術(Preconditioners);
對原矩陣的編輯很少,SpMV(Sparse matrix-vector multiplication)是其核心運算;
內存需求小,求解速度較快,算法復雜度低;
較易實現并行化。
直接法[2]:
通用、穩定;通過前后處理,能夠保證計算的收斂性與精度;
對原矩陣的編輯多(分解、排序、縮放等);
內存需求大,求解速度慢,算法復雜度更高;
并行度有限。
其中迭代法的種類很多,可以分為定常(Stationary)迭代法與非定常迭代法[3]。
展開 單元細分源代碼和線性方程組求解器
最近寫程序,需要一個高效簡單的線性方程組求解器,就在別人的基礎上改造了一套代碼。
這套有兩個版本:fortran/C++,主要用于求解稀疏對稱矩陣;
C++ version 來源于網絡。 fortran version 由Esimulate改寫。 fortran version 的輸入文件為C++ version\LDL\Matrix 中任意文件,名字固定為A01。
ldlsolver.rar
大規模稀疏矩陣線性方程組求解可以有多快!
對于工業軟件研發尤其是CAE軟件研發來說,線性方程組的求解精度和速度較為重要,在方程組規模上來以后,以Krylov子空間為基礎的PCG,Bicgstab,Gmres等方法相對于直接法在求解效率和精度控制上有較大優勢。這也是abaqus等商業軟件在對于規模較大的模型時采用迭代法求解通常會比直接法求解更快的其中一個原因。
以自由度數為41w的如下分布的稀疏矩陣為例,
該稀疏矩陣形成的系數方程組在matlab中采用直接求解為1.5s,采用一定預處理下的PCG求解時間為0.55s。
用筆者自行開發的稀疏矩陣PCG求解器運行此算例,方程組求解時間為0.628s。
此時,整個程序的運行時間瓶頸實際上并不在方程求解,而在于從文件中讀取稀疏矩陣對應的數據。一般情況下采用fscanf讀取數據會快于用fstream讀取。改用fscanf讀取數據后,程序總運行時間從原來的16s變為9s。
【完】
歡迎關注公眾號 有限元術
一個講有限元技術的公眾號
展開 
CFD學習:用時域有限差分法求解麥克斯韋方程組
要點
FDTD技術直接離散化麥克斯韋方程的時域偏微分形式。
頻域有限差分(FDFD)源自FDTD。
時域有限差分法是求解麥克斯韋方程組的最先進方法,尤其是在復雜幾何形狀中。
FDTD方法可以解決與天線相關的問題
我們經常使用基于電流、電荷和場變化產生的電場和磁場的電器或設備。為了以數學方式表達所產生的電場和磁場,使用了麥克斯韋方程,并對電磁系統進行了數值建模。
為了求解描述電磁場的方程,使用了各種數值技術。時域有限差分(FDTD)方法是解決電磁問題最流行的技術。FDTD 方法解決了與電介質、天線、微帶電路以及暴露于輻射的人體電磁吸收相關的問題。在本文中,我們將深入探討 FDTD 方法。
時域有限差分 (FDTD) 方法背后的理論
FDTD方法是一種全波數值方法。該技術直接離散化麥克斯韋方程組的時域偏微分形式。為了解決電磁問題,我們的想法是在時間和空間上使用中心差分近似來離散麥克斯韋方程組。
FDTD 技術首先由 KS Yee 通過 Yee 離散方案引入計算電磁學中。在 Yee 開發的方案中,電場和磁場分量在 3 維 (3D) 空間和時間中交錯。在所形成的3D空間中,物理電磁波傳播由法拉第定律和安培定律等值線的互連陣列來表示。使用 FDTD 技術解決電磁問題不需要大量先驗知識,因為 Yee 方案方法易于使用且用途廣泛。
電磁分析和 FDTD 方法
FDTD 的簡單性、多功能性和靈活性使其在計算電磁應用中廣受歡迎。由于 FDTD 方法是基于體積的,因此對于復雜結構和介質的建模非常有效,尤其是與有限元方法(FEM) 和矩量方法 (MOM) 相比。
FDTD 是一種時域方法。
展開 技術分享︱大型稀疏線性方程組求解技術——工業仿真的底層核心
一、背景
在工業仿真領域,對各種現實世界的問題進行數值模擬時,如流體動力學分析、電磁場仿真、結構力學應力應變分析等,其控制方程通常是偏微分方程組,在經過不同方法的隱式離散之后最終都可轉化為大型稀疏線性方程組。隨著人們對計算精度要求的不斷提高,方程組的階數也從上千階、幾十萬階提高到百萬、千萬階甚至更高,所需的計算量以及存儲需求也隨之迅速膨脹。根據一般經驗,方程組求解時間會占總計算時間的70%以上,往往是整個計算過程中的性能瓶頸。如果說求解器是工業CAE軟件的核心模塊,那么大型稀疏線性方程組的求解技術將毫無疑問是底層求解器的核心。
NASA翼型網格經過離散得到的稀疏矩陣(素材來源于網絡)
二、方法
眾所周知,稀疏線性方程組的求解方法可以分為直接法和迭代法 ,兩類方法各有優劣,特點比較如下:
迭代法[1]:
對于不同類型稀疏矩陣表現差異較大,存在收斂性與收斂速度問題,催生了許多預處理技術(Preconditioners);
對原矩陣的編輯很少,SpMV(Sparse matrix-vector multiplication)是其核心運算;
內存需求小,求解速度較快,算法復雜度低;
較易實現并行化。
直接法[2]:
通用、穩定;通過前后處理,能夠保證計算的收斂性與精度;
對原矩陣的編輯多(分解、排序、縮放等);
內存需求大,求解速度慢,算法復雜度更高;
并行度有限。
其中迭代法的種類很多,可以分為定常(Stationary)迭代法與非定常迭代法[3]。
展開 Python 求解偏微分方程 1D下的熱傳導方程 ¥2.22
Python 求解偏微分方程 1D下的熱傳導方程
偏微分方程的數值求解 ¥66
用差分法求解了這個方程。
希望可以和“格子boltzmann方法”研究方向的學者們探討探討。
付費內容為差分法求解的詳細推導步驟和代碼。