ジュリアで有限差分を使用する方法
概要
Juliaで有限差分法を使うには、特に有限差分の係数を求めるためには、FiniteDifferences.jl
を使うのがいいだろう1。ノイズに弱い場合は、TVDiffとして知られるTotal Variation Regularized Numerical Differentiationを使ってみる価値がある。これはNoiseRobustDifferentiation.jl
に実装されている。
コード
FiniteDifferenceMethod()
julia> f′ = FiniteDifferenceMethod([-2, 0, 5], 1)
FiniteDifferenceMethod:
order of method: 3
order of derivative: 1
grid: [-2, 0, 5]
coefficients: [-0.35714285714285715, 0.3, 0.05714285714285714]
julia> typeof(f′)
FiniteDifferences.UnadaptedFiniteDifferenceMethod{3, 1}
上記の例では、関数の中央の点、左から2番目の点、右から5番目の点を使って1次微分を計算して、これら3点の重みを求める。基本的にFiniteDifferenceMethod()
を通じて得られるのは、これらの係数である。
julia> propertynames(f′)
(:grid, :coefs, :coefs_neighbourhood, :condition, :factor, :max_range, :∇f_magnitude_mult, :f_error_mult)
julia> f′.grid
3-element StaticArraysCore.SVector{3, Int64} with indices SOneTo(3):
-2
0
5
julia> f′.coefs
3-element StaticArraysCore.SVector{3, Float64} with indices SOneTo(3):
-0.35714285714285715
0.3
0.05714285714285714
構造体で使用するプロパティには、主に.grid
と.coefs
の2つがある。
julia> f′(sin, π/2)
-1.2376571459669071e-11
julia> f′(cos, π/2)
-1.0000000000076525
データではなく関数自体が与えられた場合は、上記のように直接関数形式で書いても問題ない。
_fdm()
central_fdm(2, 1)
central_fdm(3, 2)
backward_fdm(4, 1)
forward_fdm(5, 1)
特にカスタマイズせずに一般的に知られているFDMが必要な場合は、上記のようにすでに用意されている関数を使う方が便利だ。第1引数は、関数の種類に応じて何点を使用するかに依存し、第2引数$n$は$n$次微分を計算することを決定する。central_fdm()
の第1引数は奇数が与えられた場合、中心にある点の係数が確実に0であることは言うまでもない。
全コード
using FiniteDifferences
f′ = FiniteDifferenceMethod([-2, 0, 5], 1)
typeof(f′)
propertynames(f′)
f′.grid
f′.coefs
f′(sin, π/2)
f′(cos, π/2)
central_fdm(2, 1)
central_fdm(3, 2)
backward_fdm(4, 1)
forward_fdm(5, 1)
環境
- OS: Windows
- julia: v1.8.5