转换多项式
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
我想编写一个函数,将作为字符给出的多项式转换为命名向量。向量的条目应对应于多项式的系数并命名为 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