我试图在R中设置一个计算多项式的函数
表示x和set系数c的各种值。
霍纳的方法是
到目前为止我所拥有的:
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;
我还需要对coef的长度进行错误检查,这是if语句的用途,但我并没有在这方面苦苦挣扎。当我尝试为x = 1:3和coef = c(4,16,-1)计算此函数时,我得到三个NULL语句,我无法弄清楚原因。任何有关如何更好地构造此函数或补救空输出的帮助表示赞赏。如果我能说得更清楚,请告诉我。
答案 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
一些最终评论:
coef
的长度检查是在while (n > 0) {...}
语句中实现的,即我们从最后一个开始经过系数,到达第一个系数时停止。b
值保存为函数中的向量。这纯粹是为了(我的)教育/解决问题的目的。重写代码以存储b
的最后一个值,然后每次迭代更新b
都很容易。然后,您还可以将f.horner
向量化,以获取x
值的向量,而不仅仅是标量。