Julia Advent Calendar 2024 シリーズ2 の9日目です🎄
https://qiita.com/advent-calendar/2024/julia
はじめに
FiniteDifferenceMatrices.jl と LaTeXStrings.jl を用いて中心差分と前進差分, 4次精度までの1階微分から4階微分に対応する 有限差分 (Finite Difference) を列挙し, それらを手で証明していきます.
有限差分の列挙
FiniteDifferenceMatrices.jl の fdcoefficient()で求めた係数を使い, LaTeXStrings.jl でうまく数式が表示されるようLaTeXにコンパイルできる文字列を生成します. コードはこちらにあります.
https://gist.github.com/ohno/bd52eb6461aaaeb5c2c3dec78017f33f
中心差分
2次精度
dxdf(x)=2Δxf(x+Δx)−f(x−Δx)+O(Δx2)
dx2d2f(x)=Δx2f(x+Δx)−2f(x)+f(x−Δx)+O(Δx2)
dx3d3f(x)=2Δx3f(x+2Δx)−2f(x+Δx)+2f(x−Δx)−f(x−2Δx)+O(Δx2)
dx4d4f(x)=Δx4f(x+2Δx)−4f(x+Δx)+6f(x)−4f(x−Δx)+f(x−2Δx)+O(Δx2)
4次精度
dxdf(x)=12Δx−f(x+2Δx)+8f(x+Δx)−8f(x−Δx)+f(x−2Δx)+O(Δx4)
dx2d2f(x)=12Δx2−f(x+2Δx)+16f(x+Δx)−30f(x)+16f(x−Δx)−f(x−2Δx)+O(Δx4)
dx3d3f(x)=8Δx3−f(x+3Δx)+8f(x+2Δx)−13f(x+Δx)+13f(x−Δx)−8f(x−2Δx)+f(x−3Δx)+O(Δx4)
dx4d4f(x)=6Δx4−f(x+3Δx)+12f(x+2Δx)−39f(x+Δx)+56f(x)−39f(x−Δx)+12f(x−2Δx)−f(x−3Δx)+O(Δx4)
前進差分
1次精度
dxdf(x)=Δxf(x+Δx)−f(x)+O(Δx)
dx2d2f(x)=Δx2f(x+2Δx)−2f(x+Δx)+f(x)+O(Δx)
dx3d3f(x)=Δx3f(x+3Δx)−3f(x+2Δx)+3f(x+Δx)−f(x)+O(Δx)
dx4d4f(x)=Δx4f(x+4Δx)−4f(x+3Δx)+6f(x+2Δx)−4f(x+Δx)+f(x)+O(Δx)
2次精度
dxdf(x)=2Δx−f(x+2Δx)+4f(x+Δx)−3f(x)+O(Δx2)
dx2d2f(x)=Δx2−f(x+3Δx)+4f(x+2Δx)−5f(x+Δx)+2f(x)+O(Δx2)
dx3d3f(x)=2Δx3−3f(x+4Δx)+14f(x+3Δx)−24f(x+2Δx)+18f(x+Δx)−5f(x)+O(Δx2)
dx4d4f(x)=Δx4−2f(x+5Δx)+11f(x+4Δx)−24f(x+3Δx)+26f(x+2Δx)−14f(x+Δx)+3f(x)+O(Δx2)
3次精度
dxdf(x)=6Δx2f(x+3Δx)−9f(x+2Δx)+18f(x+Δx)−11f(x)+O(Δx3)
dx2d2f(x)=12Δx211f(x+4Δx)−56f(x+3Δx)+114f(x+2Δx)−104f(x+Δx)+35f(x)+O(Δx3)
dx3d3f(x)=4Δx37f(x+5Δx)−41f(x+4Δx)+98f(x+3Δx)−118f(x+2Δx)+71f(x+Δx)−17f(x)+O(Δx3)
dx4d4f(x)=6Δx417f(x+6Δx)−114f(x+5Δx)+321f(x+4Δx)−484f(x+3Δx)+411f(x+2Δx)−186f(x+Δx)+35f(x)+O(Δx3)
4次精度
dxdf(x)=12Δx−3f(x+4Δx)+16f(x+3Δx)−36f(x+2Δx)+48f(x+Δx)−25f(x)+O(Δx4)
dx2d2f(x)=12Δx2−10f(x+5Δx)+61f(x+4Δx)−156f(x+3Δx)+214f(x+2Δx)−154f(x+Δx)+45f(x)+O(Δx4)
dx3d3f(x)=8Δx3−15f(x+6Δx)+104f(x+5Δx)−307f(x+4Δx)+496f(x+3Δx)−461f(x+2Δx)+232f(x+Δx)−49f(x)+O(Δx4)
dx4d4f(x)=6Δx4−21f(x+7Δx)+164f(x+6Δx)−555f(x+5Δx)+1056f(x+4Δx)−1219f(x+3Δx)+852f(x+2Δx)−333f(x+Δx)+56f(x)+O(Δx4)
証明
いくつかの有限差分を導出していきます. 証明にはTaylor展開
f(x+Δx)f(x−Δx)f(x+2Δx)f(x−2Δx)=f(x)+∂x∂f(x)Δx+2!1∂x2∂2f(x)Δx2+3!1∂x3∂3f(x)Δx3+4!1∂x4∂4f(x)Δx4+⋯,=f(x)−∂x∂f(x)Δx+2!1∂x2∂2f(x)Δx2−3!1∂x3∂3f(x)Δx3+4!1∂x4∂4f(x)Δx4+⋯,=f(x)+2∂x∂f(x)Δx+2!22∂x2∂2f(x)Δx2+3!23∂x3∂3f(x)Δx3+4!24∂x4∂4f(x)Δx4+⋯,=f(x)−2∂x∂f(x)Δx+2!22∂x2∂2f(x)Δx2−3!23∂x3∂3f(x)Δx3+4!24∂x4∂4f(x)Δx4+⋯,
を用います.
中心差分, 2次精度, 1階微分
f(x+Δx)f(x−Δx)=f(x)+∂x∂f(x)Δx+2!1∂x2∂2f(x)Δx2+O(Δx3)=f(x)−∂x∂f(x)Δx+2!1∂x2∂2f(x)Δx2+O(Δx3)
の差を取ると,
f(x+Δx)−f(x−Δx)2∂x∂f(x)Δx∂x∂f(x)∂x∂f(x)=2∂x∂f(x)Δx+O(Δx3)=f(x+Δx)−f(x−Δx)+O(Δx3)=2Δxf(x+Δx)−f(x−Δx)+2ΔxO(Δx3)=2Δxf(x+Δx)−f(x−Δx)+O(Δx2)
中心差分, 2次精度, 2階微分
f(x+Δx)f(x−Δx)=f(x)+∂x∂f(x)Δx+2!1∂x2∂2f(x)Δx2+3!1∂x3∂3f(x)Δx3+O(Δx4)=f(x)−∂x∂f(x)Δx+2!1∂x2∂2f(x)Δx2−3!1∂x3∂3f(x)Δx3+O(Δx4)
の和を取ると,
f(x+Δx)+f(x−Δx)∂x2∂2f(x)Δx2∂x2∂2f(x)∂x2∂2f(x)=2f(x)+∂x2∂2f(x)Δx2+O(Δx4)=f(x+Δx)−2f(x)+f(x−Δx)+O(Δx4)=Δx2f(x+Δx)−2f(x)+f(x−Δx)+Δx2O(Δx4)=Δx2f(x+Δx)−2f(x)+f(x−Δx)+O(Δx2)
中心差分, 2次精度, 3階微分
f(x+Δx)f(x−Δx)=f(x)+∂x∂f(x)Δx+2!1∂x2∂2f(x)Δx2+3!1∂x3∂3f(x)Δx3+4!1∂x4∂4f(x)Δx4+O(Δx5)=f(x)−∂x∂f(x)Δx+2!1∂x2∂2f(x)Δx2−3!1∂x3∂3f(x)Δx3+4!1∂x4∂4f(x)Δx4+O(Δx5)
の差を取って2倍すると,
f(x+Δx)−f(x−Δx)2f(x+Δx)−2f(x−Δx)=2∂x∂f(x)Δx+31∂x3∂3f(x)Δx3+O(Δx5)=4∂x∂f(x)Δx+32∂x3∂3f(x)Δx3+O(Δx5)
を得る. 次に
f(x+2Δx)f(x−2Δx)=f(x)+2∂x∂f(x)Δx+2!22∂x2∂2f(x)Δx2+3!23∂x3∂3f(x)Δx3+4!24∂x4∂4f(x)Δx4+⋯=f(x)−2∂x∂f(x)Δx+2!22∂x2∂2f(x)Δx2−3!23∂x3∂3f(x)Δx3+4!24∂x4∂4f(x)Δx4+⋯
の差を取ると,
f(x+2Δx)−f(x−2Δx)=4∂x∂f(x)Δx+38∂x3∂3f(x)Δx3+O(Δx5)
を得る. さらに, 得られた2式
2f(x+Δx)−2f(x−Δx)f(x+2Δx)−f(x−2Δx)=4∂x∂f(x)Δx+32∂x3∂3f(x)Δx3+O(Δx5)=4∂x∂f(x)Δx+38∂x3∂3f(x)Δx3+O(Δx5)
の差を取って左右を入れ替えると
−36∂x3∂3f(x)Δx3+O(Δx5)2∂x3∂3f(x)Δx3∂x3∂3f(x)∂x3∂3f(x)=2f(x+Δx)−2f(x−Δx)−f(x+2Δx)+f(x−2Δx)=f(x+2Δx)−2f(x+Δx)+2f(x−Δx)−f(x−2Δx)+O(Δx5)=2Δx3f(x+2Δx)−2f(x+Δx)+2f(x−Δx)−f(x−2Δx)+2Δx3O(Δx5)=2Δx3f(x+2Δx)−2f(x+Δx)+2f(x−Δx)−f(x−2Δx)+O(Δx2)
中心差分, 2次精度, 4階微分
f(x+Δx)f(x−Δx)=f(x)+∂x∂f(x)Δx+2!1∂x2∂2f(x)Δx2+3!1∂x3∂3f(x)Δx3+4!1∂x4∂4f(x)Δx4+5!1∂x5∂5f(x)Δx5+O(Δx6)=f(x)−∂x∂f(x)Δx+2!1∂x2∂2f(x)Δx2−3!1∂x3∂3f(x)Δx3+4!1∂x4∂4f(x)Δx4−5!1∂x5∂5f(x)Δx5+O(Δx6)
の和を取って4倍すると,
f(x+Δx)+f(x−Δx)4f(x+Δx)+4f(x−Δx)=2f(x)+2!2∂x2∂2f(x)Δx2+4!2∂x4∂4f(x)Δx4+O(Δx6)=8f(x)+4∂x2∂2f(x)Δx2+31∂x4∂4f(x)Δx4+O(Δx6)
を得る. 次に
f(x+2Δx)f(x−2Δx)=f(x)+2∂x∂f(x)Δx+2!22∂x2∂2f(x)Δx2+3!23∂x3∂3f(x)Δx3+4!24∂x4∂4f(x)Δx4+5!25∂x5∂5f(x)Δx5+O(Δx6)=f(x)−2∂x∂f(x)Δx+2!22∂x2∂2f(x)Δx2−3!23∂x3∂3f(x)Δx3+4!24∂x4∂4f(x)Δx4−5!25∂x5∂5f(x)Δx5+O(Δx6)
の和を取ると,
f(x+2Δx)+f(x−2Δx)=2f(x)+4∂x2∂2f(x)Δx2+34∂x4∂4f(x)Δx4+O(Δx6)
を得る. さらに, 得られた2式
4f(x+Δx)+4f(x−Δx)f(x+2Δx)+f(x−2Δx)=8f(x)+4∂x2∂2f(x)Δx2+31∂x4∂4f(x)Δx4+O(Δx6)=2f(x)+4∂x2∂2f(x)Δx2+34∂x4∂4f(x)Δx4+O(Δx6)
の差を取ると
6f(x)−∂x4∂4f(x)Δx4+O(Δx6)∂x4∂4f(x)Δx4∂x4∂4f(x)=4f(x+Δx)+4f(x−Δx)−f(x+2Δx)−f(x−2Δx)=f(x+2Δx)−4f(x+Δx)+6f(x)−4f(x−Δx)+f(x−2Δx)+O(Δx6)=Δx4f(x+2Δx)−4f(x+Δx)+6f(x)−4f(x−Δx)+f(x−2Δx)+O(Δx2)
前進差分, 1次精度, 1階微分
f(x+Δx)=f(x)+∂x∂f(x)Δx+O(Δx2)
から直ちに
f(x+Δx)∂x∂f(x)Δx∂x∂f(x)∂x∂f(x)=f(x)+∂x∂f(x)Δx+O(Δx2)=f(x+Δx)−f(x)+O(Δx2)=Δxf(x+Δx)−f(x)−ΔxO(Δx2)=Δxf(x+Δx)−f(x)+O(Δx)
前身差分, 1次精度, 2階微分
まず
f(x+Δx)=f(x)+∂x∂f(x)Δx+2!1∂x2∂2f(x)Δx2+3!1∂x3∂3f(x)Δx3+O(Δx4)
を2倍して,
2f(x+Δx)=2f(x)+2∂x∂f(x)Δx+2!2∂x2∂2f(x)Δx2+3!2∂x3∂3f(x)Δx3+O(Δx4)
となる. これと
f(x+2Δx)=f(x)+2∂x∂f(x)Δx+2!4∂x2∂2f(x)Δx2+3!8∂x3∂3f(x)Δx3+O(Δx4)
の差を取ると,
f(x+2Δx)−2f(x+Δx)=−f(x)+∂x2∂2f(x)Δx2+O(Δx3)
となり, これを整理して次式を得る.
∂x2∂2f(x)=Δx2f(x+2Δx)−2f(x+Δx)+f(x)+O(Δx)
まとめ
有限差分法 (Finite Difference Method, FDM) で用いる公式を列挙・証明しました.
Discussion