如何解决响应simple(...)的Sympy容器对象
我正在尝试创建一个 sympy 容器对象,其中包含多个 sympy 表达式,表示一个量子位的 x、y 和 z 可观察量。
我首先创建了一个扩展 sympy.Basic 的类。我希望将 x、y 和 z 推入 sympy args 会导致一个对象通过返回一个简化了 x、y 和 z args 的对象来响应 simplify(qubit)
。当这自然不起作用时,我重新定义了 simplify(self,**kwargs)
方法。
有没有推荐的方法让 simplify(qubit)
工作而不是 qubit.simplify()
?
from sympy import Symbol,cos,sin,Basic
aa = Symbol('aa')
# simplifies to 1
expression_to_simplify = sin(aa)**2 + cos(aa)**2
class qubit(Basic):
def __new__(cls,qubitnumber,x,y,z):
obj = super().__new__(cls,z)
obj.qubitnumber = qubitnumber
return obj
def simplify(self,**kwargs):
from sympy.simplify import simplify
return qubit(
self.args[0],simplify(self.args[1]),simplify(self.args[2]),simplify(self.args[3])
)
qb = qubit(1,expression_to_simplify,expression_to_simplify)
print(qb.simplify())
from sympy.simplify import simplify
print(simplify(qb))
给出输出:
qubit(1,1,1)
qubit(1,sin(aa)**2 + cos(aa)**2,sin(aa)**2 + cos(aa)**2)
解决方法
simplify
不是为了提供对简化容器内容的支持,但您可以这样做(或仅对 Qubit 这样做,如下所示):
>>> from sympy import simplify as _simplify
>>> def simplify(x,*y,**k):
... if isinstance(x,Expr): return _simplify(x,**k)
... elif isinstance(x,Qubit): return Qubit(*[_simplify(i,**k) for i in x.args])
... raise NotImplementedError
然后为 Qubit(1,1,1)
提供 simplify(qb)
。诀窍是在新的 simplify
中使用原始 _simplify
作为 simplify
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。