2017-02-23 9 views
12

와 양자 표현을 단순화 :파이썬 sympy으로 sympy.physics.quantum

from sympy import sqrt 
from sympy.physics.quantum import Bra,Ket,qapply 
superpos = (Ket('Dead')+Ket('Alive'))/sqrt(2) 
d = qapply(Bra('Dead')*superpos) 

그것은 제공 :

sqrt(2)*<Dead|Alive>/2 + sqrt(2)*<Dead|Dead>/2 

은 어떻게 설정합니까 '죽은'그 때문에, 직교 상태로 '살아' d.doit()을 제공합니다

sqrt(2)/2 

(나는 할 만 할 수 있었다 :

,
d.subs(Bra('Dead')*Ket('Dead'),1).subs(Bra('Dead')*Ket('Alive'),0) 

하지만 난 더 나은 방법)

답변

2

문제는 InnerProduct은 이러한 값을 계산하는 방법을 알지 못하므로 단순화 된 표현을 남겨 둡니다. source을 보면 _eval_innerproduct()Ket에 전화하려고 시도하는 것을 볼 수 있습니다. (명명 규칙은 위의 의무적 사용) 하나가 내부 각 제품을 평가하기 -

def _eval_innerproduct(self, bra, **hints): 
    """Evaluate the inner product betweeen this ket and a bra. 

    This is called to compute <bra|ket>, where the ket is ``self``. 

    This method will dispatch to sub-methods having the format:: 

     ``def _eval_innerproduct_BraClass(self, **hints):`` 

    Subclasses should define these methods (one for each BraClass) to 
    teach the ket how to take inner products with bras. 
    """ 

그러므로 당신이 개 새로운 Bra 클래스와이 방법을 구현하는 새로운 Ket 클래스를 작성하여 문제를 해결할 수 있어야한다.

완전성을 위해 다른 Ket을 직각 상태로 구현하고 각각 dual_class이 올바른 클래스를 반환하도록하고 싶을 것입니다.

+0

그것뿐입니다! 내가 OrthogonalBra/OrthogonalKet로 이름을 변경하고 '데프 _eval_innerproduct_OrthogonalBra에 innerproduct 변경 boson.py/붙여 넣기 복사 (자기, 브래지어, ** 힌트) : 경우 self.n == bra.n : 1 다른 반환 : 반환 0 ' – user4624500

0

이것은 당신이 찾고있는 정확하게 아니지만, 당신이 직교 상태를 만들 수 Qubit를 사용할 수있는이 확신합니다.

from sympy import sqrt 
from sympy.physics.quantum import Dagger, qapply 
from sympy.physics.quantum.qubit import Qubit 

dead = Qubit(0) 
alive = Qubit(1) 

이들은 Ket(0)Ket(1) 만듭니다. 브래지어를 만들려면 Dagger 함수를 사용할 수 있습니다.

print(Dagger(dead) * dead) 
<0|0> 

문제에 적용 :

superpos = (dead + alive)/sqrt(2) 
d = qapply(Dagger(dead) * superpos) 

print(d) 
sqrt(2)/2 
+1

감사합니다.불행히도, 좀 더 일반적인 해결책을 찾고 있습니다 : qutip과 같은 N 차원 기초 (예 :'qutip import *''ket_i = basis (N, i)') – user4624500

0

어쩌면 expression.xreplace() 당신이 찾고있는 무엇? this book에 따르면 xreplace 함수는 sympy-symbols이나 expression이 해시 가능 키인 사전을 취할 수 있습니다. 이것은 여전히 ​​같은 투박한 것 :

from sympy import sqrt 
from sympy.physics.quantum import Bra,Ket,qapply 
superpos = (Ket('Dead')+Ket('Alive'))/sqrt(2) 
d = qapply(Bra('Dead')*superpos) 

mySubs = {Bra('Dead')*Ket('Dead'): 1, Bra('Dead')*Ket('Alive'): 0} ##plus other bindings 
d.xreplace(mySubs) 

(주의 : 아직 ... 그것을 테스트하지 않았다)

적어도 당신이 한 장소와 "재사용에 원하는 모든 대체를 정의 할 수있는 옵션을 제공이 "당신이 좋아하는 곳이면 어디든.

+0

이것은 기본적으로 같은 종류의 치환입니다 질문에서와 같이. 'sympy.Matrix ([1,0,0]). dot (sympy.Matrix ([0,1,0]))' – user4624500

0

포크 공간에 대한 답변 :

>>> from sympy import sqrt 
>>> from sympy.physics.quantum import Dagger,qapply 
>>> from sympy.physics.quantum.boson import BosonFockKet 
>>> ket_Dead = BosonFockKet(0) 
>>> ket_Alive = BosonFockKet(1) 
>>> superpos = (ket_Dead+ket_Alive)/sqrt(2) 
>>> bra_Dead = Dagger(ket_Dead) 
>>> qapply(bra_Dead*superpos).doit() 
sqrt(2)/2 

는 힐베르트 공간에서 가능한 같은 일입니까?