logo

ジュリアで有限差分を使用する方法 📂ジュリア

ジュリアで有限差分を使用する方法

概要

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