2015-02-06 3 views
5

У меня есть полиномиальное уравнение 4-го порядка, и мне нужно найти все корни. Простого пример:SymPy не может решить уравнение многочлена 4-го порядка

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) 

Если, б, в, д, е чисто вещественный, то это работает просто отлично. Но в моем случае все они являются комплексными числами. Тогда я действительно получил следующее:

PolynomialError: 'cannot return general quartic solution' 

я нахожу вид подобной проблемы, а также осуществлять исправление: Description of the issue. Fix of the issue

, но это действительно не помогает. Существует какой-то странной проблемой, так как теперь вызов (как изменить в исправлении):

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. 

Но чтобы определить, приведенное выше выражение отлично от нуля является наиболее простая вещь, так что не знаю, где эта проблема может быть.

ответ

1

Обновите самую последнюю версию SymPy, которая поддерживает произвольные квартирные решения.

+0

После того как я обновиться до SymPy 0.7.6 (с помощью питона 3.4) есть разные массаж ошибка : строка 103 в __nonzero__: raise TypeError («не может определить значение истинности \ n% s»% self) – K4stan

+0

Похоже, что это ошибка, которая была исправлена ​​в git-версии SymPy. – asmeurer

+0

Я использую anaconda распространение python. Можно ли как-то обновить эту версию git, или мне нужно переписать некоторые скрипты? – K4stan

0

Если вы хотите получить более гибкое решение, вы можете решить для х, используя бинарный поиск с чем-то вроде следующего:

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)