对表达式执行简化时出现关键错误
Key error while performing simplification on an expression
当我尝试使用 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:
这是生成错误的代码:
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)
用 cos(1.0*u) 替换 cos(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
但随后简化returns相同的结果。我认为 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
似乎有效,并且 returns :
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)))
当我尝试使用 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:
这是生成错误的代码:
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)
用 cos(1.0*u) 替换 cos(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
但随后简化returns相同的结果。我认为 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
似乎有效,并且 returns :
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)))