Première physique computationnelle: mécanique quantique et algèbre linéaire avec python.

Première physique computationnelle: physique physique avec python

introduction

En étudiant la mécanique quantique, vous constaterez que l'algèbre linéaire est une bonne représentation de la mécanique quantique. L'hamiltonien est représenté par une matrice, l'énergie est représentée par une valeur propre et l'état propre est représenté par un vecteur propre. Et l'équation de Schrödinger aboutit à une équation pérenne. Dans le laboratoire de théorie des propriétés physiques, l'équation est résolue à l'aide d'un ordinateur pour prédire les propriétés physiques (bien sûr, d'autres choses sont également faites).

Cependant, ce n'est qu'après être entré au laboratoire que l'ordinateur est utilisé dans les cours universitaires. Avant d'être affecté au laboratoire, j'espère qu'il sera utile pour connaître la théorie des propriétés physiques dans la situation actuelle que "j'utilise du matériel de laboratoire mais pas des ordinateurs".

Objectif

Le but de cet article est de relier le problème «résoluble» que vous apprendrez dans une conférence en classe avec le problème «résolu numériquement» que vous apprendrez à l'aide d'un ordinateur.

table des matières

  1. Confirmation de l'exemple pédagogique "Opérateur de rotation $ \ hat {S_z} $ et sa valeur unique" (Si vous le connaissez, ignorez-le)
  2. Résoudre numériquement des exemples pédagogiques
  3. Situation présumée
\def\bra#1{\mathinner{\left\langle{#1}\right|}} \def\ket#1{\mathinner{\left|{#1}\right\rangle}} \def\braket#1#2{\mathinner{\left\langle{#1}\middle|#2\right\rangle}} \def\bbraket#1#2#3{\mathinner{\left\langle{#1}\middle|#2\middle|#3\right\rangle}}

1. Confirmation de l'exemple pédagogique "L'opérateur de spin Sz et sa valeur unique"

La relation entre l'opérateur de spin $ \ hat {S_z} $ et son état propre est donnée comme suit.

\hat{S_z} \ket{\uparrow} = \frac{\hbar}{2} \ket{\uparrow} ,~~~~~\hat{S_z} \ket{\downarrow} = -\frac{\hbar}{2} \ket{\downarrow}

Si vous les exprimez dans une matrice,

\frac{\hbar}{2}
\begin{pmatrix}
1 & 0 \\
0 & -1 
\end{pmatrix} 
\begin{pmatrix}
1 \\
0
\end{pmatrix}
= \frac{\hbar}{2} \begin{pmatrix}
1 \\
0
\end{pmatrix},~~~~~
\frac{\hbar}{2}
\begin{pmatrix}
1 & 0 \\
0 & -1 
\end{pmatrix} 
\begin{pmatrix}
0 \\
1
\end{pmatrix}
= \frac{-\hbar}{2} \begin{pmatrix}
0 \\
1
\end{pmatrix}

Il est réécrit comme. Comme vous pouvez le voir sur cet écran

\begin{pmatrix}
a \\
b
\end{pmatrix} = a \ket{\uparrow} + b \ket{\downarrow}

La fonction $ \ ket {\ uparrow} $ n'a pas d'importance, seul son coefficient est calculé. Ceci est basé sur le fait que "toute nouvelle base peut être exprimée en utilisant une base orthogonale normale".

Maintenant, l'état propre de $ \ hat {S_z} $ est-il l'état propre de $ \ hat {S_y} $? Bien sûr que non. Alors, que se passe-t-il si vous laissez $ \ hat {S_y} $ agir sur $ \ ket {\ uparrow} $?

Cela peut être compris par l'opérateur élévateur. Autrement dit, l'équation suivante

S^{+}\ket{\uparrow} = 0,~~~~~ S^{+}\ket{\downarrow} = \hbar \ket{\uparrow}\\
S^{-}\ket{\uparrow} = \hbar \ket{\downarrow},~~~~~S^{-} \ket{\downarrow} = 0

Et la définition de l'opérateur élévateur $ S^{+} = \hat{S_x}+ i\hat{S_y},~~~~~ S^{-}= \hat{S_x} - i\hat{S_y} $ De, si vous résolvez $ \ hat {S_x}, \ hat {S_y} $ en sens inverse,

\hat{S_x}\ket{\uparrow} = \frac{\hbar}{2} \ket{\downarrow}, ~~~~~\hat{S_x}\ket{\downarrow} = \frac{\hbar}{2} \ket{\uparrow}\\
\hat{S_y} \ket{\uparrow} = i\frac{\hbar}{2}\ket{\downarrow}, ~~~~~\hat{S_y} \ket{\downarrow} = -i\frac{\hbar}{2} \ket{\uparrow}

Est obtenu. Certainement $ \ ket {\ uparrow} $ n'était pas dans l'état unique de $ \ hat {S_y} $.

Alors, quel est l'état unique de $ \ hat {S_y} $? Vous pouvez le prédire, mais osons le demander systématiquement. Tout d'abord, l'affichage matriciel de $ \ hat {S_y} \ ket {\ uparrow} = i \ frac {\ hbar} {2} \ ket {\ downarrow} $ est

\frac{\hbar}{2}\begin{pmatrix}
0 & -i\\
i & 0
\end{pmatrix}
\begin{pmatrix}1\\0\end{pmatrix} = i\frac{\hbar}{2}\begin{pmatrix}0\\1\end{pmatrix}

Est. Ici, la matrice sur le côté gauche est $ \ sigma_y $ de la matrice de Pauli. En diagonalisant ce $ \ sigma_y $, on obtient l'état unique de $ \ hat {S_y} $. Lorsque $ \ sigma_y $ est diagonalisé, la valeur propre et le vecteur propre sont

\lambda_1=1, ~~ u_1=\frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ i \end{pmatrix}・ ・ ・(1)\\
\lambda_2=-1, ~~ u_2=\frac{1}{\sqrt{2}}\begin{pmatrix}-1\\i\end{pmatrix}・ ・ ・(2)

Sera. Si vous vérifiez s'il est réellement dans un état unique,

\hat{\sigma}_yu_1=\begin{pmatrix}
0 & -i\\
i & 0
\end{pmatrix}\frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ i \end{pmatrix}=
\frac{1}{\sqrt{2}}\begin{pmatrix}-i^2\\i\end{pmatrix} = 
\frac{1}{\sqrt{2}}\begin{pmatrix}1\\i\end{pmatrix} = \lambda_1\cdot u_1

Il a été confirmé qu'il était dans un état unique.

Calculons la valeur attendue de $ \ sigma_x $ en utilisant cet état propre $ u_1 $.

\bbraket{u_1}{\sigma_x}{u_1} = \frac{1}{\sqrt{2}}\begin{pmatrix}1 & -i \end{pmatrix}
\begin{pmatrix}
0 & 1 \\
1 & 0 
\end{pmatrix}
\frac{1}{\sqrt{2}}\begin{pmatrix}1\\i\end{pmatrix}
=0

Par conséquent, la valeur attendue est 0.

2. Résoudre numériquement des exemples pédagogiques

Implémentez le calcul d'analyse de 1. en python.

  1. Définissez une matrice $ \ sigma_y $
  2. Diagonale
  3. Sortie et vérifiez si elle correspond à la solution d'analyse de la section précédente
import numpy as np
sigma_y = np.array([
    [0,-1j],
    [1j,0]
])
eigenvalues, eigenvectors = np.linalg.eigh(sigma_y)
print(eigenvalues[0], end="  ") 
print(eigenvectors[0])
# output : -1.0  [-0.70710678+0.j -0.70710678+0.j]

Cela ne correspond pas. Cela dépend de la manière dont les vecteurs propres sont stockés. Vous pouvez bien le comprendre en effectuant les opérations suivantes.

print(eigenvectors @ sigma_y @ np.linalg.eigh(eigenvectors))
# output : [[-1           0.+1e-16j]
#           [ 0.+1e-16    1        ]]

En d'autres termes, le vecteur propre obtenu par np.linalg.eigh () est une forme dans laquelle deux vecteurs propres sont disposés verticalement.

eigenvectors[0] =[u1(x1),u2(x1)]
eigenvectors[1] =[u1(x2),u2(x2)]

Sera. Le vecteur propre obtenu par np.linalg.eigh () doit donc être transposé.

import numpy as np
sigma_y = np.array([
    [0,-1j],
    [1j,0]
])
eigenvalues, eigenvectors = np.linalg.eigh(sigma_y)
evs = np.transpose(eigenvectors)
print(eigenvalues[0], end="  ") 
print(evs[0])
# output : -1.0   [-0.71+0.j     0.+0.71j]  ( 1/sqrt(2)=0.71 )

Cela correspond à la valeur propre et au vecteur propre de (2) de $ \ sigma_y $ calculé analytiquement.

3. Situation présumée

La diagonalisation de la matrice a lieu dans diverses situations physiques. Ici, à titre d'exemple, essayons de "trouver l'état de base avec un modèle unidimensionnel à deux sites avec spin".

En tant que hamiltonien

H=H_{kin}+H_{\mu}+H_{U}\\
H_{kin} = -t\sum_{\sigma}(c^{*}_{2,\sigma}c_{1,\sigma}+c^{*}_{1,\sigma}c_{2,\sigma})\\
H_{\mu} =  \sum_{\sigma}\sum_{i=1,2}(-\mu_i)c^*_{i,\sigma}c_{i,\sigma}\\
H_{U} = U\sum_{i=1,2}n_{i,\uparrow}n_{i,\downarrow}

En tant qu'état, considérez "un demi-remplissage dans lequel le nombre de particules et le spin sont préservés, un upspin et un downspin". À ce stade, il existe quatre états possibles.

\psi_1 = |(\uparrow\downarrow)_1,(0)_2>\\
\psi_2 = |(0)_1,(\uparrow\downarrow)_2>\\
\psi_3 = |(\uparrow)_1,(\downarrow)_2>\\
\psi_4 = |(\downarrow)_1,(\uparrow)_2>

On suppose que chaque état est normalisé.

$ \ psi_1 $ est dans l'état suivant.

Soit $ \ phi $ l'état représenté à l'aide de ces états, et représentons-le comme suit. Bien sûr, ce $ \ phi $ peut représenter tous les états.

\phi=a\psi_1+b\psi_2+c\psi_3+d\psi_4=\begin{pmatrix}a \\ b \\ c \\ d \end{pmatrix}

cependant,|a|^2+|b|^2+|c|^2+|d|^2=1.. En ce moment,

H\phi=\begin{pmatrix}
-2\mu_1+U & 0        & -t & -t \\
    0     &-2\mu_2+U & -t & -t \\
-t & -t & -\mu_1-\mu_2 & 0 \\
-t & -t & 0 & -\mu_1-\mu_2
\end{pmatrix}\phi

Les hamiltoniens peuvent être affichés dans une matrice comme dans. En diagonalisant cette matrice, trouvons l'état propre de $ \ phi $. Ce qu'il faut faire est le même que dans la section 2.

import numpy as np
#Condition de calcul
mu_1 = 0.1
mu_2 = 0.4
t = 1.0
U = 3.0

H = np.array([
    [-2*mu_1 + U,           0,          -t,            -t],
    [          0,  -2*mu_2 + U,          -t,             -t],
    [         -t,          -t, -mu_1 - mu_2,            0],
    [         -t,          -t,            0, -mu_1 - mu_2]
])
eigenvalues, eigenvectors = np.linalg.eigh(H)
evs = np.transpose(eigenvectors)
for i in range(4):
    print(eigenvalues[i], end="  ") 
    print(evs[i])

# output
# -1.51  [ 0.29    0.34   0.63   0.63 ]
# -0.50  [ 1e-17  1e-17  -0.71   0.71 ]
#  2.44  [ 0.54   -0.83   0.10   0.10 ]
#  3.57  [-0.79   -0.44   0.30   0.30 ]

En regardant les résultats du calcul, l'état avec la plus petite valeur propre, c'est-à-dire l'état de base, est $ [0,29 ~~ 0,34 ~~ 0,63 ~~ 0,63] $. Puisque la condition de calcul a une grande force de Coulomb, beaucoup de $ \ psi_3 et \ psi_4 $ sont inclus. La façon dont $ \ psi_1 et \ psi_2 $ sont mélangés n'est pas 1: 1 car l'énergie du site est différente.

Recommended Posts

Première physique computationnelle: mécanique quantique et algèbre linéaire avec python.
Indépendance et base linéaires: Algèbre linéaire en Python <6>
Matrice unitaire et matrice inverse: Algèbre linéaire en Python <4>
Produit intérieur et vecteur: Algèbre linéaire en Python <2>
Calcul matriciel et équations linéaires: Algèbre linéaire en Python <3>
Introduction aux vecteurs: Algèbre linéaire en Python <1>
Recherche linéaire en Python
"Régression linéaire" et "Version probabiliste de la régression linéaire" en Python "Régression linéaire de Bayes"
Introduction à l'algèbre linéaire avec Python: Décomposition A = LU
Peeping in Python, pas de mécanique quantique effrayante 1: Potentiel infini de type puits
Pile et file d'attente en Python
Peeping en Python, pas de mécanique quantique effrayante 2: potentiel de type puits fini
Capturez des images d'algèbre linéaire avec python (translocation, matrice inverse, produit de matrices)
Unittest et CI en Python
Régression linéaire en ligne en Python
Liste des solveurs et modélisateurs de conception linéaire (LP) disponibles en Python
Paquets qui gèrent le MIDI avec Python midi et pretty_midi
Différence entre list () et [] en Python
Première analyse de régression simple en Python
Différence entre == et est en python
Afficher les photos en Python et html
Algorithme de tri et implémentation en Python
Manipuler des fichiers et des dossiers en Python
À propos de Python et Cython dtype
Affectations et modifications des objets Python
Vérifiez et déplacez le répertoire en Python
Chiffrement avec Python: IND-CCA2 et RSA-OAEP
Hashing de données en R et Python
Synthèse de fonctions et application en Python
Exporter et exporter des fichiers en Python
Inverser le pseudonyme plat et le katakana en Python2.7
Lire et écrire du texte en Python
[GUI en Python] Menu PyQt5 et barre d'outils-
La première étape de Python Matplotlib
Créer et lire des paquets de messages en Python
Retrouvez les termes généraux de la séquence de Tribonacci en algèbre linéaire et Python
Chevauchement d'expressions régulières en Python et Java
Générer une collection de première classe en Python
Différence d'authenticité entre Python et JavaScript
Notes utilisant cChardet et python3-chardet dans Python 3.3.1.
Les modules et packages en Python sont des "espaces de noms"
Évitez les boucles imbriquées en PHP et Python
Régression linéaire en Python (statmodels, scikit-learn, PyMC3)
Différences entre Ruby et Python dans la portée
Modulation et démodulation AM avec Python Partie 2
différence entre les instructions (instructions) et les expressions (expressions) en Python
Module d'implémentation de file d'attente et Python "deque"
Graphique à lignes pliées et ligne d'échelle en python
Régression linéaire en ligne en Python (estimation robuste)
Implémenter le filtre FIR en langage Python et C
Différences entre la syntaxe Python et Java
Vérifier et recevoir le port série en Python (vérification du port)
Différence entre @classmethod et @staticmethod en Python
Différence entre append et + = dans la liste Python
Différence entre non local et global en Python
Ecrire le fichier O_SYNC en C et Python
Gérer les "années et mois" en Python