Python无法从sympy.core.add.添加类

2024-04-23 21:13:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我的问题是(Illtraded提供了一个适用的例子):

... 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列表中的值都是浮点(或整数)。在

任何帮助都将不胜感激。在


Tags: corerefadd列表lencodesome例子
1条回答
网友
1楼 · 发布于 2024-04-23 21:13:01

我想我明白发生了什么。在

您正在从字符串转换输入。SymPy没有一个名为copysign的函数,sympify不使用math库,所以它只创建{},这是一个未赋值的对象。如果您想从一开始就将其求值为mathcopysign,那么可以在调用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)

这将象征性地工作,但一旦两个参数都是数值,它将使用math复制符号进行计算。在

^{pr2}$

实际上,一个更好的方法是象征性地重新实现copysign逻辑,这样它总是返回一个SymPy类型,但我将把它留给您作为练习。您可以看看^{}是如何在SymPy中实现的,以获得一个想法。在

相关问题 更多 >