simplifiez l'expression quantique avec sympy.physique.quantique

Avec python sympy:

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

Ça donne:

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

Comment puis-je définir 'Dead' et 'Alive' comme des États orthogonaux, de sorte que d.doit() donne:

sqrt(2)/2

(je n'ai pu faire:

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

mais je suis sûr qu'il ya une meilleure façon)

12
demandé sur user4624500 2017-02-23 21:10:07

4 réponses

le problème est que InnerProduct ne sait pas comment évaluer ces valeurs et laisse donc l'expression non simplifiée à la place. En regardant l' source, je vois qu'il essaie de l'appeler _eval_innerproduct() sur le Ket, qui dit ceci.

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

vous devriez donc être en mesure de résoudre votre problème en créant 2 nouveaux Bra classes et un nouveau Ket classe qui implémente 2 méthodes - une évaluation interne des produits (utilisation de la dénomination convention mandatée ci-dessus).

pour être complet vous voulez probablement aussi implémenter l'autre Ket pour votre état orthogonal et pour s'assurer que dual_class renvoie la bonne classe dans chaque cas.

2
répondu Peter Brittain 2017-04-13 00:27:46

Ce n'est pas exactement ce que vous cherchez, mais vous pouvez utiliser Qubit pour créer des États orthogonaux.

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

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

ceux-ci créent Ket(0) et Ket(1). Pour rendre le soutien-gorge, vous pouvez utiliser le Dagger fonction.

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

Lorsqu'il est appliqué à votre problème:

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

print(d)
sqrt(2)/2
0
répondu Mike C 2017-04-06 19:58:33

Peut-être expression.xreplace() est ce que vous recherchez? Selon ce livrexreplace fonction peut prendre un dictionnaire où sympy-les symboles ou les expressions sont des clés hachables. Ce serait encore maladroit comme ceci:

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)

(attention: Je ne l'ai pas encore testé...)

cela vous donne au moins la possibilité de définir toutes les substitutions souhaitées en un seul endroit et de les "réutiliser" où vous le souhaitez.

0
répondu Chris 2017-04-11 09:00:59

Une réponse en l'espace de 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

la même chose est-elle possible dans L'espace de Hilbert ?

0
répondu user4624500 2017-04-12 07:49:25