Julia 中具有不规则网格的三次样条插值

Phi*_*ell 5 r julia

我正在将一些代码从 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 中的默认方法。

Myxy总是一维的,但 的点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 的方法?

cbk*_*cbk 2

继这个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)

不规则网格上的 Fritsch-Carlson 单调插值

如果您喜欢不同的插值方法,也可以用 FiniteDifferenceMonotonicInterpolationFritschButlandMonotonicInterpolation、 或SteffenMonotonicInterpolation代替FritschCarlsonMonotonicInterpolation