Симпатичный:Отбросьте члены более высокого порядка в многочлене

StackOverflow https://stackoverflow.com//questions/25001896

Вопрос

Используя Sympy, скажем, у нас есть выражение f, которое является многочленом от символа "x" (и, возможно, от других символов).

Я хотел бы знать, что, если есть эффективный способ удалить все члены в f порядка, превышающего некоторое целое число n.

В качестве особого случая у меня есть очень сложная функция, но я хочу сохранить термины только до 2-го порядка в x.Каков эффективный способ сделать это?

Очевидным, не очень эффективным способом сделать это было бы для каждого m, меньшего n, взять m производных и установить x равным 0, чтобы получить коэффициент x ^ m.Таким образом, мы получаем каждый коэффициент, а затем восстанавливаем многочлен.Но принимать производные - не самая эффективная вещь.

Это было полезно?

Решение

Простой способ сделать это - добавить O(x**n) к выражению, подобному

In [23]: x + x**2 + x**4 + x**10 + O(x**3)
Out[23]:
     2    ⎛ 3⎞
x + x  + O⎝x ⎠

Если вы хотите позже удалить его, используйте removeO метод

In [24]: (x + x**2 + x**4 + x**10 + O(x**3)).removeO()
Out[24]:
 2
x  + x

Вы также можете использовать series возьмем разложение выражения в ряд.Разница здесь заключается в поведении, если в выражении оказывается неполиномиальный член:

In [25]: x + sin(x) + O(x**3)
Out[25]:
              ⎛ 3⎞
sin(x) + x + O⎝x ⎠

In [26]: (x + sin(x)).series(x, 0, 3)
Out[26]:
       ⎛ 3⎞
2⋅x + O⎝x ⎠

Другие советы

Если вы взгляните на документы полиномиального модуля:

http://docs.sympy.org/latest/modules/polys/Справка.html

Там будет много способов идти об этом, в зависимости от специфики вашей ситуации.Пара разных способов работать:

Использование .coeffs():

>>> f = 3 * x**3 + 2 * x**2 + x * y + y**3 + 1
>>> order = 2

>>> coeffs = Poly(f, x).coeffs()
>>> f_new = sum(x**n * coeffs[-(n+1)] for n in range(order+1)) # the +1 is to get 0th order
>>> f_new
2*x**2 + x*y + y**3 + 1
.

В качестве альтернативы, вы могли бы повторить предметы в .all_terms():

>>> all_terms = Poly(f, x).all_terms()
>>> sum(x**n * term for (n,), term in all_terms() if n <= order)
.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top