【问题标题】:Python - can't convert value from sympy.core.add.Add class to floatPython - 无法将值从 sympy.core.add.Add 类转换为浮点数
【发布时间】:2013-07-01 09:12:19
【问题描述】:

这是我的问题(附有适用示例):

... some code 
### x=0.5*t*(copysign(1, t - 0.5) + 1) + 0.1  
### x=string value
X= Matrix(len(x),1,x)
>>>print X[0]
0.5*t*(copysign(1, t - 0.5) + 1) + 0.1
>>>print type(X[0])
<class 'sympy.core.add.Add'>

t1=linspace(0,1,2) 

REF=[]

for i in range(len(t1)):
    REF.append(M_ref[0].subs(t,t1[i]))
>>>print REF
0.100000000000000, 0.5*copysign(1, 0.5) + 0.6

所以 REF[0] 来自 'sympy.core.numbers.Float' 类,但 REF[1] 来自 'sympy.core.add.Add' 类(当我展开linspace)。因此我不能在我的其余代码中使用它们。我尝试使用evalf,但这并没有解决问题。

我需要 REF 列表中的值都是浮点数(或整数)。

任何帮助将不胜感激。

【问题讨论】:

  • docs.python.org/2/library/math.html,这只是一个例子(当你使用 copysign(1,x) 时它与 sign(x) 相同)
  • 我不明白这怎么可能是标准库数学的复制签名,因为它不支持未评估或符号参数。
  • 我是从一个接口入口(字符串)中得到x值的,但是就像你说的,我也觉得copysign有问题,虽然我不知道怎么解决,因为我必须从我的界面以“copysign(1, x*t)”形式获取它,然后用一个值替换 t

标签: python string list int sympy


【解决方案1】:

我想我明白发生了什么。

您正在从字符串转换输入。 SymPy 没有名为 copysign 的函数,并且sympify 不使用math 库,因此它只是创建Function('copysign'),这是一个未评估的对象。如果您想从一开始就将其评估为mathcopysign,您可以在调用 sympify 时添加{'copysign': math.copysign} 作为第二个参数,例如sympify('copysign(1, 2)', {'copysign': math.copysign})。如果你想要一个符号版本,你需要创建一个,因为它在 SymPy 中还不存在。类似的东西

class copysign(Function):
    nargs = 2
    @classmethod
    def eval(cls, x, y):
        if x.is_number and y.is_number:
            return math.copysign(x, y)

这将象征性地工作,但只要两个参数都是数字,它将使用 math 复制符号进行评估。

>>> x, y = symbols('x y')
>>> copysign(x, y)
copysign(x, y)
>>> copysign(1, -2)
-1.0

确实,一个更好的方法是符号化地重新实现 copysign 逻辑,以便它始终返回 SymPy 类型,但我将把它留给你作为练习。你可以看看 sign 在 SymPy 中是如何实现的,以获得一个想法。

【讨论】:

  • 感谢您的回复,尽管这似乎仍然无法解决我的问题。它似乎只在第一次评估函数时,它返回的第二个值(例如在我的项目中)".00025*copysign(1, -0.49) + 0.1"
  • 您使用的是哪种变体?
猜你喜欢
  • 2016-04-14
  • 2013-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-20
  • 1970-01-01
相关资源
最近更新 更多