最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

手動(dòng)實(shí)現(xiàn)用有限元方法求解一維方程

2023-07-15 10:45 作者:quantumtopology  | 我要投稿

上次專欄寫了scikit-fem的兩個(gè)例子。但隨著后續(xù)使用發(fā)現(xiàn),這個(gè)軟件包用起來也相當(dāng)不方便,最大的問題還是出在文檔不完整。我嘗試求解一個(gè)向量值的方程(這個(gè)專欄)就會(huì)講,但嘗試了好久也沒搞清楚在scikit-fem中要怎么實(shí)現(xiàn)。最后在github上問作者,他寫的代碼用到的是這個(gè)包中還處于試驗(yàn)階段的模塊NonlinearForm,還要依賴外部軟件包autograd,于是我瞬間就不想用了??。后來想想,其實(shí)一維方程解起來并不麻煩。有限元方法麻煩的是在高維以及高階基函數(shù)的情形,此時(shí)需要規(guī)劃產(chǎn)生的線性方程組矩陣元的排列順序。因?yàn)槲矣玫降闹挥幸痪S情形,那為什么不自己寫呢。

  1. 簡(jiǎn)單的擴(kuò)散方程

    下面我們求解方程

    %5Cfrac%7B%5Cpartial%20u%7D%7B%5Cpartial%20t%7D%20%3D%20%5Cfrac%7B%5Cpartial%5E2%20u%7D%7B%5Cpartial%20x%5E2%7D%2C%5Cquad%5Cfrac%7B%5Cpartial%20u%7D%7B%5Cpartial%20x%7D(x%20%3D%200)%20%3D%200.05%2C%5Cquad%20u(1%2C%20t)%20%3D%201.0

    初始條件為u=1。

使用向后歐拉公式:

u%5E%7Bk%2B1%7D%20-%20u%5Ek%20%3D%20%5CDelta%20t%20%5Cfrac%7B%5Cpartial%5E2%20u%5E%7Bk%2B1%7D%7D%7B%5Cpartial%20x%5E2%7D

兩邊同時(shí)乘以$v$,再積分得到變分形式

%5Cint%20u%5E%7Bk%2B1%7D%20v%20%2B%20%5CDelta%20t%20%5Cint%20%5Cfrac%7B%5Cpartial%20u%5E%7Bk%2B1%7D%7D%7B%5Cpartial%20x%7D%5Cfrac%7B%5Cpartial%20v%7D%7B%5Cpartial%20x%7D%20%3D%20%5Cint%20u%5Ek%20v%20-%200.05%5CDelta%20t%20v(0)

一般trial function和test function取成一樣的基函數(shù),注意只有當(dāng)test function v%20%3D%20%5Cvarphi_0(x)時(shí),v(0)%5Cneq%200,所以-0.05%5CDelta%20t%20v(0)這一項(xiàng)只出現(xiàn)在第一個(gè)方程里。

%5Csum%20C_i%5E%7Bk%2B1%7D%20%5Cleft(%5Cint%20%5Cvarphi_i%20%5Cvarphi_j%20%2B%20%5CDelta%20t%20%5Cint%20%5Cpartial_x%5Cvarphi_i%20%5Cpartial_x%5Cvarphi_j%5Cright)%20%3D%20-0.05%5CDelta%20t%20v(0)%2B%20%5Csum%20C_i%5Ek%20%5Cint%20%5Cvarphi_i%20%5Cvarphi_j

我們可以先計(jì)算出 %5Cint%20%5Cvarphi_i%20%5Cvarphi_j%5Cint%20%5Cpartial_x%5Cvarphi_i%20%5Cpartial_x%5Cvarphi_j的矩陣然后求解。注意到,因?yàn)橛疫吔鐥l件是不需要求解的,所以未知數(shù)的個(gè)數(shù)是n個(gè),從C0到C(n-1)。

我們使用一維的線性元。假設(shè)把區(qū)間分解成0%20%3D%20x_0%20%3C%20x_1%20%3C%20%5Ccdots%20%3C%20x_%7Bn-1%7D%20%3C%20x_n%20%3D%20L。則相應(yīng)的基函數(shù)為

%5Cvarphi_0%20%3D%20%0A%20%20%20%20%5Cbegin%7Bcases%7D%0A%20%20%20%20%20%20%20%201%20-%20(x%20-%20x_0)%2Fh_1%2C%20%5Cquad%20x%20%5Cin%20%5Bx_0%2C%20x_1%5D%20%5C%5C%0A%20%20%20%20%20%20%20%200%2C%20%5Cquad%20%5Ctext%7Belse%7D%0A%20%20%20%20%5Cend%7Bcases%7D

%5Cvarphi_i%20%3D%20%0A%20%20%20%20%5Cbegin%7Bcases%7D%0A%20%20%20%20%20%20%20%201%20%2B%20(x%20-%20x_i)%2Fh_i%2C%20%5Cquad%20x%20%5Cin%20%5Bx_%7Bi-1%7D%2C%20x_i%5D%20%5C%5C%20%0A%20%20%20%20%20%20%20%201%20-%20(x%20-%20x_i)%2Fh_%7Bi%2B1%7D%2C%5Cquad%20x%20%5Cin%20%5Bx_i%2C%20x_%7Bi%2B1%7D%5D%20%5C%5C%0A%20%20%20%20%20%20%20%200%2C%20%5Cquad%20%5Ctext%7Belse%7D%0A%20%20%20%20%5Cend%7Bcases%7D

i=1,2,...,n-1

%5Cvarphi_n%20%3D%20%0A%20%20%20%20%5Cbegin%7Bcases%7D%0A%20%20%20%20%20%20%20%201%20%2B%20(x%20-%20x_n)%2Fh_n%2C%20%5Cquad%20x%20%5Cin%20%5Bx_%7Bn-1%7D%2C%20x_n%5D%20%5C%5C%0A%20%20%20%20%20%20%20%200%2C%20%5Cquad%20%5Ctext%7Belse%7D%0A%20%20%20%20%5Cend%7Bcases%7D

在使用這個(gè)基組時(shí),每個(gè)小區(qū)間$[x_{i-1}, x_i]$上有兩個(gè)基函數(shù):1%20-%20(x-x_%7Bi-1%7D)%2Fh_i1%20%2B%20(x-x_i)%2Fh_i。把它們進(jìn)行如下的線性組合

%5Cbegin%7Balign*%7D%0A%20%20%20%20%26f(x_%7Bi-1%7D)(1%20-%20%5Cfrac%7Bx-x_%7Bi-1%7D%7D%7Bh_i%7D)%20%2B%20f(x_i)(1%20%2B%20%5Cfrac%7Bx-x_i%7D%7Bh_i%7D)%20%5C%5C%0A%20%20%20%20%26%3D%20%5Cfrac%7Bf(x_i)%20-%20f(x_%7Bi-1%7D)%7D%7Bh_i%7D%20x%20%2B%20f(x_i)%20%2B%20f(x_%7Bi-1%7D)%20%2B%20f(x_%7Bi-1%7D)%20%5Cfrac%7Bx_%7Bi-1%7D%7D%7Bh_i%7D%20-%20f(x_i)%5Cfrac%7Bx_i%7D%7Bh_i%7D%20%5C%5C%0A%20%20%20%20%26%3D%20%5Cfrac%7Bf(x_i)%20-%20f(x_%7Bi-1%7D)%7D%7Bh_i%7D%20x%20%2B%20f(x_i)%20%2B%20f(x_%7Bi-1%7D)%20%2B%20f(x_%7Bi-1%7D)%20%5Cfrac%7Bx_%7Bi-1%7D%7D%7Bh_i%7D%20-%20f(x_i)%5Cfrac%7Bx_%7Bi-1%7D%20%2B%20h_i%7D%7Bh_i%7D%20%5C%5C%0A%20%20%20%20%26%3D%20%20%5Cfrac%7Bf(x_i)%20-%20f(x_%7Bi-1%7D)%7D%7Bh_i%7D%20x%20%2B%20f(x_%7Bi-1%7D)%20%2B%20f(x_%7Bi-1%7D)%20%5Cfrac%7Bx_%7Bi-1%7D%7D%7Bh_i%7D%20-%20f(x_i)%5Cfrac%7Bx_%7Bi-1%7D%7D%7Bh_i%7D%20%5C%5C%0A%20%20%20%20%26%3D%20%5Cfrac%7Bf(x_i)%20-%20f(x_%7Bi-1%7D)%7D%7Bh_i%7D%20(x%20-%20x_%7Bi-1%7D)%20%2B%20f(x_%7Bi-1%7D)%0A%5Cend%7Balign*%7D

所以把基函數(shù)按照函數(shù)值線性組合得到的就是線性插值的結(jié)果。

下面是完整的代碼:

2. 非線性的擴(kuò)散方程組

%5Cbegin%7Bcases%7D%0A%20%20%20%20%5Cfrac%7B%5Cpartial%20u_1%7D%7B%5Cpartial%20t%7D%20%26%3D%20%5Cfrac%7B%5Cpartial%5E2%20u_1%7D%7B%5Cpartial%20x%5E2%7D%20-%20%5Cexp(u_1%20-%20u_2)%20%2B%20%5Cexp(-(u_1%20-%20u_2))%20%5C%5C%0A%20%20%20%20%5Cfrac%7B%5Cpartial%20u_2%7D%7B%5Cpartial%20t%7D%20%26%3D%20%5Cfrac%7B%5Cpartial%5E2%20u_2%7D%7B%5Cpartial%20x%5E2%7D%20%2B%20%5Cexp(u_1%20-%20u_2)%20-%20%5Cexp(-(u_1%20-%20u_2))%20%5C%5C%0A%20%20%20%20%5Cend%7Bcases%7D

邊界條件為

%5Cbegin%7Bcases%7D%0A%20%20%20%20%20%20%20%20%5Cfrac%7B%5Cpartial%20u_1%7D%7B%5Cpartial%20x%7D(0%2C%20t)%20%26%3D%20%5Csin(u_1(x%20%3D%200))%20%5C%5C%0A%20%20%20%20%20%20%20%20%5Cfrac%7B%5Cpartial%20u_2%7D%7B%5Cpartial%20x%7D(0%2C%20t)%20%26%3D%20-0.1u_1(x%3D0)u_2(x%3D0)%0A%20%20%20%20%5Cend%7Bcases%7D%0A%20%20%20%20%5Cquad%0A%20%20%20%20%5Cbegin%7Bcases%7D%0A%20%20%20%20%20%20%20%20u_1(1%2C%20t)%20%3D%201%20%5C%5C%0A%20%20%20%20%20%20%20%20u_2(1%2C%20t)%20%3D%200%0A%20%20%20%20%5Cend%7Bcases%7D

同樣使用向后歐拉公式,得到方程的變分形式。然后把解用基函數(shù)展開。這里只給出展開后的結(jié)果。

%5Cbegin%7Bmultline%7D%0A%20%20%20%20%5Csum_i%20C_%7Bi%2C1%7D%5E%7Bk%2B1%7D%20%5Cleft(%5Cint%20%5Cvarphi_i%20%5Cvarphi_j%20%2B%20%5CDelta%20t%20%5Cint%20%5Cpartial_x%5Cvarphi_i%20%5Cpartial_x%5Cvarphi_j%5Cright)%20%2B%20%5CDelta%20t%20%5Csin(C_%7B0%2C1%7D%5E%7Bk%2B1%7D)v(0)%20%5C%5C%0A%20%20%20%20%2B%20%5CDelta%20t%20%5Cint%20%5Cleft(%5Cexp(%5Csum_i%20(C_%7Bi%2C1%7D%5E%7Bk%2B1%7D%20-%20C_%7Bi%2C2%7D%5E%7Bk%2B1%7D)%5Cvarphi_i)%20-%20%5Cexp(%5Csum_i%20(C_%7Bi%2C2%7D%5E%7Bk%2B1%7D-C_%7Bi%2C1%7D%5E%7Bk%2B1%7D%20)%5Cvarphi_i)%5Cright)%20%5Cvarphi_j%20%5C%5C%0A%20%20%20%20%3D%20%5Csum_i%20C_%7Bi%2C1%7D%5Ek%20%5Cint%20%5Cvarphi_i%5Cvarphi_j%0A%5Cend%7Bmultline%7D

%5Cbegin%7Bmultline%7D%0A%20%20%20%20%5Csum_i%20C_%7Bi%2C2%7D%5E%7Bk%2B1%7D%20%5Cleft(%5Cint%20%5Cvarphi_i%20%5Cvarphi_j%20%2B%20%5CDelta%20t%20%5Cint%20%5Cpartial_x%5Cvarphi_i%20%5Cpartial_x%5Cvarphi_j%5Cright)%20-%200.01%5CDelta%20t%20C_%7B0%2C1%7D%5E%7Bk%2B1%7DC_%7B0%2C2%7D%5E%7Bk%2B1%7Dv(0)%20%5C%5C%0A%20%20%20%20%2B%20%5CDelta%20t%20%5Cint%20%5Cleft(-%5Cexp(%5Csum_i%20(C_%7Bi%2C1%7D%5E%7Bk%2B1%7D%20-%20C_%7Bi%2C2%7D%5E%7Bk%2B1%7D)%5Cvarphi_i)%20%2B%20%5Cexp(%5Csum_i%20(C_%7Bi%2C2%7D%5E%7Bk%2B1%7D-C_%7Bi%2C1%7D%5E%7Bk%2B1%7D%20)%5Cvarphi_i)%5Cright)%20%5Cvarphi_j%20%5C%5C%0A%20%20%20%20%3D%20%5Csum_i%20C_%7Bi%2C2%7D%5Ek%20%5Cint%20%5Cvarphi_i%5Cvarphi_j%0A%5Cend%7Bmultline%7D

這是關(guān)于C_%7Bi%2C1%7D%5E%7Bk%2B1%7DC_%7Bi%2C2%7D%5E%7Bk%2B1%7D的非線性方程,要使用牛頓法求解。但這里我們不寫出它的Jacobian矩陣表達(dá)式,因?yàn)樘÷?!煩!了!。直接把它?dāng)作一個(gè)非線性方程交給scipy的newton_krylov函數(shù)求解即可。完整代碼如下:


手動(dòng)實(shí)現(xiàn)用有限元方法求解一維方程的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
红原县| 合山市| 岱山县| 汾阳市| 正蓝旗| 荣昌县| 义马市| 永定县| 监利县| 武威市| 托里县| 上虞市| 高台县| 迁安市| 聊城市| 额尔古纳市| 崇礼县| 遵化市| 曲阜市| 麦盖提县| 上高县| 微山县| 天祝| 阳曲县| 章丘市| 衡山县| 于都县| 利津县| 南通市| 曲阜市| 青冈县| 互助| 平安县| 乐昌市| 岳阳县| 天长市| 东乌珠穆沁旗| 扶余县| 西平县| 廉江市| 涞源县|