electron_cloud_visualizer / js /quantum-mechanics.js
AK51's picture
Upload 20 files
cdfc1f1 verified
/**
* 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;