【问题标题】:Converting polynomial转换多项式
【发布时间】: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

干杯!

【问题讨论】:

    标签: r function


    【解决方案1】:

    用数字、空格、*、空格和 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
    

    【讨论】:

      【解决方案2】:

      由于您的多项式可能包含两次相同的幂(例如您的示例中的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 表达式,并且必须是多项式,而不是其他类型的表达式,否则函数将永远不会终止。我将留给您添加一些编辑和测试以确保满足这些条件。

      【讨论】:

      • 非常感谢,您的代码对我有用。是否可以修改代码以使函数在多项式中未明确指定乘号的情况下也能正常工作?
      • 是的,这就是最后一段的内容。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-16
      • 2018-07-12
      • 2013-11-04
      • 2016-02-28
      相关资源
      最近更新 更多