Обеспечение одинаковой степени полиномов в массиве - PullRequest
0 голосов
/ 27 мая 2020

Итак, сейчас я кодирую вопрос из старого домашнего задания по линейной алгебре. У меня есть три полинома степени 2, и я преобразовываю их в полиномы степени 2.
Каждый многочлен p имеет вид: a0 + a1x + a2x^2

Это мои полиномы:
(1 - x + 0x^2, 1 + 2x + 0x^2, 0 + 0x + 0x^2)
Здесь они представлены в коде. Я использую numpy .polynomial.Polynomial:

basis_b = np.array([[Polynomial([1, -1, 0])], 
                    [Polynomial([1, 2, 0])], 
                    [Polynomial([0, 0, 1])]
                   ])

С преобразованием:
p'(2 - x) + 3*p
Представлено в коде как:

def trans_t(basis: np.array):
    return np.array([polynomial.polyadd(
                        polynomial.polymul(poly[0].deriv(), Polynomial([2, -1, 0])),
                        polynomial.polymul(Polynomial([3, 0, 0]), poly[0])) 
                    for poly in basis])

Первоначально я использовал python arithmeti c в функции, но я переключился на полиномиальную арифметику c в попытке решить проблему; это не сработало.

Итак, я получаю правильный ответ, применяя преобразование. Однако код возвращает многочлены степени 1, даже если многочлены имеют степень 2.

Вот мой результат при вызове функции:

change_of_basis(basis_b, basis_b, trans_t)
change_of_basis(basis_b, basis_b, trans_t)

array([[Polynomial([ 1., -2.], domain=[-1.,  1.], window=[-1.,  1.])],
       [Polynomial([7., 4.], domain=[-1.,  1.], window=[-1.,  1.])],
       [Polynomial([0., 4., 1.], domain=[-1.,  1.], window=[-1.,  1.])]],
      dtype=object)

Каким будет numpy способ гарантировать, что у меня есть коэффициент 0 для x ^ 2, если нет коэффициента для x ^ 2 при применении функции, так что она возвращает

Polynomial([1, -2, 0])
Polynomial([7, 4, 0])

1 Ответ

0 голосов
/ 27 мая 2020

Вот ваши полиномы

1 - 1x + 0x^2
1 + 2x + 0x^2
0 + 0x + 1x^2

Намного быстрее представить их в виде матрицы, чем работать с объектами Polynomial, поскольку в этот момент вы практически отказываетесь от всех преимуществ numpy и обработка вашей базы как списка python объектов.

Матрица не уменьшит ваши размеры, если вы не укажете ей:

p = np.array([
    [1, -1, 0],
    [1,  2, 0],
    [0,  0, 1]])

Строки представляют полиномы, а столбцы представляют коэффициенты. Сначала давайте определим столбец нулей, который мы будем использовать намного позже:

pad = np.zeros((p.shape[0], 1))

Производную можно довольно просто вычислить несколькими способами:

d = p[:, 1:] * np.arange(1, p.shape[1])

Вы можете сохранить градус, добавив площадку:

d_full = np.hstack((p[:, 1:] * np.arange(1, p.shape[1]), pad))

Умножение на (2 - x) возвращает градус:

t = np.hstack((pad, d * 2)) - np.hstack((d, pad)) + p * 3

Или, альтернативно:

t = d_full * 2 - np.roll(d_full, -1, axis=1) + p * 3

Вы можете преобразовать результат t в массив из Polynomial объектов, если вы используете sh.

...