Question

En utilisant Sympy, disons que nous avons une expression f, qui est un polynôme du symbole « x » (et potentiellement d'autres symboles).

J'aimerais savoir s'il existe un moyen efficace de supprimer tous les termes dans f d'un ordre supérieur à un entier n.

Comme cas particulier, j'ai une fonction très compliquée mais je souhaite conserver uniquement les termes jusqu'au 2ème ordre en x.Quelle est la manière efficace de procéder ?

La manière évidente, mais pas très efficace, de le faire serait, pour chaque m inférieur à n, de prendre m dérivées et de définir x sur 0 pour obtenir le coefficient de x^m.Nous obtenons ainsi chaque coefficient puis reconstruisons le polynôme.Mais prendre des produits dérivés n’est pas la chose la plus efficace.

Était-ce utile?

La solution

Un moyen simple de procéder consiste à ajouter O(x**n) à l'expression, comme

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

Si vous souhaitez le supprimer ultérieurement, utilisez le removeO méthode

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

Vous pouvez aussi utiliser series pour prendre le développement en série de l'expression.La différence ici réside dans le comportement si un terme non polynomial se retrouve dans l'expression :

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 ⎠

Autres conseils

Si vous jetez un œil à la documentation du module polynomial :

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

il existe de nombreuses façons de procéder, en fonction des spécificités de votre situation.Plusieurs manières différentes de fonctionner :

En utilisant .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

Alternativement, vous pouvez parcourir les éléments dans .all_terms():

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

Il existe de nombreuses fonctions de manipulation dans le module qui vous permettront de travailler directement avec l'expression plutôt que de faire des calculs/prendre des dérivées/etc.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top