在R

时间:2018-03-21 22:49:15

标签: r

我试图在R中设置一个计算多项式的函数

  • P(x)= c1 + c2 * x + c3 * x ^ 2 + ... + cn-1 * x ^ n-2 + cn * x ^ n-1

表示x和set系数c的各种值。

霍纳的方法是

  • 设置cn = bn
  • 对于i = n-1,n-1,...,2,1,设置bi = bi + 1 * x + ci
  • 返回输出

到目前为止我所拥有的:



hornerpoly1 <- function(x, coef, output = tail(coef,n=1), exp = seq_along(coef)-1) {
  for(i in 1:tail(exp,n=1)) {
    (output*x)+head(tail(coef,n=i),n=1)
  }
}
hornerpoly <- function(x, coef) {
  exp<-seq_along(coef)-1
  output<-tail(coef,n=1)
  if(length(coef)<2) {
    stop("Must be more than one coefficient")
  }
  sapply(x, hornerpoly1, coef, output,exp)
}
&#13;
&#13;
&#13;

我还需要对coef的长度进行错误检查,这是if语句的用途,但我并没有在这方面苦苦挣扎。当我尝试为x = 1:3和coef = c(4,16,-1)计算此函数时,我得到三个NULL语句,我无法弄清楚原因。任何有关如何更好地构造此函数或补救空输出的帮助表示赞赏。如果我能说得更清楚,请告诉我。

1 个答案:

答案 0 :(得分:1)

以下内容如何:

定义一个函数,它将x作为评估多项式的​​参数,coef作为系数的向量,按度数递减。因此,向量coef = c(-1, 16, 4)对应于P(x) = -x^2 + 16 * x + 4

Horner algorithm在以下函数中实现:

f.horner <- function(x, coef) {
    n <- length(coef);
    b <- rep(0, n);
    b[n] <- coef[n];
    while (n > 0) {
        n <- n - 1;
        b[n] <- coef[n] + b[n + 1] * x;
    }
    return(b[1]);
}

我们在x = 1:3 coef = c(-1, 16, 4)评估多项式:

sapply(1:3, f.horner, c(-1, 16, 4))
#[1] 19 47 83

一些最终评论:

  1. 请注意,coef的长度检查是在while (n > 0) {...}语句中实现的,即我们从最后一个开始经过系数,到达第一个系数时停止。
  2. 您无需将中间b值保存为函数中的向量。这纯粹是为了(我的)教育/解决问题的目的。重写代码以存储b的最后一个值,然后每次迭代更新b都很容易。然后,您还可以将f.horner向量化,以获取x值的向量,而不仅仅是标量。
相关问题