Многочлены
Многочлены в 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, который включает удобные классы для различных типов многочленов (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] |
|
|
Создать объект многочлена из корней |
|
|
Аппроксимировать многочлен степени |
|
|
Руководство по переходу
Существуют значительные различия между numpy.lib.polynomial и numpy.polynomial. Наиболее значимое различие заключается в порядке коэффициентов для полиномиальных выражений. Все функции в numpy.polynomial работают с последовательностями, коэффициенты которых идут от нулевой степени вверх, что является обратным порядком соглашения poly1d. Просто запомните, что индексы соответствуют степени, т.е., coef[i] — это коэффициент члена степени i.
Хотя различие в соглашениях может быть запутанным, переход от устаревшего 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.], symbol='x')
>>> 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.05582448, -0.41198822])
С новым API многочленов предпочтительнее использовать метод класса fit:
In [5]: p_fitted = np.polynomial.Polynomial.fit(x, y, deg=1) In [6]: p_fitted Out[6]: Polynomial([4.33922194, 4.75121016], domain=[0., 9.], window=[-1., 1.], symbol='x')
Обратите внимание, что коэффициенты заданы в масштабированном домене, определённом линейным отображением между window и domain. convert можно использовать для получения коэффициентов в не масштабированном домене данных.
In [7]: p_fitted.convert() Out[7]: Polynomial([-0.41198822, 1.05582448], domain=[-1., 1.], window=[-1., 1.], symbol='x')
Документация для пакета многочленов
Помимо стандартных многочленов степенных рядов, пакет многочленов предоставляет несколько дополнительных типов многочленов, включая многочлены Чебышёва, Эрмита (два подтипа), Лагера и Лежандра. Каждый из них имеет связанный 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–2024 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/2.0/reference/routines.polynomials.html