2015-02-06 19 views
5

4. dereceden bir polinom denklemine sahibim ve tüm kökleri bulmam gerekiyor. Basit bir örnek:SymPy, 4. sıradaki polinom denklemini çözemez

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) 

bir olursa, b, c, d, e, sonra gayet işe, saf gerçek. Ama benim durumumda hepsi karmaşık sayılar.

PolynomialError: 'cannot return general quartic solution' 

ben tür benzer bir sorun bulmak ve düzeltmeyi uygulamak: O zaman diyoruz aldın Description of the issue. Fix of the issue

ama gerçekten yardımcı olmuyor. Garip tür sorun vardır artık çağrı (düzeltme değişti gibi) geçerli:

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. 

Ama ifadesi yukarıda sıfırdan farklı en basit şey olup olmadığını belirlemek için, yani nereye sorunu bilmiyorum olabilirdi. keyfi quartic çözümleri destekler SymPy en son sürümüne

cevap

1

Yükseltme. Eğer daha esnek bir çözüm istiyorsanız, gibi bir şey ile ikili aramayı kullanarak x için

+0

i 0.7.6 farklı hata masaj vardır (piton 3.4 kullanarak) sympy güncellemek sonra : __nonzero__ satır 103: Yükseltme TypeError ("\ n% s" nin gerçek değerini belirleyemiyorum "% self) – K4stan

+0

Bunun, SymPy'nin git sürümünde giderilen bir hata olduğu anlaşılıyor. – asmeurer

+0

Python'un anaconda dağılımını kullanıyorum. Bir şekilde bu git sürümüne güncelleme yapmak mümkün mü, yoksa bazı komut dosyalarını yeniden yazmam gerekiyor mu? – K4stan

0

çözebiliriz aşağıdadır:

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)