Domanda

Usando Sympy, Dì che abbiamo un'espressione F, che è un polinomio del simbolo "x" (e di potenzialmente altri simboli).

Vorrei sapere cosa succede se c'è un modo efficiente per far cadere tutti i termini in F del ordine più grande di alcuni numeri interi n.

Come caso speciale ho una funzione molto complicata, ma voglio tenere solo i termini fino a 2 ° ordine in x.Qual è il modo efficiente per farlo?

Il modo ovvio, non molto efficiente per farlo sarebbe per ciascuna m meno di N, prendere D derivati e impostare X a 0 per ottenere il coefficiente di x ^ m.Otteniamo ogni coefficiente in questo modo quindi ricostruire il polinomiale.Ma prendere derivati non è la cosa più efficiente.

È stato utile?

Soluzione

Un modo semplice per farlo è aggiungere O(x**n) all'espressione, come

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

Se si desidera rimuovere in seguito, utilizzare il metodo removeO

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

È inoltre possibile utilizzare series per prendere l'espansione della serie dell'espressione.La differenza qui è il comportamento se un termine non polinomiale finisce nell'espressione:

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

Altri suggerimenti

Se dai un'occhiata al modulo polinomiale Documenti:

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

Ci saranno molti modi per farlo, a seconda delle specifiche della tua situazione.Un paio di modi diversi che funzionerebbero:

Utilizzo di .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
.

In alternativa, è possibile isolare gli elementi in .all_terms():

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

Ci sono molte funzioni di manipolazione nel modulo che dovresti essere in grado di lavorare direttamente con l'espressione direttamente piuttosto che fare calcoli / prendendo derivati / ecc.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top