有限元方法軟件scikit-fem的兩個(gè)例子
最近在使用有限元方法。有限元軟件有很多,最出名的應(yīng)該是fenics,它功能非常多,功能包裝得也很好,使用方便。唯一的缺點(diǎn)是太大了,如果只是寫個(gè)小軟件去安裝它就顯得非常臃腫。想象一下,你使用外部庫比你自身的程序大的多,而這個(gè)外部庫還是不常用的。fenics在wsl上還不太好安裝。因?yàn)閣indows下認(rèn)為兩個(gè)名字相同但大小寫不同的文件是同一文件,但安裝fenics時(shí)需要安裝一個(gè)和已有庫同名的軟件包,所以就安裝不上。后來找來找去找到一個(gè)名為scikit-fem的包。它很小,看它官網(wǎng)上幫助文檔發(fā)現(xiàn)也能解很多問題。但缺點(diǎn)是這幫助文檔寫的太簡略了!有好多代碼和函數(shù)需要猜它什么意思。這了記錄兩個(gè)典型例子,可能會(huì)對使用scikit-fem的人有所幫助。
一維波動(dòng)方程
該例子是ex44.py中的例子。對于方程,它需要轉(zhuǎn)化成一個(gè)一階方程組求解。所以這個(gè)例子對于求解方程組也很有幫助。
使用Crank-Nicolson差分格式
把其中第二個(gè)方程轉(zhuǎn)化成變分形式(第一個(gè)方程不用轉(zhuǎn)化,因?yàn)闆]有導(dǎo)數(shù)項(xiàng)),并整理得到
現(xiàn)在看如下代碼塊
可以看到矩陣A和B的形式分別為
分別對應(yīng)上面推導(dǎo)公式的右端和左端。時(shí)間t^k時(shí)刻的u乘以B,得到Bu^k,然后求解Au^{k+1} = Bu^k,得到u^{k+1}。
2. 非線性方程
?非線性方程轉(zhuǎn)化成變分形式會(huì)得到非線性泛函。此時(shí)把用基組展開的試探函數(shù)帶入到變分形式中將得到關(guān)于展開系數(shù)的非線性方程。此時(shí)用牛頓迭代法去求解即可。在使用scikit-fem時(shí),我們需要把變分形式線性化交給程序求解。一個(gè)泛函泛函導(dǎo)數(shù)的定義為
引入?yún)?shù)t是為了能和普通函數(shù)求導(dǎo)一樣求出泛函導(dǎo)數(shù),其實(shí)是不必要的。這里選用的例子是ex10.py。對于極小曲面問題(幫助文檔里寫錯(cuò)了,掉了根號)
它的變分形式為
為了求解泛函導(dǎo)數(shù),把如下泛函在t = 0處展開到一階(為了方便省略積分號)
注意這里使用了
當(dāng)t趨于0時(shí)
看ex10.py中的代碼塊
這里w = p['prev']就是前一步的解,即公式中的u。代碼中的u則是上式中的,
??梢钥吹絁acobian恰好是和推導(dǎo)得到的泛函導(dǎo)數(shù)相對應(yīng)。