2015-02-06 5 views
5

Ich habe eine Polynomgleichung der 4. Ordnung und muss alle Wurzeln finden. Einfaches Beispiel:SymPy kann die Polynomgleichung der 4. Ordnung nicht lösen

from sympy import (Symbol,solve,I) 

a=4+5*I; b=3+7*I; c=12-56*I; d=33+56*I; e=345-67*I; x=Symbol('x') 
eq=a*x**4 + b*x**3 + c*x**2 + d*x +e 
solve(eq,x) 

Wenn a, b, c, d, e sind reine real, dann es gut funktionieren. Aber in meinem Fall sind alle von ihnen komplexe Zahlen. Dann habe ich rufen erhalten:

PolynomialError: 'cannot return general quartic solution' 

Ich Art von ähnlichem Problem finden und implementieren, die fix: Description of the issue. Fix of the issue

aber es hilft nicht wirklich. Es gibt eine Art seltsamen Problem, wie es jetzt den Anruf (wie in dem Update geändert):

PolynomialError: Cannot determine if `-((12 - 56*I)/(4 + 5*I) - 3*(3 + 7*I)**2/(8*(4 + 5*I)**2))**2/12 + (3 + 7*I)*((33 + 56*I)/(4*(4 + 5*I)) + (3 + 7*I)*(3*(3 + 7*I)**2/(256*(4 + 5*I)**2) - (12 - 56*I)/(16*(4 + 5*I)))/(4 + 5*I))/(4 + 5*I) - (345 - 67*I)/(4 + 5*I)` is nonzero. 

Aber um zu bestimmen, ob die Expression über ungleich Null ist, ist die einfachste Sache, also nicht wissen, wo das Problem könnte sein.

Antwort

1

Aktualisieren Sie auf die neueste Version von SymPy, die beliebige quartic Lösungen unterstützt.

+0

Nachdem ich aktualisiere 0.7.6 (mit Python 3.4) sympy gibt es verschiedene Fehler Massage : Zeile 103 in __nonzero__: raise TypeError ("kann Wahrheitswert von \ n% s"% self nicht bestimmen) – K4stan

+0

Sieht aus wie dies ein Fehler ist, der in der Git-Version von SymPy behoben wurde. – asmeurer

+0

Ich benutze Anaconda Verteilung von Python. Kann ich irgendwie auf diese Git-Version updaten, oder muss ich einige Skripte neu schreiben? – K4stan

0

Wenn Sie eine flexiblere Lösung wollen, könnten Sie für x unter Verwendung von binärer Suche mit etwa wie folgt lösen:

def maybeRightX(maybeX, polys): 
    sum = 0 
    for i in range(len(polys)): 
     sum += polys[i]*(maybeX ** i) 
    return sum 

def solve(y, polys): 
    lo = 0 
    hi = y 
    while lo <= hi: 
     mid = (lo + hi)//2 
     if (maybeRightX(mid, polys)) < y: 
      lo = mid + 1 
     else: 
      hi = mid - 1 
    return (hi + 1) 
Verwandte Themen