克兰克-尼科尔森方法

来自testwiki
跳转到导航 跳转到搜索

克兰克-尼科尔森方法Template:Lang-en)是一種数值分析有限差分法,可用于数值求解热方程以及类似形式的偏微分方程[1]。它在时间方向上是隐式的二阶方法,可以寫成隐式的龍格-庫塔法数值稳定。该方法诞生于20世纪,由約翰·克蘭克菲利斯·尼科爾森发展[2]

可以证明克兰克-尼科尔森方法对于扩散方程(以及许多其他方程)是无条件稳定[3]。但是,如果时间步长ΔTemplate:Var乘以熱擴散率,再除以空间步长平方ΔTemplate:VarTemplate:Sup的值过大(根據馮諾依曼穩定性分析,以大于1/2為準),近似解中将存在虚假的振荡或衰减。基于这个原因,当要求大时间步或高空间分辨率的时候,往往会采用数值精确较差的后向欧拉法进行计算,这样即可以保证稳定,又避免了解的伪振荡。

方法

克兰克-尼科尔森方法在空间域上的使用中心差分;而时间域上应用梯形公式,保证了时间域上的二阶收敛。例如,一维偏微分方程

ut=F(u,x,t,ux,2ux2)

u(iΔx,nΔt)=uin,则通过克兰克-尼科尔森方法导出的差分方程是第n步上采用前向欧拉方法与第n+1步上采用后向欧拉方法的平均值(注意,克兰克-尼科尔森方法本身不是这两种方法简单地取平均,方程对解隐式依赖)。

uin+1uinΔt=Fin(u,x,t,ux,2ux2) (前向欧拉方法)
uin+1uinΔt=Fin+1(u,x,t,ux,2ux2) (后向欧拉方法)
uin+1uinΔt=12(Fin+1(u,x,t,ux,2ux2)+Fin(u,x,t,ux,2ux2)) (克兰克-尼科尔森方法)

对于F,通过中心差分方法使其在空间上是离散的。

注意,这是一个隐式方法,需要求解代数方程组以得到时间域上的下一个u值。如果偏微分方程是非线性的,中心差分后得到的方程依旧是非线性方程系统,因此在时间步上推进会涉及求解非线性代数方程组。许多问题中,特别是线性扩散,代数方程中的矩阵是三对角的,通过三对角矩阵算法可以高效求解,这样,算法的时间复杂度由直接求解全矩阵的𝒪(n3)转化为𝒪(n)

示例

线性扩散问题

  • 线性扩散方程
ut=a2ux2

通过克兰克-尼科尔森方法将得到离散方程

uin+1uinΔt=a2(Δx)2((ui+1n+12uin+1+ui1n+1)+(ui+1n2uin+ui1n))

引入变量r=aΔt2(Δx)2:

rui+1n+1+(1+2r)uin+1rui1n+1=rui+1n+(12r)uin+rui1n

这是一个三对角问题,应用三对角矩阵算法(追赶法)即可得到uin+1,而不需要对矩阵直接求逆。

  • 准线性扩散方程
ut=a(u)2ux2

离散化后则会得到非线性方程系统。但是某些情况下,通过使用a的旧值,即用ain(u) 替代ain+1(u),可将问题线性化。其他时候,也可能在保证稳定性的基础上使用显式方法估计ain+1(u)

一维多通道连接的扩散问题

这种模型可以用于描述水流中含稳定污染流,但只有一维信息的情况。它可以简化为一维问题并得到有价值的信息。 可对水中污染溶质富集的问题进行建模,这种问题由三部分组成:已知的扩散方程(Dx为常量),平流分量(即由速度场导致的系统在空间上的变化,表示为常量Ux),以及与纵向通道k旁流的相互作用。

0Ct=Dx2Cx2UxCxk(CCN)k(CCM)

其中C表示污染物的富集水平,下标NM分别对应上一通道和下一通道。

克兰克-尼科尔森方法(i对应位置,j对应时间)将以上偏微分方程中的每个部分变换为

1Ct=Cij+1CijΔt
22Cx2=12(Δx)2((Ci+1j+12Cij+1+Ci1j+1)+(Ci+1j2Cij+Ci1j))
3Cx=12((Ci+1j+1Ci1j+1)2(Δx)+(Ci+1jCi1j)2(Δx))
4C=12(Cij+1+Cij)
5CN=12(CNij+1+CNij)
6CM=12(CMij+1+CMij)

现在引入以下常量用于简化计算:

λ=DxΔt2Δx2
α=UxΔt4Δx
β=kΔt2

把 <1>, <2>, <3>, <4>, <5>, <6>, α, βλ 代入 <0>. 把新时间项(j+1)代入到左边,当前时间项(j)代入到右边,将得到

βCNij+1(λ+α)Ci1j+1+(1+2λ+2β)Cij+1(λα)Ci+1j+1βCMij+1=βCNij+(λ+α)Ci1j+(12λ2β)Cij+(λα)Ci+1j+βCMij

第一个通道只能与下一个通道(M)有关系,因此表达式可以简化为:

(λ+α)Ci1j+1+(1+2λ+β)Cij+1(λα)Ci+1j+1βCMij+1=+(λ+α)Ci1j+(12λβ)Cij+(λα)Ci+1j+βCMij

同样地, 最后一个通道只与前一个通道(N)有关联,因此表达式可以简化为

βCNij+1(λ+α)Ci1j+1+(1+2λ+β)Cij+1(λα)Ci+1j+1=βCNij+(λ+α)Ci1j+(12λβ)Cij+(λα)Ci+1j

为求解此线性方程组,需要知道边界条件在通道始端就已经给定了。

C0j: 当前时间步某通道的初始条件

C0j+1: 下一时间步某通道的初始条件

CN0j: 前一通道到当前时间步下某通道的初始条件

CM0j: 下一通道到当前时间步下某通道的初始条件

对于通道的末端最后一个节点,最方便的条件是是绝热近似,则

Cxx=z=(Ci+1Ci1)2Δx=0

当且只当

Ci+1j+1=Ci1j+1

时,这一条件才被满足。

以3个通道,5个节点为例,可以将线性系统问题表示为

[AA][Cj+1]=[BB][Cj]+[d]

其中,

𝐂𝐣+𝟏=[C11j+1C12j+1C13j+1C14j+1C21j+1C22j+1C23j+1C24j+1C31j+1C32j+1C33j+1C34j+1] 𝐂𝐣=[C11jC12jC13jC14jC21jC22jC23jC24jC31jC32jC33jC34j]

需要清楚的是,AABB是由四个不同子矩阵组成的矩阵,

𝐀𝐀=[AA1AA30AA3AA2AA30AA3AA1]
𝐁𝐁=[BB1AA30AA3BB2AA30AA3BB1]

其中上述矩阵的的矩阵元对应于下一个矩阵和额外的4x4零矩阵。请注意,矩阵AABB的大小为12x12

𝐀𝐀𝟏=[(1+2λ+β)(λα)00(λ+α)(1+2λ+β)(λα)00(λ+α)(1+2λ+β)(λα)002λ(1+2λ+β)]
𝐀𝐀𝟐=[(1+2λ+2β)(λα)00(λ+α)(1+2λ+2β)(λα)00(λ+α)(1+2λ+2β)(λα)002λ(1+2λ+2β)]
𝐀𝐀𝟑=[β0000β0000β0000β]
𝐁𝐁𝟏=[(12λβ)(λα)00(λ+α)(12λβ)(λα)00(λ+α)(12λβ)(λα)002λ(12λβ)]   &  
𝐁𝐁𝟐=[(12λ2β)(λα)00(λ+α)(12λ2β)(λα)00(λ+α)(12λ2β)(λα)002λ(12λ2β)]

这里的d矢量用于保证边界条件成立。在此示例中为12x1的矢量。

𝐝=[(λ+α)(C10j+1+C10j)000(λ+α)(C20j+1+C20j)000(λ+α)(C30j+1+C30j)000]

为了找到任意时间下污染物的聚集情况,需要对以下方程进行迭代计算:

[Cj+1]=[AA1]([BB][Cj]+[d])

二维扩散问题

將擴散問題延伸到二維的Template:Link-en,推導方程類似,但結果會是{{link-en|带形矩阵|Banded matrix||的方程式,不是三角矩陣,二維的熱方程

ut=a(2ux2+2uy2)

假設網格滿足Δx=Δy的特性,即可通過克蘭克-尼科爾森方法將得到離散方程

ui,jn+1=ui,jn+12aΔt(Δx)2[(ui+1,jn+1+ui1,jn+1+ui,j+1n+1+ui,j1n+14ui,jn+1)+(ui+1,jn+ui1,jn+ui,j+1n+ui,j1n4ui,jn)]

此方程可以再重組,配合Template:Link-en再進行簡化

μ=aΔt(Δx)2.

在克蘭克-尼科爾森方法下,不需要為了穩定性而限制柯朗数的上限,不過為了數值穩定度,柯朗数仍不能太高,可以將方程式重寫如下:

(1+2μ)ui,jn+1μ2(ui+1,jn+1+ui1,jn+1+ui,j+1n+1+ui,j1n+1)=(12μ)ui,jn+μ2(ui+1,jn+ui1,jn+ui,j+1n+ui,j1n).

應用在金融數學上

許多的現象都可以用熱方程金融數學上稱為擴散方程)來建模,因此克兰克-尼科尔森方法也可以用在這些領域中[4]。尤其金融衍生工具定價用的布萊克-休斯模型可以轉換為熱方程,因此期權定價數值解可以用克兰克-尼科尔森方法求得。

因為期權定價若超過基本假設(例如改變股息)時,無法求得解析解,需要用上述方式求得。不過若是非平滑的最後條件(大部份的金融商品都是如此),克兰克-尼科尔森方法會有數值的震盪,無法用濾波方式平緩。在期權定價上會反映在履約價Γ的變動。因此,一開始幾個步驟需要用其他比較不會震盪的方法(如全隱式有限差分法)。

相關條目

參考資料

Template:Reflist

Template:數值偏微分方程

  1. Template:Cite book
  2. Template:Cite journal
  3. Template:Cite book. Example 3.3.2 shows that Crank–Nicolson is unconditionally stable when applied to ut=auxx.
  4. Template:Cite book