logo

줄리아에서 유한차분 사용하는 법 📂줄리아

줄리아에서 유한차분 사용하는 법

개요

줄리아에서 유한차분법을 사용하려면, 더 정확히 유한차분의 계수를 구하기 위해서는 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}

위 예시는 함수의 가운데 점, 왼쪽 두번째 점, 오른쪽 다섯번째 점을 사용해 1계도함수를 계산할 때 세 점의 가중치를 구해준다. 기본적으로 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 이 두가지다.

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이 필요하다면 위와 같이 이미 만들어둔 함수를 쓰는 게 더 편하다. 첫번째 인수는 함수의 종류에 따라서 몇 개의 점을 사용할지, 두번째 인수 $n$ 은 $n$계도함수를 구할 것임을 정한다. 당연하지만 central_fdm()의 첫번째 인수는 홀수로 주어졌을 때 정중앙에 있는 점의 계수가 반드시 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