2017-02-23 16 views
12

ile kuantum ifadeyi basitleştirmek:piton sympy ile 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) 

O verir:

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

nasıl belirlerim 'Ölü' ve böylece dik devletler olarak 'Alive' d.doit() verir:

sqrt(2)/2 

(ı yapmak için sadece başardı:

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

ama daha iyi bir şekilde)

cevap

2

Sorununuz, InnerProduct'un bu değerleri nasıl değerlendireceğini bilmemesidir ve bu nedenle, basitleştirilmiş ifadeyi nasıl bırakır. source'a baktığımda, bunun Ket numaralı telefondan _eval_innerproduct() numarasını aramayı denediğini görüyorum. (Adlandırma kuralı yukarıda zorunlu kullanarak) bir iç ürünlerin her biri değerlendirmek için -

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

Bu nedenle 2 yeni Bra sınıfları ve 2 yöntemlerini uygulayan yeni Ket sınıf oluşturarak sorunu çözmek gerekir.

Tamlık açısından, ortogonal durumunuz için diğer Ket'u uygulamak ve her durumda dual_class'un doğru sınıfı döndürdüğünden emin olmak isteyebilirsiniz.

+0

İşte bu! Ben OrthogonalBra/OrthogonalKet için yeniden adlandırın ve 'def _eval_innerproduct_OrthogonalBra için innerproduct değiştirmek boson.py/yapıştır kopya (self, sutyen, ** ipuçları): eğer self.n == bra.n: 1 başka dönüş: return 0 ' – user4624500

0

Bu aradığınız tam olarak ne değildir, ama sen dik devletler oluşturmak için Qubit kullanabilirsiniz olduğuna eminim.

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

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

Bunlar Ket(0) ve Ket(1) oluşturun. Sutyen yapmak için Dagger işlevini kullanabilirsiniz.

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

sorununuza uygulanan:

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

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

Çabalarınız için teşekkür ederiz.Ne yazık ki, daha genel bir çözüm arıyorum: "qutip" ile olduğu gibi N boyutu (örneğin: qutip import * '' ket_i = temel (N, i) ') – user4624500

0

Belki expression.xreplace() Aradığınız ne? this book'a göre xreplace işlevi, semik sembollerin veya ifadelerin silinebilir tuşlar olduğu bir sözlüğü alabilir. Bu hala böyle aksak olacaktır:

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) 

(Dikkat: Henüz ... bunu test vermedi)

en azından tek bir yerde ve "yeniden kullanım tüm arzulanan ikame tanımlamak seçeneği sunar Bu "Onlardan hoşlanın.

+0

Bu temelde aynı türden bir ikame sorudaki gibi. İçimdeki ürünü otomatik olarak şu şekilde gerçekleştirmek istiyorum: "sympy.Matrix ([1,0,0]). Dot (sympy.Matrix ([0,1,0])) – user4624500

0

Fock uzayda bir cevap:

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

Hilbert uzayında mümkün aynısı mı?