2015-02-06 21 views
5

Tôi có phương trình đa thức bậc 4 và tôi cần phải tìm tất cả các gốc. đơn giản ví dụ:SymPy không thể giải phương trình đa thức bậc 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) 

Nếu a, b, c, d, e là tinh khiết sản, sau đó nó hoạt động tốt. Nhưng trong trường hợp của tôi, tất cả chúng đều là số phức. Sau đó, tôi đã có được gọi:

PolynomialError: 'cannot return general quartic solution' 

tôi thấy loại vấn đề tương tự, và thực hiện việc sửa chữa: Description of the issue. Fix of the issue

nhưng không thực sự hữu ích. Có một số loại vấn đề kỳ lạ, như bây giờ gọi là (như thay đổi trong việc sửa chữa):

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. 

Tuy nhiên, để xác định xem biểu thức trên là khác không là điều đơn giản nhất, do đó, không biết nơi mà vấn đề có thể là.

Trả lời

1

Nâng cấp lên phiên bản SymPy mới nhất hỗ trợ các giải pháp quartic tùy ý.

+0

Sau khi tôi nâng cấp lên sympy 0.7.6 (sử dụng python 3.4) có massage lỗi khác nhau : dòng 103 trong __nonzero__: tăng TypeError ("không thể xác định giá trị thực của \ n% s"% tự) – K4stan

+0

Có vẻ như đây là một lỗi đã được sửa trong phiên bản git của SymPy. – asmeurer

+0

Tôi đang sử dụng phân phối anaconda của python. Có thể cập nhật bằng cách nào đó để phiên bản git này, hoặc tôi phải viết lại một số kịch bản? – K4stan

0

Nếu bạn muốn có một giải pháp linh hoạt hơn, bạn có thể giải quyết cho x sử dụng tìm kiếm nhị phân với một cái gì đó như sau:

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) 
Các vấn đề liên quan