我正在将一些代码从 R 移植到 Julia,并且正在努力翻译 R 的spline函数。我需要一个 Julia 函数:
function spline_j(x,y,xout)
Run Code Online (Sandbox Code Playgroud)
产生与调用 R 函数相同的回报:
spline(x,y,,"fmm",,,xout)
Run Code Online (Sandbox Code Playgroud)
即使用 Forsyth、Malcolm 和 Moler 的方法,这是 R 中的默认方法。
Myx和y总是一维的,但 的点x不规则间隔。这种不规则性似乎排除了使用纯 JuliaInterpolations包的可能性,因为文档指出“目前仅LinearInterpolation支持不规则网格”。
该Dierckx包支持不规则x,所以一个候选人spline_j是:
using Dierckx
function spline_j(x, y, xout)
spl = Dierckx.Spline1D(x, y)
spl(xout)
end
Run Code Online (Sandbox Code Playgroud)
spline如果method是,则匹配 R 的函数"natural"。
是否可以"fmm"在 Julia 中复制 R 的方法?
继这个PR https://github.com/JuliaMath/Interpolations.jl/pull/238(合并为#243)之后,Interpolations.jl实际上有许多优秀的支持不规则网格的单调样条插值算法,包括Fritsch-Carlson( 1980)、弗里奇-巴特兰(1984)和史蒂芬(1990)。
它似乎还没有反映在文档中,但选项在以下 git diff中可见
例如:
using Interpolations, Plots
x = sort(2*rand(10))
y = x.^2 .+ rand.()
itp = interpolate(x,y,FritschCarlsonMonotonicInterpolation())
xq = minimum(x):0.01:maximum(x)
plot(x,y, seriestype=:scatter, label="Data", legend=:topleft, framestyle=:box)
plot!(xq, itp.(xq), label="Interpolation")
Run Code Online (Sandbox Code Playgroud)
如果您喜欢不同的插值方法,也可以用
FiniteDifferenceMonotonicInterpolation、FritschButlandMonotonicInterpolation、 或SteffenMonotonicInterpolation代替FritschCarlsonMonotonicInterpolation。