Многочлены
Многочлены в NumPy можно создавать, обрабатывать и даже аппроксимировать с помощью удобных классов пакета numpy.polynomial, представленного в NumPy 1.4.
До NumPy 1.4 классом по умолчанию был numpy.poly1d, и он по-прежнему доступен для обеспечения обратной совместимости. Однако, новый пакет polynomial package более полный, и его convenience classes обеспечивает более согласованный и надежный интерфейс для работы с полиномиальными выражениями. Поэтому рекомендуется использовать numpy.polynomial для нового кода.
Примечание
Терминология
Термин модуль многочленов относится к старому API, определенному в numpy.lib.polynomial, который включает класс numpy.poly1d и полиномиальные функции с префиксом poly, доступные из пространства имен numpy (например, numpy.polyadd, numpy.polyval, numpy.polyfit и т. д.).
Термин пакет многочленов относится к новому API, определенному в numpy.polynomial, который включает удобные классы для разных типов многочленов (numpy.polynomial.Polynomial, numpy.polynomial.Chebyshev, и т. д.).
Переход от numpy.poly1d к numpy.polynomial
Как отмечалось выше, poly1d class и связанные с ним функции, определенные в numpy.lib.polynomial, такие как numpy.polyfit и numpy.poly, считаются устаревшими и не должны использоваться в новом коде. С версии NumPy 1.4 для работы с многочленами предпочтительно использовать пакет numpy.polynomial.
Быстрый справочник
В следующей таблице показаны некоторые основные различия между устаревшим модулем многочленов и пакетом многочленов для общих задач. Для краткости импортирован класс Polynomial:
from numpy.polynomial import Polynomial
Как… | Устаревший ( | |
Создать объект многочлена из коэффициентов 1 |
|
|
Создать объект многочлена из корней |
|
|
Аппроксимировать многочлен степени |
|
|
- 1
-
Обратите внимание на обратный порядок коэффициентов
Руководство по переходу
Существуют значительные различия между numpy.lib.polynomial и numpy.polynomial. Наиболее существенное различие заключается в порядке коэффициентов для полиномиальных выражений. Все процедуры в numpy.polynomial работают с рядами, коэффициенты которых идут от нулевой степени вверх, что является обратным порядком соглашения poly1d. Легко запомнить это: индексы соответствуют степени, т.е. coef[i] — коэффициент члена степени i.
Хотя различие в соглашении может быть запутанным, преобразование из устаревшего полиномиального API в новый API является простым. Например, следующий пример демонстрирует, как преобразовать экземпляр numpy.poly1d, представляющий выражение \(x^{2} + 2x + 3\), в экземпляр Polynomial, представляющий то же выражение:
>>> p1d = np.poly1d([1, 2, 3]) >>> p = np.polynomial.Polynomial(p1d.coef[::-1])
Помимо атрибута coef, многочлены из пакета многочленов также имеют атрибуты domain и window. Эти атрибуты наиболее важны при аппроксимации многочленов по данным, хотя следует отметить, что многочлены с различными атрибутами domain и window не считаются равными и не могут быть смешаны в арифметических операциях:
>>> p1 = np.polynomial.Polynomial([1, 2, 3])
>>> p1
Polynomial([1., 2., 3.], domain=[-1, 1], window=[-1, 1])
>>> p2 = np.polynomial.Polynomial([1, 2, 3], domain=[-2, 2])
>>> p1 == p2
False
>>> p1 + p2
Traceback (most recent call last):
...
TypeError: Domains differ
Дополнительные сведения об атрибутах domain и window см. в документации по удобным классам.
Еще одно важное различие между устаревшим модулем многочленов и пакетом многочленов — это аппроксимация многочленов. В старом модуле аппроксимация выполнялась с помощью функции polyfit. В пакете многочленов предпочтительнее использовать метод класса fit. Например, рассмотрим простую линейную аппроксимацию следующих данных:
In [1]: rng = np.random.default_rng() In [2]: x = np.arange(10) In [3]: y = np.arange(10) + rng.standard_normal(10)
С помощью устаревшего модуля многочленов линейная аппроксимация (т.е. многочлен степени 1) могла быть применена к этим данным с помощью polyfit:
In [4]: np.polyfit(x, y, deg=1) Out[4]: array([ 1.13710724, -0.50899358])
С новым полиномиальным API предпочтительнее использовать метод класса fit:
In [5]: p_fitted = np.polynomial.Polynomial.fit(x, y, deg=1) In [6]: p_fitted Out[6]: Polynomial([4.607989 , 5.11698258], domain=[0., 9.], window=[-1., 1.])
Обратите внимание, что коэффициенты приведены в масштабированной области, определенной линейным соответствием между window и domain. convert можно использовать для получения коэффициентов в области данных без масштабирования.
In [7]: p_fitted.convert() Out[7]: Polynomial([-0.50899358, 1.13710724], domain=[-1., 1.], window=[-1., 1.])
Документация для пакета многочленов
В дополнение к стандартным многочленам степенной зависимости, пакет многочленов предоставляет несколько дополнительных типов многочленов, включая Чебышева, Эрмита (два подтипа), Лагера и Лежандра. Каждый из них имеет соответствующий convenience class, доступный из пространства имен numpy.polynomial, который обеспечивает согласованный интерфейс для работы с многочленами независимо от их типа.
Документация, относящаяся к конкретным функциям, определенным для каждого типа многочлена индивидуально, доступна в соответствующей документации модуля:
- Многочлены степенной зависимости (
numpy.polynomial.polynomial) - Ряды Чебышева (
numpy.polynomial.chebyshev) - Ряды Эрмита, «физики» (
numpy.polynomial.hermite) - Ряды ЭрмитаЭ, «вероятностники» (
numpy.polynomial.hermite_e) - Ряды Лагера (
numpy.polynomial.laguerre) - Ряды Лежандра (
numpy.polynomial.legendre) - Polyutils
Документация для устаревших многочленов
© 2005–2022 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.21/reference/routines.polynomials.html