这是我的问题(用适用的例子说明):
... 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列表中的值为所有浮点数(或整数)。
任何帮助将不胜感激。
答案 0 :(得分:0)
我想我明白发生了什么。
您正在从字符串转换输入。 SymPy没有名为copysign的函数,sympify
不使用math
库,因此只创建Function('copysign')
,这是一个未评估的对象。如果您想从一开始就将其评估为math
copysign
,则可以在调用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
copysign进行评估。
>>> x, y = symbols('x y')
>>> copysign(x, y)
copysign(x, y)
>>> copysign(1, -2)
-1.0
真的,一个更好的方法就是象征性地重新实现copysign逻辑,这样它总能返回一个SymPy类型,但我会把它作为练习留给你。您可以查看如何在SymPy中实现sign
以获得想法。