在表达式上执行简化时的键错误

时间:2015-11-08 15:13:25

标签: python sympy

当我尝试使用x + a1 + a2 + ... + ay对以下表达式执行简化时:

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

这里似乎有什么问题?它本身的表达似乎非常直接。

修改1:

为了清楚起见,这是罪魁祸首:

    /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)

其中simplify(expr) 是上面的表达式。

编辑2:

以下是生成错误的代码:

expr

1 个答案:

答案 0 :(得分:2)

用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

然后简化返回相同的结果。我认为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)))