Spec-Zone.ru › NumPy 2.0

Многочлены

Многочлены в 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

Как…

Устаревший (numpy.poly1d)

numpy.polynomial

Создать объект многочлена из коэффициентов [1]

p = np.poly1d([1, 2, 3])

p = Polynomial([3, 2, 1])

Создать объект многочлена из корней

r = np.poly([-1, 1]) p = np.poly1d(r)

p = Polynomial.fromroots([-1, 1])

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

np.polyfit(x, y, deg)

Polynomial.fit(x, y, deg)

[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

Документация для устаревших полиномов

  • Poly1d
    • Основы
    • Подгонка
    • Математический анализ
    • Арифметика

© 2005–2024 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/2.0/reference/routines.polynomials.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API