Pab*_*ori 6 r spline cubic-spline
我需要在 R 脚本中使用“not-a-knot”三次样条进行插值。
尽管有一些用于样条的 R 软件包,但它们似乎都没有考虑“非结”类型,即使据说它是一种相当“流行”的三次样条类型,并且在 Matlab 中可用。
我担心“无结”三次样条还有另一个名称。它是三次样条,其中两个额外条件与第二个和前最后一个结中的三阶导数连续性有关(而不是像自然三次样条或其他选择那样将一阶导数固定在端点结处)。
通过挖掘一点,这似乎是在pracma::interp1
从?pracma::interp1
\n\n插值以查找 \xe2\x80\x98yi\xe2\x80\x99,即向量 \xe2\x80\x98xi\xe2\x80\x99 中的点处的基础函数的值。\n...\n方法 ` spline\' 使用 Moler 等人的样条方法,与同名的 Matlab 选项相同,但与 R 的样条函数略有不同。
\n
这没有提到“not-a-knot”,但我通过使用到达了那里sos::findFn("not-a-knot"),这将我带到了gsignal::pulstran()。该函数的“样条”方法被描述为“使用非结结束条件进行样条插值”;\nmethod=参数直接传递给pracma::interp1.
这是一个比较的例子:
\npracma::interp1pracma:::.ml.spline(不做任何参数检查、排序、重复删除......但允许推断。我不知道为什么做出这个限制。该包是在 r-forge 上pracma::interp1开发的,但我没有看到邮件列表等,您可以联系维护者或自己破解......)interp1RcppOctave软件包,但它已存档,我无法轻松获取要安装的软件包remotes::install_version("RcppOctave", version = "0.18-1")- 太多的配置漂移...)library(splines)\nlibrary(pracma)\nx <- 1:6\ny <- c(16, 18, 21, 17, 15, 12)\nxi0 <- seq(1, 6, by = 0.1)\nxi1 <- seq(1, 7, by = 0.1)\nys1 <- interp1(x, y, xi0, method = "spline")\nys2 <- predict(interpSpline(x, y), xi1)$y\nys3 <- spline(x, y, xout = xi1)$y\nys4 <- pracma:::.ml.spline(x, y, xi1)\nys5 <- scan("octave_out.mat", comment = "#") ## see below\n\npng("spline2.png")\npar(las=1, bty = "l", cex = 1.5, lwd = 2)\nplot(x,y, xlim = range(xi1), ylim = range(ys4),\n pch = 16, col = "gray")\ncvec <- c(palette()[c(1,2,4,6)],\n ## make last color semi-transparent so we can see the overlay\n adjustcolor(palette()[5], alpha.f = 0.4))\nmatlines(xi1, cbind(ys2,ys3,ys4, ys5) , col = cvec[1:4], lwd = 2)\nlines(xi0, ys1, lwd = 3, col = cvec[5])\nlegend("bottomleft",\n lty = c(1:4, 1),\n col = cvec,\n legend = c("interpSpline", "spline", ".ml.spine", "octave", "interp1"))\ndev.off()\nRun Code Online (Sandbox Code Playgroud)\n\n.ml.spline输出一致interp1在数据范围内一致(无外推)Octave 代码(在单独的 shell 中运行)
\nx = 1:6;\ny = [16, 18, 21, 17, 15, 12];\nxi1 = linspace(1, 7, 61);\npp = interp1(x, y, \'spline\', \'pp\');\nyy = ppval(pp, xi1);\nsave octave_out.mat yy\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
658 次 |
| 最近记录: |