Проблема с setdiff в R при решении полинома :: полином - PullRequest
2 голосов
/ 16 апреля 2020

Может кто-нибудь объяснить, почему функция setdiff в R не работает в следующем примере? Обратите внимание, что это не имеет значения, если я использую базу 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

Основываясь на структуре моих массивов, я не могу понять, почему полиномиальные корни обрабатываются иначе, чем массивы, объявленные вручную.

1 Ответ

1 голос
/ 16 апреля 2020

Это не ошибка с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...