| import numpy as np |
| import psi_solve2.functions as f |
| import sys |
|
|
| |
| try: |
| from qmsolve import Hamiltonian, SingleParticle, init_visualization |
| except ImportError: |
| print("Error: qmsolve not found. Please install it via 'pip install qmsolve'") |
| sys.exit(1) |
|
|
| def run_comparison(): |
| with open("comparison_log.txt", "w") as log_file: |
| sys.stdout = log_file |
| print("========================================") |
| print("CROSS-VERIFICATION: PSI_SOLVE2 vs QMSOLVE") |
| print("========================================") |
|
|
| |
| |
| |
| |
| print("\n[TEST CASE] Double Well Potential") |
| |
| |
| L = 10.0 |
| N = 512 |
| depth = 2.0 |
| separation = 1.0 |
| center = 0.0 |
| m_particle = 1.0 |
| |
| print(f"Parameters: L={L}, N={N}, depth={depth}, separation={separation}, m={m_particle}") |
|
|
| |
| |
| |
| print("\n--- Running psi_solve2 ---") |
| x_full, dx, x_internal = f.make_grid(L=L, N=N) |
| |
| |
| |
| V_internal = f.V_double_well(x_internal, depth=depth, separation=separation, center=center) |
| |
| |
| V_full = np.zeros_like(x_full) |
| V_full[1:-1] = V_internal |
| V_full[0] = 1e10 |
| V_full[-1] = 1e10 |
| |
| T = f.kinetic_operator(N, dx, m=m_particle) |
| E_psi, psi_psi = f.solve(T, V_full, dx) |
| |
| print(f"psi_solve2 Energies (first 5): {E_psi[:5]}") |
|
|
| |
| |
| |
| print("\n--- Running QMSolve ---") |
| |
| |
| def double_well(particle): |
| x = particle.x |
| return depth * ( (x - center)**2 - separation )**2 |
|
|
| |
| H = Hamiltonian(particles = SingleParticle(m = m_particle), |
| potential = double_well, |
| spatial_ndim = 1, N = N, extent = L) |
|
|
| |
| eigenstates = H.solve(max_states = 10) |
| E_qm_eV = eigenstates.energies |
| |
| |
| |
| Hartree_to_eV = 27.211386 |
| E_qm = E_qm_eV / Hartree_to_eV |
|
|
| print(f"QMSolve Energies (eV): {E_qm_eV[:5]}") |
| print(f"QMSolve Energies (Hartree): {E_qm[:5]}") |
|
|
| |
| |
| |
| print("\n--- Comparison Results ---") |
| print("-" * 65) |
| print(f"| n | psi_solve2 E | QMSolve E | Diff | % Diff |") |
| print("-" * 65) |
| |
| for i in range(5): |
| e1 = E_psi[i] |
| e2 = E_qm[i] |
| diff = abs(e1 - e2) |
| p_diff = (diff / e2) * 100 if e2 != 0 else 0.0 |
| |
| print(f"| {i:<1} | {e1:<12.6f} | {e2:<12.6f} | {diff:<12.2e} | {p_diff:<7.4f}% |") |
| print("-" * 65) |
| |
| |
| |
| |
| print("\n[DEBUG CASE] Harmonic Oscillator (k=1)") |
| k_debug = 1.0 |
| |
| |
| V_internal_HO = 0.5 * k_debug * x_internal**2 |
| V_full_HO = np.zeros_like(x_full) |
| V_full_HO[1:-1] = V_internal_HO |
| V_full_HO[0] = 1e10 |
| V_full_HO[-1] = 1e10 |
| |
| E_psi_HO, _ = f.solve(T, V_full_HO, dx) |
| print(f"psi_solve2 HO Energies: {E_psi_HO[:5]}") |
| |
| |
| def harmonic_potential(particle): |
| return 0.5 * k_debug * particle.x**2 |
| |
| H_HO = Hamiltonian(particles = SingleParticle(m = m_particle), |
| potential = harmonic_potential, |
| spatial_ndim = 1, N = N, extent = L) |
| eigenstates_HO = H_HO.solve(max_states = 10) |
| E_qm_HO = eigenstates_HO.energies |
| print(f"QMSolve HO Energies: {E_qm_HO[:5]}") |
| |
| sys.stdout = sys.__stdout__ |
|
|
| if __name__ == "__main__": |
| run_comparison() |
|
|