2015-02-06 71 views
5

我有一个四阶多项式方程,我需要找到所有的根。 简单的例子:SymPy无法求解四阶多项式方程

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) 

如果A,B,C,d,e为纯实,然后 它工作得很好。 但在我的情况下,他们都是复杂的数字。然后,我没有得到拨打:

PolynomialError: 'cannot return general quartic solution' 

我找到一种类似的问题,并实现修复: Description of the issueFix 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

后,我更新0.7.6(使用Python 3.4)有不同的错误按摩sympy :__nonzero__中的第103行:raise TypeError(“无法确定\ n%s的真实值”%self) – K4stan 2015-02-06 19:17:05

+0

看起来像这是一个bug,已在git版本的SymPy中修复。 – asmeurer 2015-02-06 21:40:15

+0

我使用python的anaconda分布。是否有可能更新到这个git版本,或者我必须重写一些脚本? – K4stan 2015-02-07 12:19:37

0

如果你想有一个更灵活的解决方案,你可以使用的东西,如二进制搜索解决x的以下内容:

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)