2015-07-04 16 views
14

I rozwiązać równanie kwadratowe korzystając sympy:sympy: kolejność wynikają z rozwiązania równania kwadratowego

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) 

podstawie pewnego badania Pomyślałem, że tylko q_solve[0] sprawia fizyczny sens. Czy sympy zawsze umieszcza (b - sqrt(b**2 - 4*a*c))/2a na pierwszym miejscu? Sądzę, że może się to zmienić wraz z uaktualnieniem?

+0

Który z powyższych zdefiniowanych parametrów (q, qm, k, ...) ma być pozytywny, jak definiujesz "zmysł fizyczny" i jaki rodzaj testowania wykonałeś, jakiego rodzaju wartości użyłeś, ...? – Cleb

+0

Wiem, że q_solve powinno być pozytywne, a q_solve powinno być mniejsze qm. – Moritz

+0

I nie ma ustalonych wartości (c0 to prawdopodobnie prędkość światła)? Lub inne zmienne, które są większe niż 0? Jakie wartości bierzesz do testowania? – Cleb

Odpowiedz

5

Prosty test, aby odpowiedzieć na to pytanie jest symbolicznie rozwiązać równanie kwadratowe użyciu sympy za poniżej:

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

to daje wynik:

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

która prowadzi mnie do przypuszczenia, że ​​w ogólna kolejność to najpierw rozwiązanie + sqrt(), a następnie rozwiązanie - sqrt().

Dla programu q_solve[0] daje:

(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) 

to wciąż x= (-b + sqrt(b**2-4*a*c))/(2*a) odpowiedź, negatywny znak od terminu b odchodzi w wyniku podziału znaków zmiennych w roztworze

+0

Tak, właśnie to zrobiłem. Byłem ciekawy, czy mogę wpaść w kłopoty, ponieważ polegam na tym – Moritz

+0

z dokumentacji, którą mogłem znaleźć na tej stronie, uważam, że jest to ogólna konwencja – bern