ubuntu2404
#!/usr/bin/env python31"""2Quantum Mechanics Simulations for Computational Physics3========================================================45This module contains implementations of fundamental quantum mechanics simulations:6- Time-dependent Schrödinger equation solver7- Quantum harmonic oscillator eigenstates8- Particle in a box solutions9- Quantum tunneling demonstrations1011Keywords: quantum mechanics python, schrodinger equation solver, quantum harmonic oscillator,12particle in a box simulation, quantum tunneling python code1314Author: CoCalc Scientific Templates15License: MIT16"""1718import numpy as np19import matplotlib.pyplot as plt20from scipy.sparse import diags21from scipy.linalg import expm22from scipy.special import hermite, factorial2324# Set reproducible random seed25np.random.seed(42)2627class SchrodingerSolver:28"""29Time-dependent Schrödinger equation solver using finite difference method.3031Solves: iℏ ∂ψ/∂t = Ĥ ψ where Ĥ = T̂ + V̂32"""3334def __init__(self, L=10.0, N=1000, hbar=1.0, m=1.0):35"""36Initialize the solver.3738Parameters:39-----------40L : float41Length of simulation box42N : int43Number of grid points44hbar : float45Reduced Planck constant (natural units)46m : float47Particle mass (natural units)48"""49self.L = L50self.N = N51self.hbar = hbar52self.m = m53self.dx = L / N54self.x = np.linspace(0, L, N)5556# Kinetic energy operator (finite difference)57kinetic_diag = -2 * np.ones(N)58kinetic_off = np.ones(N-1)59self.T_matrix = -(hbar**2 / (2*m*self.dx**2)) * (60diags([kinetic_off, kinetic_diag, kinetic_off], [-1, 0, 1], shape=(N, N))61)6263def set_potential(self, V):64"""Set the potential energy function V(x)."""65self.V = V66self.H = self.T_matrix + diags(V, 0)6768def gaussian_wavepacket(self, x0, sigma, k0):69"""70Create a Gaussian wave packet initial condition.7172Parameters:73-----------74x0 : float75Initial position76sigma : float77Wave packet width78k0 : float79Initial momentum80"""81psi = np.exp(-(self.x - x0)**2 / (2*sigma**2)) * np.exp(1j * k0 * self.x)82return psi / np.sqrt(np.trapezoid(np.abs(psi)**2, self.x))8384def evolve(self, psi_initial, dt, t_final):85"""86Time evolution using matrix exponentiation.8788Returns:89--------90times : array91Time points92psi_evolution : list93Wavefunction at each time step94"""95times = np.arange(0, t_final, dt)96U = expm(-1j * self.H.toarray() * dt / self.hbar)9798psi = psi_initial.copy()99psi_evolution = [psi.copy()]100101for t in times[1:]:102psi = U @ psi103psi_evolution.append(psi.copy())104105return times, psi_evolution106107class HarmonicOscillator:108"""109Quantum harmonic oscillator analytical solutions.110111Energy eigenvalues: E_n = ℏω(n + 1/2)112Wavefunctions: ψ_n(x) = N_n * exp(-ξ²/2) * H_n(ξ)113where ξ = x/x₀ and x₀ = √(ℏ/mω)114"""115116def __init__(self, omega=1.0, m=1.0, hbar=1.0):117"""118Parameters:119-----------120omega : float121Angular frequency122m : float123Mass124hbar : float125Reduced Planck constant126"""127self.omega = omega128self.m = m129self.hbar = hbar130self.x0 = np.sqrt(hbar / (m * omega)) # Length scale131132def energy_level(self, n):133"""Energy eigenvalue for quantum number n."""134return self.hbar * self.omega * (n + 0.5)135136def wavefunction(self, x, n):137"""138Harmonic oscillator wavefunction for quantum number n.139140Parameters:141-----------142x : array143Position grid144n : int145Quantum number146"""147# Normalization factor148norm = 1.0 / np.sqrt(2**n * factorial(n)) * (self.m*self.omega/(np.pi*self.hbar))**(1/4)149150# Dimensionless coordinate151xi = x / self.x0152153# Hermite polynomial154H_n = hermite(n)155156# Wavefunction157psi_n = norm * np.exp(-xi**2 / 2) * H_n(xi)158return psi_n159160def calculate_eigenstates(self, x_range, n_max=5):161"""162Calculate first n_max energy eigenstates.163164Returns:165--------166x : array167Position grid168energies : list169Energy eigenvalues170wavefunctions : list171Corresponding wavefunctions172"""173x = np.linspace(-x_range, x_range, 1000)174175energies = []176wavefunctions = []177178for n in range(n_max):179E_n = self.energy_level(n)180psi_n = self.wavefunction(x, n)181182energies.append(E_n)183wavefunctions.append(psi_n)184185return x, energies, wavefunctions186187class ParticleInBox:188"""189Infinite square well (particle in a box) exact solutions.190191Energy eigenvalues: E_n = n²π²ℏ²/(2mL²)192Wavefunctions: ψ_n(x) = √(2/L) * sin(nπx/L)193"""194195def __init__(self, L=1.0, m=1.0, hbar=1.0):196"""197Parameters:198-----------199L : float200Box length201m : float202Particle mass203hbar : float204Reduced Planck constant205"""206self.L = L207self.m = m208self.hbar = hbar209210def energy_level(self, n):211"""Energy eigenvalue for quantum number n (n ≥ 1)."""212return (n**2 * np.pi**2 * self.hbar**2) / (2 * self.m * self.L**2)213214def wavefunction(self, x, n):215"""216Particle in box wavefunction for quantum number n.217218Parameters:219-----------220x : array221Position grid (0 ≤ x ≤ L)222n : int223Quantum number (n ≥ 1)224"""225return np.sqrt(2/self.L) * np.sin(n * np.pi * x / self.L)226227def superposition_state(self, x, coefficients, quantum_numbers):228"""229Create superposition of energy eigenstates.230231ψ(x) = Σ c_n ψ_n(x)232233Parameters:234-----------235x : array236Position grid237coefficients : array238Complex amplitudes239quantum_numbers : array240Corresponding quantum numbers241"""242psi = np.zeros_like(x, dtype=complex)243244for c, n in zip(coefficients, quantum_numbers):245psi += c * self.wavefunction(x, n)246247return psi248249def calculate_eigenstates(self, n_max=5):250"""251Calculate first n_max energy eigenstates.252253Returns:254--------255x : array256Position grid257energies : list258Energy eigenvalues259wavefunctions : list260Corresponding wavefunctions261"""262x = np.linspace(0, self.L, 1000)263264energies = []265wavefunctions = []266267for n in range(1, n_max + 1):268E_n = self.energy_level(n)269psi_n = self.wavefunction(x, n)270271energies.append(E_n)272wavefunctions.append(psi_n)273274return x, energies, wavefunctions275276def demo_quantum_tunneling():277"""278Demonstrate quantum tunneling through a potential barrier.279"""280print("=== Quantum Tunneling Demo ===")281282# Setup solver283solver = SchrodingerSolver(L=10.0, N=1000)284285# Define potential: harmonic well + Gaussian barrier286omega = 1.0287V = 0.5 * solver.m * omega**2 * (solver.x - solver.L/2)**2288V += 2.0 * np.exp(-((solver.x - solver.L/3)/(solver.L/20))**2)289290solver.set_potential(V)291292# Initial Gaussian wave packet293psi_initial = solver.gaussian_wavepacket(x0=solver.L/4, sigma=solver.L/20, k0=5.0)294295# Time evolution296times, psi_evolution = solver.evolve(psi_initial, dt=0.001, t_final=5.0)297298print(f"Simulation completed: {len(times)} time steps")299print(f"Final norm: {np.trapezoid(np.abs(psi_evolution[-1])**2, solver.x):.6f}")300301return solver.x, V, times, psi_evolution302303def demo_harmonic_oscillator():304"""305Demonstrate quantum harmonic oscillator eigenstates.306"""307print("=== Harmonic Oscillator Demo ===")308309oscillator = HarmonicOscillator(omega=1.0, m=1.0, hbar=1.0)310x, energies, wavefunctions = oscillator.calculate_eigenstates(x_range=4*oscillator.x0, n_max=6)311312print(f"Calculated {len(energies)} eigenstates")313print(f"Energy levels (in units of ℏω): {[E/oscillator.hbar/oscillator.omega for E in energies[:4]]}")314315return x, energies, wavefunctions, oscillator316317def demo_particle_in_box():318"""319Demonstrate particle in a box solutions.320"""321print("=== Particle in Box Demo ===")322323box = ParticleInBox(L=1.0, m=1.0, hbar=1.0)324x, energies, wavefunctions = box.calculate_eigenstates(n_max=5)325326# Create superposition state327coefficients = [1/np.sqrt(2), 1/np.sqrt(2)]328quantum_numbers = [1, 2]329psi_superposition = box.superposition_state(x, coefficients, quantum_numbers)330331print(f"Calculated {len(energies)} eigenstates")332print(f"Energy ratios E_n/E_1: {[E/energies[0] for E in energies]}")333334return x, energies, wavefunctions, psi_superposition335336if __name__ == "__main__":337# Run demonstrations338demo_quantum_tunneling()339demo_harmonic_oscillator()340demo_particle_in_box()341342