Canonical Quantization¶
da PowerShell -- jupyter nbconvert --to html notebook.ipynb
Quantizzazione canonica in Python¶
Il codice Python fornito implementa, in forma didattica e semplificata, diversi concetti fondamentali della meccanica classica e quantistica:
Hamiltoniana classica¶
Si definisce l'Hamiltoniana classica come
$$\large
H(p,q) = T(p,q) + V(q),
$$
dove $T$ è l'energia cinetica e $V$ il potenziale.
Nel codice:
$$\large
T(p,q) = \frac{p^2}{2m}, \qquad V(q) = \frac{1}{2} q^2,
$$
che corrisponde a un oscillatore armonico con massa $m=1$.
Equazioni di Hamilton¶
Le equazioni canoniche sono $$\large \dot{q} = \frac{\partial H}{\partial p}, \qquad \dot{p} = -\frac{\partial H}{\partial q}. $$ Nel codice queste derivate sono approssimate numericamente con $\texttt{numpy.gradient}$, quindi il risultato è una discretizzazione molto rozza delle equazioni del moto.
Quantizzazione canonica¶
La quantizzazione canonica sostituisce le variabili classiche con operatori: $$\large q \rightarrow \hat{q}, \qquad p \rightarrow \hat{p}, $$ imponendo le relazioni di commutazione canoniche: $$\large [\hat{q}, \hat{p}] = i \hbar. $$ Nel codice questo è simulato in modo simbolico con una funzione $\texttt{commutator}$, senza una vera rappresentazione operatoriale nello spazio di Hilbert.
Equazione di ${Schr\ddot{o}dinger}$¶
L'evoluzione temporale dello stato quantistico $\psi(t)$ è data da $$\large i\hbar \frac{\partial}{\partial t} \psi(t) = \hat{H} \psi(t). $$ La soluzione formale è $$\large \psi(t) = e^{-\frac{i}{\hbar} \hat{H} t} \psi(0). $$ Nel codice l'operatore di evoluzione temporale è calcolato tramite la matrice esponenziale: $$\large U(t) = \exp\!\left(-\frac{i}{\hbar} \hat{H} t \right). $$
Integrale sui cammini (Path Integral)¶
L'azione classica per una traiettoria $q(t)$ è $$\large S[q] = \int_{t_0}^{t_1} \left( \frac{1}{2} m \dot{q}^2 - V(q) \right) dt. $$ Nel codice l'integrale è approssimato numericamente con la regola dei trapezi.
Ambiguità di ordinamento degli operatori¶
Poiché $\hat{q}$ e $\hat{p}$ non commutano, un'espressione classica come $pq$ non ha un'unica quantizzazione.
Una scelta comune è la simmetrizzazione di Weyl:
$$\large
\frac{1}{2} (\hat{p}\hat{q} + \hat{q}\hat{p}).
$$
Il codice implementa proprio questa simmetrizzazione.
Conclusione¶
Il programma è una dimostrazione concettuale (non fisicamente rigorosa) dei passi della quantizzazione canonica:
- definizione della dinamica classica tramite Hamiltoniana,
- passaggio a operatori quantistici e commutatori,
- evoluzione tramite l'equazione di $Schr\ddot{o}dinger$,
- formulazione alternativa tramite integrale sui cammini,
- problema dell'ordinamento degli operatori.
Si tratta quindi di un ``mini laboratorio'' computazionale che illustra l'intero ponte concettuale tra meccanica classica e quantistica.
Struttura generale¶
Il codice implementa una catena concettuale che va dalla meccanica classica alla meccanica quantistica:
$$\large \text{Meccanica Classica} \;\;\rightarrow\;\; \text{Struttura Hamiltoniana} \;\;\rightarrow\;\; \text{Quantizzazione canonica} \;\;\rightarrow\;\; \text{Dinamica quantistica} \;\;\rightarrow\;\; \text{Integrali di cammino} $$Hamiltoniana classica¶
Si definisce l'Hamiltoniana classica come:
$$\large H(p,q) = T(p,q) + V(q) $$Nel codice: $$\large T(p,q) = \frac{p^2}{2m}, \qquad V(q) = \frac{1}{2}q^2 $$
quindi:
$$\large H(p,q) = \frac{p^2}{2m} + \frac{1}{2}q^2 $$che corrisponde all'oscillatore armonico classico con $m=1$.
Equazioni di Hamilton¶
Le equazioni del moto sono:
$$\large \dot{q} = \frac{\partial H}{\partial p}, \qquad \dot{p} = -\frac{\partial H}{\partial q} $$cioè la struttura fondamentale della dinamica canonica su spazio delle fasi $(q,p)$.
Il codice implementa una versione numerica discreta di: $$\large \dot{q}(t), \dot{p}(t) $$
Quantizzazione canonica¶
La quantizzazione canonica sostituisce le variabili classiche con operatori:
$$\large q \rightarrow \hat{q}, \qquad p \rightarrow \hat{p} $$con le relazioni di commutazione canoniche:
$$\large [\hat{q}, \hat{p}] = i\hbar $$che definiscono la struttura non commutativa dello spazio degli operatori quantistici.
Equazione di Schrödinger¶
L'evoluzione temporale dello stato quantistico $\psi(t)$ è data da:
$$\large i\hbar \frac{\partial}{\partial t} \psi(t) = \hat{H}\psi(t) $$La soluzione formale è:
$$\large \psi(t) = U(t)\psi(0) $$con operatore di evoluzione:
$$\large U(t) = e^{-\frac{i}{\hbar}\hat{H}t} $$Nel codice:
$$\large U = \exp\left(-\frac{i}{\hbar} H_{\text{operator}} t \right) $$Formulazione a integrale di cammino¶
L'azione classica è:
$$\large S[q(t)] = \int_{t_0}^{t_1} \left( \frac{1}{2}m \dot{q}^2 - V(q) \right)\, dt $$che è l'oggetto centrale della formulazione di Feynman:
$$\large \mathcal{Z} = \int \mathcal{D}q \; e^{\frac{i}{\hbar}S[q]} $$Il codice calcola una discretizzazione numerica di:
$$\large S[q] \approx \int (T - V)\, dt $$Ambiguità di ordinamento operatoriale¶
Poiché:
$$\large [\hat{q},\hat{p}] \neq 0 $$le espressioni del tipo:
$$\large \hat{p}\hat{q} $$non sono univoche. Il codice usa la simmetrizzazione di Weyl:
$$\large \hat{O}_{sym} = \frac{1}{2}(\hat{p}\hat{q} + \hat{q}\hat{p}) $$che è una prescrizione standard nella quantizzazione canonica.
Interpretazione fisica¶
L’esercizio rappresenta simbolicamente:
- costruzione dell'Hamiltoniana classica
- dinamica classica nello spazio delle fasi
- passaggio classico $\rightarrow$ quantistico
- struttura non-commutativa degli operatori
- evoluzione quantistica unitaria
- formulazione alternativa tramite azione
- problema dell’ordinamento operatoriale
In forma compatta:
$$\large (q,p) \;\longrightarrow\; (\hat{q},\hat{p}) \;\;\Rightarrow\;\; [\hat{q},\hat{p}] = i\hbar \;\;\Rightarrow\;\; i\hbar \partial_t \psi = \hat{H}\psi \;\;\Rightarrow\;\; \psi(t) = e^{-i\hat{H}t/\hbar}\psi(0) $$L'esercizio non si propone di risolvere il cammino di Feynman, ma solo di impostare una via concettuale¶
import numpy as np
from scipy.linalg import expm
from scipy.integrate import trapezoid
def classical_hamiltonian(T, V, p, q):
"""
Calculate the classical Hamiltonian of a system.
:param T: Kinetic energy function.
:param V: Potential energy function.
:param p: Canonical momentum.
:param q: Canonical coordinate.
:return:
Hamiltonian value H(p, q).
"""
return T(p, q) + V(q)
def hamiltons_equations_derivative(H, p, q):
"""
Solve Hamilton's equations for time evolution.
:param H: Hamiltonian function.
:param p: Momentum.
:param q: Coordinate.
:return:
Time derivative of q and p.
"""
dq_dt = np.gradient(H, p)
dp_dt = -np.gradient(H, q)
return dq_dt, dp_dt
def quantization_commutation_relations():
"""
Define commutation relations for canonical quantization.
:return:
Canonical commutation relations.
"""
i, hbar = 1j, 1.0545718e-34 # Reduced Planck constant
def commutator(q, p):
return i**np.eye(len(q)) # Simplified for illustration
return commutator
def schrodinger_equation(H_operator, psi, t):
"""
Implement the Schrodinger equation for quantum state evolution.
:param H_operator: Quantum Hamiltonian operator.
:param psi: Quantum state function.
:param t: Time variable.
:return:
Time-evolved quantum state.
"""
hbar = 1.0545718e-34 # Reduced Planck constant
# Representing exp (-iHt/) for time evolution
U = expm(-1j * H_operator * t / hbar)
return U @ psi
def path_integral_action(S, m, V, q, t0, t1):
"""
Compute the action for a given path, part of path integral
formulat ion.
:param S: Action function.
:param m: Mass.
:param V: Potential energy.
:param q: Path.
:param t0: Initial time.
:param t1: Final time.
:return:
Action computed over a path.
"""
dt = t1 - t0
kinetic_term = 0.5 * m * (np.gradient(q, dt))**2
action = trapezoid(kinetic_term - V(q), dx=dt)
return action
def ordering_ambiguities(operators):
"""
Handle operator ordering ambiguities using symmetrization.
:param operators: Non-commuting operators.
:return:
Symmetrized operator.
"""
return 0.5 * (operators["p"] @ operators["q"] + operators["q"] @ operators ["p"] )
# Defining example functions T, V, and quantum states
T = lambda p, q: p**2 / (2*1.0) # Assuming mass m = 1
V = lambda q: 0.5 * q**2 # Harmonic potential
p, q = np.array([1.0, 0.5]), np. array( [1.0, 0.5]) # Example momentum and position
# Classical Hamiltonian calculation
H_classical = classical_hamiltonian(T, V, p, q)
# Hamilton's equation derivative
dq_dt, dp_dt = hamiltons_equations_derivative(H_classical, p, q)
# Quantum mechanical components and time evolution
commutation = quantization_commutation_relations()
psi_initial = np.array( [1.0, 0.0]) # Initial quantum state
H_operator = np.diag([0.5, 1.0]) ## Hypothetical Hamiltonian operator
psi_evolved = schrodinger_equation(H_operator, psi_initial, 0.1)
# Example path integral calculation
m, V = 1.0, V # Mass
q_path = np. array( [1.0, 0.5, 0.0]) # Example path
action = path_integral_action(lambda q: T(0, q) - V(q), m, V, q_path, 0.0, 1.0)
# Address operator ordering
operators = {"p": np.array([[0, -1j], [1j, 0]]), "q": np.array([[0, 1], [1, 0]])}
symmetrized_operator = ordering_ambiguities(operators)
print("Classical Hamiltonian:", H_classical)
print("Time Derivatives (dq/dt, dp/dt):", dq_dt, dp_dt)
print("Quantum State Evolution (Schrodinger):", psi_evolved)
print("Path Integral Action:", action)
print("Symmetrized Operator:", symmetrized_operator)
Classical Hamiltonian: [1. 0.25] Time Derivatives (dq/dt, dp/dt): [1.5 1.5] [-1.5 -1.5] Quantum State Evolution (Schrodinger): [-0.52525873-0.85094258j 0. +0.j ] Path Integral Action: -0.175 Symmetrized Operator: [[0.+0.j 0.+0.j] [0.+0.j 0.+0.j]]
import numpy as np
import matplotlib.pyplot as plt
from scipy.linalg import expm
from scipy.integrate import trapezoid
# Reuse key parts of the provided code to generate insight
# Classical Hamiltonian example
T = lambda p, q: p**2 / 2.0
V = lambda q: 0.5 * q**2
p = np.array([1.0, 0.5])
q = np.array([1.0, 0.5])
H_classical = T(p, q) + V(q)
# Quantum evolution
psi_initial = np.array([1.0, 0.0])
H_operator = np.diag([0.5, 1.0])
t = 0.1
hbar = 1.0545718e-34
psi_evolved = expm(-1j * H_operator * t / hbar) @ psi_initial
# Path integral action
q_path = np.array([1.0, 0.5, 0.0])
m = 1.0
t0, t1 = 0.0, 1.0
dt = t1 - t0
kinetic_term = 0.5 * m * (np.gradient(q_path, dt))**2
action = trapezoid(kinetic_term - V(q_path), dx=dt)
# --- PRINTS ---
print("=== Classical Mechanics ===")
print("p =", p)
print("q =", q)
print("Hamiltonian H(p,q) =", H_classical)
print("\n=== Quantum Mechanics ===")
print("Initial state psi(0) =", psi_initial)
print("Evolved state psi(t) =", psi_evolved)
print("Probability amplitudes |psi(t)|^2 =", np.abs(psi_evolved)**2)
print("\n=== Path Integral ===")
print("q(t) path =", q_path)
print("Kinetic term =", kinetic_term)
print("Action S[q] =", action)
# --- GRAPHICS ---
plt.figure()
plt.plot(q_path, marker='o')
plt.xlabel("Discrete time index")
plt.ylabel("q(t)")
plt.title("Example Path q(t) used in Path Integral")
plt.show()
=== Classical Mechanics === p = [1. 0.5] q = [1. 0.5] Hamiltonian H(p,q) = [1. 0.25] === Quantum Mechanics === Initial state psi(0) = [1. 0.] Evolved state psi(t) = [-0.52525873-0.85094258j 0. +0.j ] Probability amplitudes |psi(t)|^2 = [1. 0.] === Path Integral === q(t) path = [1. 0.5 0. ] Kinetic term = [0.125 0.125 0.125] Action S[q] = -0.125