2017-02-23 14 views
12

Với python sympy:đơn giản hóa biểu hiện lượng tử với 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) 

Nó cung cấp cho:

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

Làm thế nào để thiết lập 'Chết' và 'Alive' như các quốc gia trực giao, do đó d.doit() cho:

sqrt(2)/2 

(tôi chỉ có thể làm:

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

nhưng tôi chắc chắn có một cách tốt hơn)

Trả lời

2

Vấn đề của bạn là InnerProduct không biết cách đánh giá các giá trị này và do đó để lại biểu thức chưa được giải thích thay thế. Nhìn vào số source, tôi thấy rằng nó cố gắng gọi _eval_innerproduct() trên số Ket, có nội dung này.

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

Bạn do đó sẽ có thể giải quyết vấn đề của bạn bằng cách tạo ra 2 Bra lớp mới và một Ket lớp mới mà thực hiện 2 phương pháp - một để đánh giá mỗi sản phẩm bên trong (sử dụng quy ước đặt tên bắt buộc ở trên).

Để hoàn thành, bạn có thể cũng muốn triển khai Ket khác cho trạng thái trực giao của mình và để đảm bảo rằng dual_class trả về đúng lớp trong mỗi trường hợp.

+0

Đó là nó! Tôi sao chép/dán boson.py đổi tên nó thành OrthogonalBra/OrthogonalKet và thay đổi innerproduct thành 'def _eval_innerproduct_OrthogonalBra (tự, bra, ** gợi ý): nếu self.n == bra.n: return 1 else: return 0 ' – user4624500

0

Đây không phải là chính xác những gì bạn đang tìm kiếm, nhưng bạn có thể sử dụng Qubit để tạo ra trạng thái trực giao.

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

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

Những tạo này Ket(0)Ket(1). Để tạo Bra, bạn có thể sử dụng chức năng Dagger.

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

Khi áp dụng cho vấn đề của bạn:

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

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

Cảm ơn bạn đã nỗ lực.Thật không may, tôi đang tìm một giải pháp tổng quát hơn: N-dimension cơ sở như với 'qutip' (ví dụ:' từ qutip import * '' ket_i = basis (N, i) ') – user4624500

0

lẽ expression.xreplace() là những gì bạn đang tìm kiếm? Theo this book, chức năng xreplace có thể lấy từ điển, nơi các ký hiệu hoặc biểu thức sympy là các khóa có thể băm. Đây vẫn sẽ là phiền phức như thế này:

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) 

(thận trọng: vẫn chưa kiểm tra nó ...)

này ít nhất cung cấp cho bạn tùy chọn để xác định tất cả các thay mong muốn ở một nơi và "tái sử dụng "chúng ở bất cứ đâu bạn thích.

+0

Đây là cơ bản cùng loại thay thế như trong câu hỏi. Tôi muốn thực hiện các sản phẩm bên trong tự động như: 'sympy.Matrix ([1,0,0]). Dot (sympy.Matrix ([0,1,0]))' – user4624500

0

Một câu trả lời trong không gian Fock:

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

là điều tương tự có thể trong không gian Hilbert?

Các vấn đề liên quan