Sympy:Caída de los términos de orden superior en el polinomio
-
20-12-2019 - |
Pregunta
El uso de Sympy, digamos que tenemos una expresión de f, que es un polinomio de el Símbolo "x" (y potencialmente otros símbolos).
Me gustaría saber ¿qué pasa si no es una forma eficiente de colocar todos los términos en f de orden mayor que el entero n.
Como un caso especial, tengo una función muy compleja, pero quiero mantener sólo con plazos de hasta de 2º orden en x.¿Cuál es la forma eficiente de hacer esto?
Obvio, no muy eficiente manera de hacerlo sería para cada m menor que n, tome la m derivados y conjunto x a 0 para obtener el coeficiente de x^m.Obtenemos cada coeficiente de esta manera reconstruir el polinomio.Pero teniendo derivados no es la más eficiente.
Solución
Una manera fácil de hacer esto es agregar O(x**n)
a la expresión, como
In [23]: x + x**2 + x**4 + x**10 + O(x**3)
Out[23]:
2 ⎛ 3⎞
x + x + O⎝x ⎠
Si posteriormente desea eliminar, use la removeO
método
In [24]: (x + x**2 + x**4 + x**10 + O(x**3)).removeO()
Out[24]:
2
x + x
También puede utilizar series
para tomar la expansión de la serie de la expresión.La diferencia aquí es el comportamiento si no polinomio plazo termina en la expresión:
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 ⎠
Otros consejos
Si echa un vistazo al módulo polinomial DOCS:
http://docs.sympy.org/latest/modules/polys/referencia.html
Habrá muchas maneras de hacerlo, dependiendo de los detalles de su situación.Un par de formas diferentes que funcionarían:
utilizando .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, podría iterar los artículos en .all_terms()
:
>>> all_terms = Poly(f, x).all_terms()
>>> sum(x**n * term for (n,), term in all_terms() if n <= order)
Hay muchas funciones de manipulación en el módulo que debe poder trabajar con la expresión directamente en lugar de hacer cálculos / tomando derivados / etc.