【问题标题】:Integrating over a PCHIP Function通过 PCHIP 功能集成
【发布时间】:2014-10-18 03:50:12
【问题描述】:

如何在 R 中集成 PCHIP(分段三次 Hermite 插值多项式)函数? pchip {pracma} 返回插值点数据,而要进行积分我们当然需要一个函数。我在 pchip() 的帮助菜单下看到,“TODO: A `pchipfun' should be provided,”我不知道手动生成这有多难?还有其他建议吗?您可以将 n 次多项式回归拟合到插值点并对其进行积分以获得粗略的近似值,但这很快就会变得混乱......

这是 pchip {pracma} 的源代码,它返回点而不是函数,我想返回函数更多的是数学问题而不是 R 问题,但我愿意接受任何和所有建议!请!

function (xi, yi, x) 
{
    h <- diff(xi)
    delta <- diff(yi)/h
    d <- .pchipslopes(h, delta)
    n <- length(xi)
    a <- (3 * delta - 2 * d[1:(n - 1)] - d[2:n])/h
    b <- (d[1:(n - 1)] - 2 * delta + d[2:n])/h^2
    k <- rep(1, length(x))
    for (j in 2:(n - 1)) {
        k[xi[j] <= x] <- j
    }
    s <- x - xi[k]
    v <- yi[k] + s * (d[k] + s * (a[k] + s * b[k]))
    return(v)
}

谢谢!

【问题讨论】:

  • 它更像是单行:pchipfun &lt;- function(xi, yi) f &lt;- function(x) pchip(xi, yi, x)
  • 感谢您的评论!我不认为这条线做我想要的?例如,我不能在这里绘制 pchipfun 图表。当我尝试通过 pchipfun 进行积分时,我收到一个错误“函数评估给出了错误长度的结果”,有人建议使用矢量化,但积分会给出错误“函数评估给出了错误类型的结果”。

标签: r function math interpolation


【解决方案1】:

什么不适合你?您必须像这样定义一个函数使用 pchipfun()

> library(pracma)

> xs <- linspace(0, pi, 10)
> ys <- sin(xs)

> pchipfun <- function(xi, yi) function(x) pchip(xi, yi, x)

> f <- pchipfun(xs, ys)
> integrate(f, 0, pi)
2.000749 with absolute error < 0.00017

我在 R-Forge 上更新了 pracma 1.7.2 以包含 pchipfun() 并向pchip() 添加了一些错误检查。

【讨论】:

  • 啊!仍然在解决我做错了什么……不过效果很好,非常有帮助。谢谢。
猜你喜欢
  • 2021-11-30
  • 2021-10-26
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 2020-04-13
  • 2011-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多