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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top