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