Spaces:
Running
Running
| /** | |
| * Quantum Mechanics Engine | |
| * Calculates wave functions and probability distributions for hydrogen-like atoms | |
| */ | |
| class QuantumMechanicsEngine { | |
| constructor() { | |
| this.Z = 1; // Atomic number (default: hydrogen) | |
| } | |
| /** | |
| * Set atomic number for calculations | |
| * @param {number} Z - Atomic number | |
| */ | |
| setAtomicNumber(Z) { | |
| this.Z = Math.max(1, Math.min(CONSTANTS.MAX_ATOMIC_NUMBER, Math.floor(Z))); | |
| } | |
| /** | |
| * Radial wave function R(n, l, r) for hydrogen-like atoms | |
| * Formula: R(n,l,r) = √[(2Z/na₀)³ × (n-l-1)!/(2n[(n+l)!])] × e^(-ρ/2) × ρ^l × L(n-l-1,2l+1,ρ) | |
| * where ρ = 2Zr/(na₀) | |
| * | |
| * For hydrogen-like atoms, we use Z=1 for all calculations to get the correct orbital shapes | |
| * | |
| * @param {number} n - Principal quantum number | |
| * @param {number} l - Azimuthal quantum number | |
| * @param {number} r - Radius in Bohr radii | |
| * @returns {number} Radial wave function value | |
| */ | |
| radialWaveFunction(n, l, r) { | |
| try { | |
| validateQuantumNumbers(n, l, 0); | |
| if (r < 0) return 0; | |
| if (r === 0) return l === 0 ? 1 : 0; // Only s orbitals have non-zero value at origin | |
| // Use Z=1 for hydrogen-like orbitals (correct orbital shapes) | |
| const Z = 1; | |
| const a0 = CONSTANTS.BOHR_RADIUS; | |
| const rho = (2 * Z * r) / (n * a0); | |
| // Normalization constant using log-space for numerical stability | |
| const logNorm = 0.5 * ( | |
| 3 * Math.log(2 * Z / (n * a0)) + | |
| logFactorial(n - l - 1) - | |
| Math.log(2 * n) - | |
| logFactorial(n + l) | |
| ); | |
| const norm = Math.exp(logNorm); | |
| // Exponential decay | |
| const expTerm = Math.exp(-rho / 2); | |
| // Power term | |
| const powerTerm = Math.pow(rho, l); | |
| // Associated Laguerre polynomial | |
| const laguerre = laguerrePolynomial(n - l - 1, 2 * l + 1, rho); | |
| const result = norm * expTerm * powerTerm * laguerre; | |
| return isFinite(result) ? result : 0; | |
| } catch (error) { | |
| console.error('Radial wave function calculation error:', error); | |
| return 0; | |
| } | |
| } | |
| /** | |
| * Angular wave function Y(l, m, theta, phi) - spherical harmonics | |
| * @param {number} l - Azimuthal quantum number | |
| * @param {number} m - Magnetic quantum number | |
| * @param {number} theta - Polar angle (0 to π) | |
| * @param {number} phi - Azimuthal angle (0 to 2π) | |
| * @returns {number} Angular wave function value | |
| */ | |
| angularWaveFunction(l, m, theta, phi) { | |
| try { | |
| return sphericalHarmonic(l, m, theta, phi); | |
| } catch (error) { | |
| console.error('Angular wave function calculation error:', error); | |
| return 0; | |
| } | |
| } | |
| /** | |
| * Complete wave function ψ(n,l,m,r,θ,φ) = R(n,l,r) × Y(l,m,θ,φ) | |
| * @param {number} n - Principal quantum number | |
| * @param {number} l - Azimuthal quantum number | |
| * @param {number} m - Magnetic quantum number | |
| * @param {number} r - Radius in Bohr radii | |
| * @param {number} theta - Polar angle | |
| * @param {number} phi - Azimuthal angle | |
| * @returns {number} Wave function value | |
| */ | |
| waveFunction(n, l, m, r, theta, phi) { | |
| try { | |
| validateQuantumNumbers(n, l, m); | |
| const radial = this.radialWaveFunction(n, l, r); | |
| const angular = this.angularWaveFunction(l, m, theta, phi); | |
| const result = radial * angular; | |
| if (!isFinite(result)) { | |
| console.error(`Non-finite wave function value at (${r}, ${theta}, ${phi})`); | |
| return 0; | |
| } | |
| return result; | |
| } catch (error) { | |
| console.error('Wave function calculation error:', error); | |
| return 0; | |
| } | |
| } | |
| /** | |
| * Probability density P(r,θ,φ) = |ψ(n,l,m,r,θ,φ)|² | |
| * @param {number} n - Principal quantum number | |
| * @param {number} l - Azimuthal quantum number | |
| * @param {number} m - Magnetic quantum number | |
| * @param {number} r - Radius | |
| * @param {number} theta - Polar angle | |
| * @param {number} phi - Azimuthal angle | |
| * @returns {number} Probability density | |
| */ | |
| probabilityDensity(n, l, m, r, theta, phi) { | |
| const psi = this.waveFunction(n, l, m, r, theta, phi); | |
| return psi * psi; | |
| } | |
| } | |
| // Make class available globally | |
| window.QuantumMechanicsEngine = QuantumMechanicsEngine; | |