0

您好,我在 Matlab 中尝试过样条插值。我有以下数据:

N = 36

我也有数据“最大”

>  max
    1
    5
    7
    10
    12
    14
    16
    20
    24
    27
    31
    33
    35

和“hmax”

>  hmax
    157
    124
    207
    208
    170
    178
    163
    160
    146
    151
    160
    173
    172

然后我想用Matlab用样条插值创建包络,代码如下:

maxenv = spline(max,hmax,1:N);

该代码将显示结果

>  maxenv
    157
    86.564389
    67.53534827
    84.9886334
    124
    169.6452037
    207
    224.3964594
    223.1919113
    208
    185.4207867
    170
    172.1744995
    178
    172.7562154
    163
    158.1641553
    157.9081319
    159.4480425
    160
    157.5512022
    153.1731874
    148.7085789
    146
    146.3035305
    148.5290764
    151
    152.5114649
    153.7458399
    155.857295
    160
    166.578645
    173
    175.921355
    172
    157.893225

现在,我想用相同的代码在 R 中创建带有样条插值的信封:

maxenv <- spline(max,hmax,n=36)

但是我在 Matlab 中的代码得到了不同的结果。如何在 R 中获得相同的结果?或者 Matlab 和 R 上的“样条”是不同的功能?

非常感谢你

4

1 回答 1

1

spline函数中,n指定“跨越区间 [xmin, xmax] 的等距点的数量”。但是,您的 Matlab 点包括x=36最大输入数据点之外的 1,x=35因此 R 和 Matlab 结果不是相同的 x 值。为了进行比较,您可能希望使用xout= 序列 1:36 来进行最直接的比较。通过这种校正并使用默认的 R 样条方法(Forsythe、Malcolm 和 Moler),最大的差异在于初始值,这可能与 R 和 Matlab 使用稍微不同的方法开始样条插值有关。

已编辑

xx <- 1:36
maxenvR <- data.frame(spline(max, hmax, xout=xx, method="fmm"))
maxenvRnat <-  data.frame(spline(max, hmax, xout=xx, method="natural"))
plot(xx, maxenv[1:length(xx)], type="l", col="black", ylab = "hmax")
lines(maxenvR, col="blue")
lines(maxenvRnat, col="green")
points(max, hmax, col="red", pch=16)
legend("bottomright", legend=c("Matlab spline", "R fmm spline", "R natural spline", "Data Points"), 
       text.col=c("black","blue","green", "red"), col=c("black","blue","green","red"), lty="solid")

插值样条算法可能因对数据末端边界条件的处理而有所不同。对于一般样条插值,Rspline允许选择使用natural三次样条(将插值三次样条在数据的每一端的二阶导数设置为零)或将fmm三次多项式拟合到数据每一端的前四个点的方法和然后将它们与样条方程连接起来。从图中可以看出,这可能会在前几个点上给出非常不同的结果,但随后趋向于收敛于内部点。它的样条函数的 Matlab 文档似乎没有描述它如何处理边界条件,我无法访问它提供的参考,但从图中,fmmR 的方法。内插点与至少三位有效数字一致。然而,基于这个例子,看起来splineMatlab 和 R 的函数fmm 并不相同。
在此处输入图像描述

于 2015-12-09T15:59:51.037 回答