解决多项式::多项式时R中的setdiff问题

内特

在下面的示例中,有人可以解释为什么R中的setdiff函数失败吗?请注意,我使用基数R还是dplyr都没有关系。

#setdiff doesn't work
poly1 <- polynom::polynomial(c(-2,1))
poly2 <- polynom::polynomial(c(-4,0,1))
solve_poly1 <- solve(poly1)
solve_poly2 <- solve(poly2)
print(solve_poly2)
print(solve_poly1)
setdiff(solve_poly2, solve_poly1)
dplyr::setdiff(solve_poly2, solve_poly1)

#what is the structure?
str(solve_poly1)
str(solve_poly2)

#setdiff works
set1 <- c(2)
set2 <- c(-2,2)
setdiff(set2, set1)
dplyr::setdiff(set2, set1)

#what is the structure?
str(set1)
str(set2)

这是我的输出:

> #setdiff doesn't work
> poly1 <- polynom::polynomial(c(-2,1))

> poly2 <- polynom::polynomial(c(-4,0,1))

> solve_poly1 <- solve(poly1)

> solve_poly2 <- solve(poly2)

> print(solve_poly2)
[1] -2  2

> print(solve_poly1)
[1] 2

> setdiff(solve_poly2, solve_poly1)
[1] -2  2

> dplyr::setdiff(solve_poly2, solve_poly1)
[1] -2  2

> #what is the structure?
> str(solve_poly1)
 num 2

> str(solve_poly2)
 num [1:2] -2 2

> #setdiff works
> set1 <- c(2)

> set2 <- c(-2,2)

> setdiff(set2, set1)
[1] -2

> dplyr::setdiff(set2, set1)
[1] -2

> #what is the structure?
> str(set1)
 num 2

> str(set2)
 num [1:2] -2 2

基于数组的结构,我看不出为什么多项式根与手动声明的数组不同。

qdread

这不是setdiff的错误,而是R中浮点错误由于多项式是通过数值求解的,因此的值solve_poly2不精确为-2和2。

> solve_poly1 - set1
[1] 0
> solve_poly2 - set2
[1] -4.440892e-16 -4.440892e-16

为避免此问题,您可以定义一个函数以setdiff在公差范围内执行操作,我已根据相关答案对此进行了修改

setdiff_tolerance <- function(a, b, tol = 1e-7) {
  a[sapply(a, function(x) !any(abs(x - b) <= tol))]
}

setdiff_tolerance(solve_poly2, solve_poly1)
[1] -2

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章