转换多项式

Converting polynomial

我想编写一个函数,将作为字符给出的多项式转换为命名向量。向量的条目应对应于多项式的系数并命名为 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^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 表达式,而且必须是多项式,而不是其他类型的表达式,否则函数将永远不会终止。我将留给您添加一些编辑和测试以确保满足这些条件。

用数字、space、*、space 和 x 替换可能后跟 spaces 和 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