偏微分方程數(shù)值解

目錄

  • 拋物方程的有限差分方法
    • 馮諾依曼分析法
      • 追趕法
    • Crank-Nicolson方法
    • 邊界條件

拋物型方程的有限差分方法

最為常見(jiàn)的拋物型偏微分方程就是熱傳導(dǎo)方程
\left\{\begin{array}{ll} u_{t}=Du_{x x}, & a \leqslant x \leqslant b \quad t \geqslant 0 \\ u(x, 0)=f(x), & a \leqslant x \leqslant b \\ u(a, t)=l(t), & t \geqslant 0 \\ u(b, t)=r(t), & t \geqslant 0 \end{array}\right.
它本質(zhì)上其實(shí)是一個(gè)初邊值問(wèn)題翁逞,直觀來(lái)看是因?yàn)樘悠牵刃枰踔禇l件讹俊,又需要邊值條件。
對(duì)于偏導(dǎo)數(shù)的差分格式,一般分為隱式差分與顯式差分兩種,下面分別進(jìn)行介紹。

顯式差分格式

對(duì)于u的一階導(dǎo)數(shù)牵囤,可以進(jìn)行如下的近似:

\frac{u_{n+1}-u_{n}}{h} \simeq u^{\prime}
其中,h為設(shè)定的空間步長(zhǎng)滞伟。如果設(shè)定h為單位長(zhǎng)度揭鳞,則

u^{\prime}=\nabla u_{n+1}=u_{n+1}-u_{n}
其中,\nabla是后向差分的符號(hào)诗良,而不是梯度運(yùn)算汹桦。
由此進(jìn)而可以推導(dǎo)出u''的表達(dá)式為:

u^{\prime \prime}=\nabla u_{n+1}-\nabla u_{n}=u_{n+1}-2 u_{n}+u_{n-1}
然后,再將h代回鉴裹,便可得到最終的差分格式:

u_{x x}(x, t) \approx \frac{1}{h^{2}}(u(x+h, t)-2 u(x, t)+u(x-h, t))
該式子中均是對(duì)空間的差分舞骆,所以t并沒(méi)有變化钥弯。
在對(duì)于時(shí)間的差分中,我們便有兩種不同的選擇督禽,這也對(duì)應(yīng)了顯式和隱式差分格式脆霎。
對(duì)于顯式差分,其時(shí)間的差分方式如下:
u_{t}(x, t) \approx \frac{1}{k}(u(x, t+k)-u(x, t))
其中狈惫,k為設(shè)定的時(shí)間步長(zhǎng)睛蛛。可以引入變量\sigma = \frac{ck}{h^2}
我們定義w_{i,j}就是在(x,t)處的數(shù)值解胧谈,那么自然的忆肾,我們可以將它按照時(shí)間的順序排列,得到下面的一個(gè)形式:
w_{i, j+1}=w_{i j}+\sigma\left(w_{i+1, j}-2 w_{i j}+w_{i-1, j}\right)

馮諾依曼分析法

它可以應(yīng)用在各種常見(jiàn)的偏微分方程中菱肖。所謂的馮諾依曼分析法客冈,其本質(zhì)就是用向量,將所有的空間離散點(diǎn)拼起來(lái)稳强。那么這樣的話场仲,這個(gè)矩陣所對(duì)應(yīng)的表達(dá)式就僅僅與時(shí)間有關(guān)了。這樣自然分析就會(huì)方便很多退疫。
上述的差分形式渠缕,可以寫(xiě)成矩陣形式,如下:
\left[\begin{array}{c} w_{1, j+1} \\ \vdots \\ w_{m, j+1} \end{array}\right]=\left[\begin{array}{ccccc} 1-2 \sigma & \sigma & 0 & \cdots & 0 \\ \sigma & 1-2 \sigma & \sigma & \ddots & \vdots \\ 0 & \sigma & 1-2 \sigma & \ddots & 0 \\ \vdots & \ddots & \ddots & \ddots & \sigma \\ 0 & \cdots & 0 & \sigma & 1-2 \sigma \end{array}\right]\left[\begin{array}{c} w_{1 j} \\ \vdots \\ w_{m j} \end{array}\right]+\sigma\left[\begin{array}{c} w_{0, j} \\ 0 \\ \vdots \\ 0 \\ w_{m+1, j} \end{array}\right]
寫(xiě)的緊湊一點(diǎn)褒繁,就是公式W_{j+1} = AW_j + s_j,那么為了讓這個(gè)公式收斂亦鳞,我們顯然需要讓A的最大特征值小于1,最后一般需要\sigma<2
實(shí)際的求解中棒坏,可以直接進(jìn)行遞推蚜迅,然后對(duì)于首尾直接代入邊界條件即可。

#一維熱傳導(dǎo)
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.animation as animation

a = 1
#第三類(lèi)邊界條件
c = 1
#dx太小或dt太大可能出錯(cuò)
dx = 0.01
dt = 0.00005

x = np.arange(0, 1, dx)
t = np.arange(0, 1, dt)

u = np.zeros((len(x), len(t)))
#初始條件
u[:, 0] = 0
#邊界條件
m1 = lambda t : 1 + 0.0 * np.sin(t)
m2 = lambda t : 2 - 0.0 * np.sin(10 * t)
#構(gòu)造對(duì)角矩陣1俊抵,-2,1
#其中diag為對(duì)角矩陣坐梯,1表示上移一格
A = -2 * np.eye((len(x))) + np.diag([1] * (len(x) - 1), 1) + np.diag([1] * (len(x) - 1), -1)

for n in range(len(t) - 1):
    u[:, n + 1] = u[:, n] + ((a**2 /(dx**2)) * np.dot(A, u[:, n]) + f.T) * dt
    #第一類(lèi)邊界條件
    #用邊界條件確定第一個(gè)和最后一個(gè)
    u[0, n + 1] = m1(n + 1)
    u[-1, n + 1] = m2(n + 1)
figure = plt.figure()
ax = Axes3D(figure)
T, X = np.meshgrid(t, x)
ax.plot_surface(X, T, u, cmap='rainbow')
plt.xlabel('x')
plt.ylabel('t')
# plt.plot(x, u[:, -1])
# plt.grid()
plt.show()

若得到的解出現(xiàn)震蕩徽诲,則可以適當(dāng)增加dx或減小dt,最后得到的求解結(jié)果如下圖:


隱式差分格式

與顯式差分格式相比所不同的是對(duì)時(shí)間的差分格式吵血,其差分格式如下
w_{i j}-w_{i, j-1}=\sigma\left(w_{i+1, j}-2 w_{i j}+w_{i-1, j}\right)
那么也容易通過(guò)化簡(jiǎn)得到我們的矩陣方程:
\left[\begin{array}{ccccc} 1+2 \sigma & -\sigma & 0 & \cdots & 0 \\ -\sigma & 1+2 \sigma & -\sigma & \ddots & \vdots \\ 0 & -\sigma & 1+2 \sigma & \ddots & 0 \\ \vdots & \vdots & \vdots & \vdots & -\sigma \\ 0 & \cdots & 0 & -\sigma & 1+2 \sigma \end{array}\right]\left[\begin{array}{c} w_{1 j} \\ \vdots \\ w_{m j} \end{array}\right]=\left[\begin{array}{c} w_{1, j-1} \\ \vdots \\ w_{m j}-1 \end{array}\right]+\sigma\left[\begin{array}{c} w_{0 j} \\ 0 \\ \vdots \\ 0 \\ w_{m+1, j} \end{array}\right]
寫(xiě)成緊湊形式便是谎替,Aw_j = w_{j-1}+s_j,我們可以通過(guò)計(jì)算得到A的特征值為1+2 \sigma-2 \sigma \cos \frac{\pi j}{m+1}>1蹋辅,所以與顯式差分相比該格式是無(wú)條件穩(wěn)定的钱贯。但是并不能直接按時(shí)間進(jìn)行遞推求解,需要不斷求解矩陣方程侦另,而A是以三對(duì)角矩陣秩命,較為稀疏尉共,直接對(duì)其進(jìn)行求逆會(huì)造成效率低下,于是需要利用追趕法進(jìn)行求解弃锐,可以大幅提升求解效率袄友。

追趕法

對(duì)于一矩陣方程:
AX = d
其中A為一非奇異三對(duì)角矩陣,可以對(duì)A進(jìn)行LU分解霹菊,得到一上三角矩陣和一下三角矩陣剧蚣。之后可引入中間變量y = UX,則有
\begin{array}{l} A x=L U x=L y=d \\ L y=d \end{array}
之后已知L,d便可求得y,已知U,y后便可求得X。具體代碼實(shí)現(xiàn)如下:

import numpy as np
from scipy import linalg

#可解決大規(guī)模的三對(duì)角的矩陣方程
#如在偏微分方程的求解中
'''
b c 0 0
a b c 0
0 a b c
0 0 a b

其中b的絕對(duì)值
大于等于a與c的絕對(duì)值之和
'''
A = -2 * np.eye((5)) + np.diag([1] * (5 - 1), 1) + np.diag([1] * (5 - 1), -1)
b = np.array([1,1,1,1,1])
# print(b[1])
def Thomas(La, Mb, Uc, b):
    """
        La -- [lower item for tri-diagonal matrix] -- [a, a, a]
        Mb -- [mian item for tri-diagonal matrix] -- [b, b, b, b]
        Uc -- [upper item for tri-diagonal matrix] -- [c, c, c]
        b -- [AX = b, where A is the tri-diagonal matrix] [1,1,1,1,1]
    """
    n = len(Mb)
    Uc[0] = Uc[0] / Mb[0]
    for i in range(1, n-1):
        Uc[i] = Uc[i] / (Mb[i] - La[i - 1] * Uc[i - 1])
    b[0] = b[0] / Mb[0]
    for i in range(1, n):
        b[i] = (b[i] - La[i-1]*b[i-1]) / (Mb[i] - La[i-1] * Uc[i-1])
    ls = list(range(n-1))[::-1]
    for i in ls:
        b[i] = b[i] - Uc[i]*b[i+1]
    return b

之后便可利用追趕法和初始條件旋廷,遍歷時(shí)間節(jié)點(diǎn)鸠按,逐次求解每個(gè)時(shí)間點(diǎn)的溫度。

Crank-Nicolson方法

因?yàn)橹暗膬蓚€(gè)方法它們的誤差是O(n^2+k^2),這其實(shí)會(huì)有問(wèn)題就是主要的誤差其實(shí)都在時(shí)間步長(zhǎng)上饶碘。我們需要把時(shí)間步長(zhǎng) 取得很小目尖,可能才能夠達(dá)到我們要的精度。因此Crank-Nicolson方法可以很好地彌補(bǔ)這個(gè)缺陷熊镣。
這里我們的u_t使用向后差分卑雁,和上面那一個(gè)一樣。而我們的u_{xx}使用的是混合差分绪囱。具體來(lái)說(shuō)测蹲,就是用:
u_{xx}(i,j)=\frac{1}{h^{2}}\left(\frac{1}{2}\left(w_{i+1, j}-2 w_{i j}+w_{i-1, j}\right)+\frac{1}{2}\left(w_{i+1, j-1}-2 w_{i, j-1}+w_{i-1, j-1}\right)\right)
最后按時(shí)間進(jìn)行整合后得到:
-\sigma w_{i-1, j}+(2+2 \sigma) w_{i j}-\sigma w_{i+1, j}=\sigma w_{i-1, j-1}+(2-2 \sigma) w_{i, j-1}+\sigma w_{i+1, j-1}
大體上的形式就是 A \mathbf{w}_{j}=B \mathbf{w}_{j-1}+\sigma\left(\mathbf{s}_{j-1}+\mathbf{s}_{j}\right)
其中:
A=\left(\begin{array}{ccccc} 2+2 \sigma & -\sigma & 0 & \cdots & 0 \\ -\sigma & 2+2 \sigma & -\sigma & \ddots & \vdots \\ 0 & -\sigma & 2+2 \sigma & \ddots & 0 \\ \vdots & \ddots & \ddots & \ddots & -\sigma \\ 0 & \cdots & 0 & -\sigma & 2+2 \sigma \end{array}\right)
B=\left(\begin{array}{ccccc} 2-2 \sigma & \sigma & 0 & \cdots & 0 \\ \sigma & 2-2 \sigma & \sigma & \ddots & \vdots \\ 0 & \sigma & 2-2 \sigma & \ddots & 0 \\ \vdots & \ddots & \ddots & \ddots & \sigma \\ 0 & \cdots & 0 & \sigma & 2-2 \sigma \end{array}\right)
可以計(jì)算得到A^{-1}B的特征值為:
\mu_{j}=\frac{2-2 \sigma+\sigma \lambda_{j}}{2+2 \sigma-\sigma \lambda_{j}}, \lambda_{j}=-2 \cos \pi j /(m+1)
其特征值也是小于1的,故也是無(wú)條件穩(wěn)定鬼吵。同時(shí)其截?cái)嗾`差為O(k^2+h^2),這比上面兩種方法的誤差要小很多了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末扣甲,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子齿椅,更是在濱河造成了極大的恐慌琉挖,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涣脚,死亡現(xiàn)場(chǎng)離奇詭異示辈,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)遣蚀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)矾麻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人芭梯,你說(shuō)我怎么就攤上這事险耀。” “怎么了玖喘?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵甩牺,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我累奈,道長(zhǎng)贬派,這世上最難降的妖魔是什么急但? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮赠群,結(jié)果婚禮上羊始,老公的妹妹穿的比我還像新娘。我一直安慰自己查描,他們只是感情好突委,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著冬三,像睡著了一般匀油。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上勾笆,一...
    開(kāi)封第一講書(shū)人閱讀 52,475評(píng)論 1 312
  • 那天敌蚜,我揣著相機(jī)與錄音,去河邊找鬼窝爪。 笑死弛车,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蒲每。 我是一名探鬼主播纷跛,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼邀杏!你這毒婦竟也來(lái)了贫奠?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤望蜡,失蹤者是張志新(化名)和其女友劉穎唤崭,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體脖律,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谢肾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了小泉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片勒叠。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖膏孟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拌汇,我是刑警寧澤柒桑,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站噪舀,受9級(jí)特大地震影響魁淳,放射性物質(zhì)發(fā)生泄漏飘诗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一界逛、第九天 我趴在偏房一處隱蔽的房頂上張望昆稿。 院中可真熱鬧,春花似錦息拜、人聲如沸溉潭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)喳瓣。三九已至,卻和暖如春赞别,著一層夾襖步出監(jiān)牢的瞬間畏陕,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工仿滔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惠毁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓崎页,卻偏偏與公主長(zhǎng)得像鞠绰,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子实昨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361