2015-11-08 19 views
1

當我嘗試進行簡化,使用sympy.simplify,下面的表達式:關鍵錯誤,而在一個表達式進行簡化

0.0625*v**2*cos(0.5*u)**2 + (-0.25*v*sin(0.5*u)*sin(u) + (0.5*v*cos(0.5*u) + 1)*cos(u))**2 + (-0.25*v*sin(0.5*u)*cos(u) - (0.5*v*cos(0.5*u) + 1)*sin(u))**2 

我得到的錯誤:

/usr/local/lib/python2.7/dist-packages/sympy-0.7.7.dev0-py2.7.egg/sympy/simplify/fu.pyc in f(rv) 
    1323       key = cos(a*cc, evaluate=False) 
    1324       ccs.append(cc) 
-> 1325       take = min(coss[key], take or coss[key]) 
    1326      # update exponent counts 
    1327      for i in range(k): 

KeyError: cos(1.0*u) 

什麼似乎是問題在這裏?它自我表達似乎很直截了當。

編輯1:

只是爲了清楚起見,這是罪魁禍首:

simplify(expr) 

其中expr是以上表達式。

編輯2:

這裏是產生錯誤代碼:更換COS

from sympy import cos,sin, simplify 
from sympy.abc import u,v 
expr = 0.0625*v**2*cos(0.5*u)**2 + (-0.25*v*sin(0.5*u)*sin(u) + (0.5*v*cos(0.5*u) + 1)*cos(u))**2 + (-0.25*v*sin(0.5*u)*cos(u) - (0.5*v*cos(0.5*u) + 1)*sin(u))**2 
simplify(expr) 
+0

如何破線1325成更小的位,所以你可以看到更多明確的錯誤是什麼?例如。你有沒有嘗試過自己評估'coss [key]'? 'take or coss [key]'怎麼樣? – barny

+0

這是Sympy庫,而不是我自己的代碼。我只是在錯誤信息中粘貼了最後一個鏈接。 – imranal

+0

那麼如何編輯你的問題來顯示你的一些實際的代碼(特別是一個miminal,可執行的,可驗證的子集,而不僅僅是一個給出錯誤的行),而不是庫代碼呢? – barny

回答

2

(U)與COS(1.0 * U)的作品,但不要問我爲什麼?

expr = 0.0625*v**2*cos(0.5*u)**2 + (-0.25*v*sin(0.5*u)*sin(u) + (0.5*v*cos(0.5*u) + 1)*cos(1.0*u))**2 + (-0.25*v*sin(0.5*u)*cos(1.0*u) - (0.5*v*cos(0.5*u) + 1)*sin(u))**2 

但是,然後簡化返回相同的結果。我認爲sympy不能將符號計算與浮點混合。

expr = v**2*cos(u/2)**2/16 + (-v*sin(u/2)*sin(u)/4 + (v*cos(u/2)/2 + 1)*cos(u))**2 + (-v*sin(u/2)*cos(u)/4 - (v*cos(u/2)/2 + 1)*sin(u))**2 

似乎工作,返回:

v**2*cos(u/2)**2/4 + v**2/16 + v*cos(u/2) + 1 

如果您想將現有的表達式轉換:

import sympy 
from sympy import cos,sin, simplify 
from sympy.abc import u,v 
import re 
expr = 0.0625*v**2*cos(0.5*u)**2 + (-0.25*v*sin(0.5*u)*sin(u) + (0.5*v*cos(0.5*u) + 1)*cos(u))**2 + (-0.25*v*sin(0.5*u)*cos(u) - (0.5*v*cos(0.5*u) + 1)*sin(u))**2 

def ratio_from_float(m): 
    a,b = float(m.group(0)).as_integer_ratio() 
    return '({0}/{1})'.format(a,b) 

def convert(expr): 
    return sympy.expr.sympify(re.sub('\d+\.\d+',ratio_from_float,str(expr))) 

print(simplify(convert(expr))) 
+1

浮點數不被sympy處理的原因可能是它們不太可能精確到可以被簡化 –

+1

這是真的,但它沒有解釋關鍵錯誤,這是一個錯誤。 – Labo

+0

確實有效!但是,您的解決方案無法完全解決我的問題。該表達式由SymPy生成。因此,在我可以使用簡化來評估表達式之前,我必須搜索SymPy函數中的所有浮點表達式(如餘弦)並將其替換爲有理數(假定float可以表示爲有理數)。 – imranal