【发布时间】:2022-06-20 17:44:07
【问题描述】:
我想编写一个将多项式转换为命名向量的函数。向量的条目应与多项式的系数相对应,并命名为x^n,其中n为对应的指数。
输出应如下所示:
> function("2x^5 + x + 3x^5 - 1 + 4x")
x^0 x^1 x^2 x^3 x^4 x^5
-1 5 0 0 0 5
干杯!
【问题讨论】:
我想编写一个将多项式转换为命名向量的函数。向量的条目应与多项式的系数相对应,并命名为x^n,其中n为对应的指数。
输出应如下所示:
> function("2x^5 + x + 3x^5 - 1 + 4x")
x^0 x^1 x^2 x^3 x^4 x^5
-1 5 0 0 0 5
干杯!
【问题讨论】:
用数字、空格、*、空格和 x 替换 digit 可能后跟空格,然后将 x 替换为字符串 s 表示有效的 R 表达式。然后使用 polynom 包解析并评估包含 x 作为多项式的表达式,然后使用 as.numeric 将其转换为向量并使用 setNames 添加名称。
library(polynom)
poly2vec <- function(string) {
s <- gsub("(\\d) *x", "\\1 * x", string)
v <- as.numeric(eval(str2lang(s), list(x = polynomial())))
setNames(v, paste0("x^", seq(0, length = length(v))))
}
poly2vec("2x^5 + x + 3x^5 - 1 + 4x")
## x^0 x^1 x^2 x^3 x^4 x^5
## -1 5 0 0 0 5
另外,也可以使用 pracma 中的 taylor 函数,但它的缺点是涉及浮点运算。
library(pracma)
s <- gsub("(\\d) *x", "\\1 * x", "2x^5 + x + 3x^5 - 1 + 4x")
f <- function(x) {}
body(f) <- str2lang(s)
taylor(f, 0, 5)
## [1] 5.000006e+00 0.000000e+00 1.369355e-05 0.000000e+00 5.000000e+00
## [6] -1.000000e+00
【讨论】:
由于您的多项式可能包含两次相同的幂(例如您的示例中的x^5),您需要进行一些操作来简化它。最简单的方法是在零处评估它及其导数。这里有一些代码可以做到这一点:
polycoefs <- function(poly) {
expr <- parse(text = poly)
result <- numeric()
env <- list2env(list(x = 0), parent = baseenv())
i <- 0
while (!identical(expr, 0)) {
coef <- eval(expr, envir = env)/factorial(i)
names(coef) <- paste0("x^", i)
result <- c(result, coef)
expr <- D(expr, "x")
i <- i + 1
}
result
}
polycoefs("2*x^5 + x + 3*x^5 - 1 + 4*x")
#> x^0 x^1 x^2 x^3 x^4 x^5
#> -1 5 0 0 0 5
由reprex package (v2.0.1) 于 2022-05-23 创建
请注意,多项式必须是合法的 R 表达式,并且必须是多项式,而不是其他类型的表达式,否则函数将永远不会终止。我将留给您添加一些编辑和测试以确保满足这些条件。
【讨论】: