2017-03-29 48 views
1

我開始學習sympy。我使用sympy嘗試了一個集成問題,並且我得到以下異常:如何處理由sympy集成提出的異常

File "/home/me/anaconda3/lib/python3.6/site- 
     packages/sympy/polys/domains/domain.py", 
     line 146, 
    in convert raise CoercionFailed("can't convert %s of type %s to %s" % 
    (element, type(element), self)) 

sympy.polys.polyerrors.CoercionFailed: can't convert (_x4*a + a)**0.5 of 
type 
<class 'sympy.core.power.Pow'> to RR(a,f,n,A,B) 
    [_A0,_A1,_A2,_A3,_A4,_A5,_A6,_A7,_A8,_A9,_A10,_A11, 
    _A12,_A13,_A14,_A15,_A16,_A17 
... 
raise ValueError("expected an expression convertible to a polynomial in %s, 
    got %s" % (self, expr)) 
    ValueError: expected an expression convertible to a polynomial in 
    Polynomial ring in 

完整的消息很長。我很可能做錯了什麼?因爲我剛剛開始學習sympy。這是我用

代碼
from sympy import * 
import traceback 
import logging 

logging.basicConfig(filename='sympy_err.log') 

x, A, B, f, e, c, d, a, b, n = symbols('x A B f e c d a b n', real=True) 
try: 
    integrate((d*sin(f*x+e))**n*(a+a*sin(f*x+e))**(5/2)*(A+B*sin(f*x+e)),x) 
except Exception as e: 
    logging.error(traceback.format_exc()) 

預期反導是

Mathematica graphics

-((2*a^3*(2*B*(115 + 203*n + 104*n^2 + 16*n^3) + A* 
(301 + 478*n + 224*n^2 + 32*n^3))* 
Cos[e + f*x]*Hypergeometric2F1[1/2, -n, 3/2, 1 - Sin[e + f*x]]* 
(d*Sin[e + f*x])^n)/ 
    Sin[e + f*x]^n/(f*(3 + 2*n)*(5 + 2*n)*(7 + 2*n)* 
    Sqrt[a + a*Sin[e + f*x]])) - 
    (2*a^3*(2*B*(35 + 23*n + 4*n^2) + A*(77 + 50*n + 8*n^2))* 
    Cos[e + f*x]* 
    (d*Sin[e + f*x])^(1 + n))/(d*f*(3 + 2*n)*(5 + 2*n)*(7 + 2*n)* 
    Sqrt[a + a*Sin[e + f*x]]) - 
    (2*a^2*(2*B*(5 + n) + A*(7 + 2*n))*Cos[e + f*x]* 
    (d*Sin[e + f*x])^(1 + n)* 
    Sqrt[a + a*Sin[e + f*x]])/(d*f*(5 + 2*n)* 
    (7 + 2*n)) - (2*a*B*Cos[e + f*x]*(d*Sin[e + f*x])^(1 + n)* 
    (a + a*Sin[e + f*x])^(3/2))/(d*f*(7 + 2*n)) 

我的問題是:是我趕上從上面sympy OK例外呢?因爲我不知道會有什麼例外情況會發生。如果sympy無法解決積分問題,拋出異常,這是否是可以預料的?

我正在使用Linux,剛剛在Linux上安裝了最新的Anaconda 64位。

code>conda list sympy 
# packages in environment at /home/me/anaconda3: 
# 
sympy      1.0      py36_0 
+0

它有點依賴,那種異常本質上意味着你做錯了什麼 - 取決於你可能想要中止的程序。這個問題大致相當於「我應該通過捕捉一個(假設的)除以零算法進行算術運算」。 – pvg

回答

1

您看到的異常應該被認爲是SymPy中的一個錯誤。

但是請注意,表達式中的5/2正在被Python評估爲浮點數,這使得SymPy比較難以使用它。在SymPy中使用有理能力而不是浮點能力通常是一個好主意。所以正確的版本將是integrate((d*sin(f*x+e))**n*(a+a*sin(f*x+e))**Rational(5, 2)*(A+B*sin(f*x+e)),x)。然而,SymPy現在掛在這個積分上(不要打擾讓它完成;它不會找到答案)。

所以它的缺點是:你看到的異常是一個錯誤,SymPy目前無法計算積分。