0

这是我的问题(用一个适用的例子说明):

... 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

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

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

任何帮助,将不胜感激。

4

1 回答 1

0

我想我明白发生了什么。

您正在从字符串转换输入。SymPy 没有名为 copysign 的函数,sympify也没有使用该math库,所以它只是创建Function('copysign')了一个未评估的对象。如果您想math copysign从一开始就对其进行评估,您可以{'copysign': math.copysign}在调用 sympify 时添加作为第二个参数,例如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)

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

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

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

于 2013-07-03T18:54:32.217 回答