2015-07-04 9 views
14

ho risolto un'equazione di secondo grado utilizzando sympy:sympy: ordine di risultato da risolvere un'equazione di secondo grado

import sympy as sp 
q,qm,k,c0,c,vt,vm = sp.symbols('q qm k c0 c vt vm') 
c = (c0 * vt - q * vm)/vt 
eq1 = sp.Eq(qm * k * c/(1 + k * c) ,q) 
q_solve = sp.solve(eq1,q) 

Sulla base di alcuni test ho capito che solo q_solve[0] senso fisico. Sympy metterà sempre (b - sqrt(b**2 - 4*a*c))/2a in primo luogo? Immagino, potrebbe cambiare con un aggiornamento?

+0

Quale dei parametri definiti sopra (q, qm, k, ...) dovrebbe essere positivo, come definisci il "senso fisico" e quale tipo di test hai fatto, che tipo di valori hai usato, ...? – Cleb

+0

So che q_solve dovrebbe essere positivo e q_solve dovrebbe essere più piccolo qm. – Moritz

+0

E non ci sono valori fissi (c0 è probabilmente la velocità della luce)? O altre variabili che sono maggiori di 0? Quali valori prendi per il test? – Cleb

risposta

5

Un semplice test per rispondere alla tua domanda è quello di risolvere simbolicamente l'equazione quadratica usando sympy per di seguito:

import sympy as sp 
a, b, c, x = sp.symbols('a b c x') 
solve(a*x**2 + b*x + c, x) 

questo ti dà il risultato:

[(-b + sqrt(-4*a*c + b**2))/(2*a), -(b + sqrt(-4*a*c + b**2))/(2*a)] 

che mi porta a credere che in in generale l'ordine è prima la soluzione + sqrt() e poi la soluzione - sqrt().

Per il vostro programma di q_solve[0] ti dà:

(c0*k*vt + k*qm*vm + vt - sqrt(c0**2*k**2*vt**2 - 2*c0*k**2*qm*vm*vt + 2*c0*k*vt**2 + k**2*qm**2*vm**2 + 2*k*qm*vm*vt + vt**2))/(2*k*vm) 

questo è ancora il x= (-b + sqrt(b**2-4*a*c))/(2*a) risposta, il segno negativo dal termine b va via a seguito della distribuzione dei segni delle variabili all'interno della soluzione

+0

sì, questo è quello che ho fatto. Ero curioso di poter finire nei guai perché mi affido a quello – Moritz

+0

dalla documentazione che ho trovato su di esso, credo che questa sia la convenzione generale – bern

Problemi correlati