Pergunta

Usando Sympy, digamos que temos uma expressão f, que é um polinômio do símbolo "x" (e potencialmente de outros símbolos).

Gostaria de saber se existe uma maneira eficiente de eliminar todos os termos em f de ordem maior que algum número inteiro n.

Como caso especial, tenho uma função muito complicada, mas quero manter apenas os termos de 2ª ordem em x.Qual é a maneira eficiente de fazer isso?

A maneira óbvia e não muito eficiente de fazer isso seria para cada m menor que n, tomar m derivadas e definir x como 0 para obter o coeficiente de x^m.Obtemos cada coeficiente desta forma e depois reconstruímos o polinômio.Mas tomar derivativos não é a coisa mais eficiente.

Foi útil?

Solução

Uma maneira fácil de fazer isso é adicionar O(x**n) para a expressão, como

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

Se você quiser removê-lo posteriormente, use o removeO método

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

Você também pode usar series para calcular a expansão em série da expressão.A diferença aqui é o comportamento se um termo não polinomial terminar na expressão:

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 ⎠

Outras dicas

Se você der uma olhada na documentação do módulo polinomial:

http://docs.sympy.org/latest/modules/polys/reference.html

haverá muitas maneiras de fazer isso, dependendo das especificidades da sua situação.Algumas maneiras diferentes que funcionariam:

Usando .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

Alternativamente, você poderia iterar sobre os itens em .all_terms():

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

Existem muitas funções de manipulação no módulo que você deve poder trabalhar diretamente com a expressão, em vez de fazer cálculos/derivadas/etc.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top