Подтвердить что ты не робот

Как представить многочлены с числовыми векторами в R

В R, как один будет представлять полиномиальные выражения и делать полиномиальную математику с числовыми векторными объектами? Например:

x1 <- c(2,1)  # 2 + x
x2 <- c(-1,3)  # -1 + 3*x

И хочу:

x1 * x2 # to return -2 + 5*x + 3*x^2 

Примечание: Я ответил на вопрос сегодня утром, а затем плакат, по-видимому, удалил его (заставив меня задаться вопросом, было ли это домашнее задание.) Поэтому я повторно отправляю вопрос из памяти.

4b9b3361

Ответ 1

Можно умножить коэффициенты непосредственно с помощью outer, а затем агрегировать результаты

x1 <- c(2,1)  # 2 + x
x2 <- c(-1,3)  # -1 + 3*x
tmp <- outer(x1, x2)
tapply(tmp, row(tmp) + col(tmp) - 1, sum)
# 1  2  3 
#-2  5  3

x1 <- c(2, 1) # 2 + x
x2 <- c(-1, 3, 2) # -1 + 3*x + 2*x^2
tmp <- outer(x1, x2)
tapply(tmp, row(tmp) + col(tmp) - 1, sum) # should give -2 + 5*x + 7*x^2 + 2*x^3
# 1  2  3  4 
#-2  5  7  2

как обсуждалось в комментариях, "-1" в коде не требуется. Когда придумали решение, которое помогло мне, потому что это позволило мне отобразить каждое местоположение в выводе outer туда, где оно попадет в конечный вектор. Если бы мы сделали "-2", вместо этого он отобразился бы на экспоненту по x в полученном многочлене. Но мы действительно не нуждаемся в этом, так что что-то вроде следующего будет работать так же хорошо:

tmp <- outer(x1, x2)
tapply(tmp, row(tmp) + col(tmp), sum)

Ответ 2

Используйте пакет polyom:

 require(polynom)
# Loading required package: polynom
# From the example for as.polynomial
 p <- as.polynomial(c(1,0,3,0))
 p
# 1 + 3*x^2 

 x1 <- c(2,1)
 x2 <- c(-1,3)
 px1 <- as.polynomial(x1)
 px2 <- as.polynomial(x2)

 px1*px2
# -2 + 5*x + 3*x^2 
 prod.p <- .Last.value
 str(prod.p)
# Class 'polynomial'  num [1:3] -2 5 3
 unclass(prod.p)
# [1] -2  5  3

Ответ 3

Полиномиальное умножение является сверткой коэффициентов

convolve(c(2,1),rev(c(-1,3)),type="open")
#[1] -2  5  3