UNPKG

herta

Version:

Advanced mathematics framework for scientific, engineering, and financial applications

468 lines (398 loc) 16.3 kB
/** * Relativistic Astrophysics module for herta.js * Provides mathematical tools for calculations involving relativistic effects * in astronomical scenarios, including black holes, gravitational waves, * and spacetime curvature. */ const matrix = require('../core/matrix'); const complex = require('../core/complex'); const relativisticAstrophysics = {}; /** * Constants */ relativisticAstrophysics.constants = { G: 6.67430e-11, // Gravitational constant (m^3 kg^-1 s^-2) c: 299792458, // Speed of light (m/s) solarMass: 1.989e30, // Mass of the Sun (kg) schwarzschildRadius(mass) { return (2 * this.G * mass) / (this.c * this.c); } }; /** * Calculate the Schwarzschild radius for a given mass * @param {number} mass - Mass in kilograms * @returns {number} - Schwarzschild radius in meters */ relativisticAstrophysics.schwarzschildRadius = function (mass) { return (2 * this.constants.G * mass) / (this.constants.c * this.constants.c); }; /** * Calculate the gravitational time dilation * @param {number} mass - Mass causing the gravity (kg) * @param {number} distance - Distance from the center of mass (m) * @returns {number} - Time dilation factor */ relativisticAstrophysics.gravitationalTimeDilation = function (mass, distance) { const rs = this.schwarzschildRadius(mass); // Time dilation factor: sqrt(1 - rs/r) // As r approaches rs, time dilation approaches infinity if (distance <= rs) { throw new Error('Distance must be greater than the Schwarzschild radius'); } return Math.sqrt(1 - rs / distance); }; /** * Calculate the gravitational redshift of light * @param {number} mass - Mass causing the gravity (kg) * @param {number} emissionDistance - Distance from center where light is emitted (m) * @param {number} observerDistance - Distance from center where light is observed (m) * @returns {number} - Redshift factor z */ relativisticAstrophysics.gravitationalRedshift = function (mass, emissionDistance, observerDistance) { const rs = this.schwarzschildRadius(mass); if (emissionDistance <= rs) { throw new Error('Emission point must be outside the Schwarzschild radius'); } const sqrtFactorEmission = Math.sqrt(1 - rs / emissionDistance); const sqrtFactorObserver = Math.sqrt(1 - rs / observerDistance); // Redshift factor z = (λ_observed - λ_emitted) / λ_emitted return (sqrtFactorObserver / sqrtFactorEmission) - 1; }; /** * Calculate the orbital velocity in the weak field approximation * @param {number} mass - Central mass (kg) * @param {number} radius - Orbital radius (m) * @returns {number} - Orbital velocity (m/s) */ relativisticAstrophysics.orbitalVelocity = function (mass, radius) { return Math.sqrt(this.constants.G * mass / radius); }; /** * Calculate relativistic orbital precession per orbit * @param {number} mass - Central mass (kg) * @param {number} semiMajorAxis - Semi-major axis of the orbit (m) * @param {number} eccentricity - Eccentricity of the orbit * @returns {number} - Precession angle per orbit (radians) */ relativisticAstrophysics.orbitalPrecession = function (mass, semiMajorAxis, eccentricity) { const rs = this.schwarzschildRadius(mass); // Einstein's formula for orbital precession return (6 * Math.PI * rs) / (semiMajorAxis * (1 - eccentricity * eccentricity)); }; /** * Calculate the properties of an ISCO (Innermost Stable Circular Orbit) * @param {number} mass - Black hole mass (kg) * @param {number} spin - Black hole spin parameter (0 to 1) * @returns {Object} - ISCO properties */ relativisticAstrophysics.innermost_stable_circular_orbit = function (mass, spin) { if (spin < 0 || spin > 1) { throw new Error('Spin parameter must be between 0 and 1'); } // Calculate ISCO radius (in units of rs/2) const Z1 = 1 + (1 - spin * spin) ** (1 / 3) * ((1 + spin) ** (1 / 3) + (1 - spin) ** (1 / 3)); const Z2 = Math.sqrt(3 * spin * spin + Z1 * Z1); // For prograde orbit const rPrograde = 3 + Z2 - Math.sqrt((3 - Z1) * (3 + Z1 + 2 * Z2)); // For retrograde orbit const rRetrograde = 3 + Z2 + Math.sqrt((3 - Z1) * (3 + Z1 + 2 * Z2)); // Convert to physical units const rs = this.schwarzschildRadius(mass); const rProg = rPrograde * rs / 2; const rRetro = rRetrograde * rs / 2; // Calculate orbital velocities const vProg = this.constants.c * Math.sqrt(1 / rPrograde); const vRetro = this.constants.c * Math.sqrt(1 / rRetrograde); return { prograde: { radius: rProg, velocity: vProg, angularMomentum: vProg * rProg }, retrograde: { radius: rRetro, velocity: vRetro, angularMomentum: vRetro * rRetro } }; }; /** * Calculate gravitational wave frequency from a binary system * @param {number} mass1 - Mass of first object (kg) * @param {number} mass2 - Mass of second object (kg) * @param {number} separation - Separation distance (m) * @returns {number} - Gravitational wave frequency (Hz) */ relativisticAstrophysics.gravitationalWaveFrequency = function (mass1, mass2, separation) { const totalMass = mass1 + mass2; // Orbital frequency const orbitalFreq = (1 / (2 * Math.PI)) * Math.sqrt( this.constants.G * totalMass / separation ** 3 ); // Gravitational wave frequency is twice the orbital frequency return 2 * orbitalFreq; }; /** * Calculate gravitational wave strain amplitude * @param {number} mass1 - Mass of first object (kg) * @param {number} mass2 - Mass of second object (kg) * @param {number} distance - Distance to observer (m) * @param {number} frequency - Gravitational wave frequency (Hz) * @returns {number} - Dimensionless strain amplitude */ relativisticAstrophysics.gravitationalWaveStrain = function (mass1, mass2, distance, frequency) { const chirpMass = (mass1 * mass2) ** (3 / 5) / (mass1 + mass2) ** (1 / 5); // Calculate strain amplitude const strain = (4 / distance) * (this.constants.G * chirpMass / this.constants.c ** 2) ** (5 / 3) * (Math.PI * frequency) ** (2 / 3); return strain; }; /** * Calculate time to merger for a binary system * @param {number} mass1 - Mass of first object (kg) * @param {number} mass2 - Mass of second object (kg) * @param {number} separation - Current separation (m) * @returns {number} - Time to merger (seconds) */ relativisticAstrophysics.timeToMerger = function (mass1, mass2, separation) { const chirpMass = (mass1 * mass2) ** (3 / 5) / (mass1 + mass2) ** (1 / 5); // Time to merger from quadrupole formula return (5 / 256) * separation ** 4 / ((this.constants.G * chirpMass / this.constants.c ** 2) ** (5 / 3)); }; /** * Calculate the Kerr metric component for a rotating black hole * @param {number} mass - Black hole mass (kg) * @param {number} spin - Black hole spin parameter (0 to 1) * @param {number} r - Radial coordinate (m) * @param {number} theta - Polar angle (radians) * @returns {Object} - Metric components */ relativisticAstrophysics.kerrMetric = function (mass, spin, r, theta) { const rs = this.schwarzschildRadius(mass); const a = spin * rs / 2; // Angular momentum parameter // Auxiliary functions const delta = r * r - rs * r + a * a; const rho2 = r * r + a * a * Math.cos(theta) ** 2; const sigma = (r * r + a * a) ** 2 - a * a * delta * Math.sin(theta) ** 2; // Metric components (in Boyer-Lindquist coordinates) const gtt = -(1 - rs * r / rho2); const gtphi = -rs * r * a * Math.sin(theta) ** 2 / rho2; const grr = rho2 / delta; const gthth = rho2; const gphiphi = (r * r + a * a + rs * r * a * a * Math.sin(theta) ** 2 / rho2) * Math.sin(theta) ** 2; return { gtt, gtphi, grr, gthth, gphiphi }; }; /** * Calculate the effective potential for a particle around a black hole * @param {number} mass - Black hole mass (kg) * @param {number} spin - Black hole spin parameter (0 to 1) * @param {number} particleE - Particle energy per unit mass * @param {number} particleL - Particle angular momentum per unit mass * @param {number} r - Radial coordinate (m) * @returns {number} - Effective potential value */ relativisticAstrophysics.effectivePotential = function (mass, spin, particleE, particleL, r) { const rs = this.schwarzschildRadius(mass); const a = spin * rs / 2; // Auxiliary functions const delta = r * r - rs * r + a * a; // Effective potential for equatorial motion const V = -1 + (particleE * (r * r + a * a) - particleL * a) ** 2 / (r * r * delta) - delta * (1 + (particleL - particleE * a) ** 2 / r / r) / r / r; return V; }; /** * Calculate photon ring radius for a black hole * @param {number} mass - Black hole mass (kg) * @param {number} spin - Black hole spin parameter (0 to 1) * @returns {Object} - Photon ring radii (prograde and retrograde) */ relativisticAstrophysics.photonRing = function (mass, spin) { const rs = this.schwarzschildRadius(mass); // For Schwarzschild black hole (spin = 0) if (Math.abs(spin) < 1e-10) { return { prograde: 1.5 * rs, retrograde: 1.5 * rs }; } // For Kerr black hole // Prograde photon orbit const rp = 2 * mass * (1 + Math.cos(2 / 3 * Math.acos(-spin))); // Retrograde photon orbit const rm = 2 * mass * (1 + Math.cos(2 / 3 * Math.acos(spin))); return { prograde: rp, retrograde: rm }; }; /** * Calculate the gravitational lensing deflection angle * @param {number} mass - Lensing mass (kg) * @param {number} impactParameter - Closest approach distance (m) * @returns {number} - Deflection angle (radians) */ relativisticAstrophysics.gravitationalLensing = function (mass, impactParameter) { const rs = this.schwarzschildRadius(mass); // Einstein's formula for light deflection return 4 * this.constants.G * mass / (this.constants.c * this.constants.c * impactParameter); }; /** * Calculate Einstein ring radius * @param {number} mass - Lensing mass (kg) * @param {number} dLS - Distance from lens to source (m) * @param {number} dL - Distance from observer to lens (m) * @returns {number} - Einstein ring radius (m) */ relativisticAstrophysics.einsteinRingRadius = function (mass, dLS, dL) { const dS = dL + dLS; // Distance to source // Einstein ring radius formula return Math.sqrt(4 * this.constants.G * mass * dLS / (this.constants.c * this.constants.c * dS) * dL); }; /** * Calculate Shapiro time delay * @param {number} mass - Mass causing the gravity (kg) * @param {number} impactParameter - Closest approach distance (m) * @returns {number} - Time delay (seconds) */ relativisticAstrophysics.shapiroDelay = function (mass, impactParameter) { const rs = this.schwarzschildRadius(mass); // Shapiro time delay formula return 2 * this.constants.G * mass / (this.constants.c * this.constants.c * this.constants.c) * Math.log(4 * impactParameter * impactParameter / rs / impactParameter); }; /** * Calculate relativistic Doppler shift * @param {number} velocity - Radial velocity (m/s, positive for receding) * @param {number} restFrequency - Frequency in rest frame (Hz) * @returns {number} - Observed frequency (Hz) */ relativisticAstrophysics.relativisticDoppler = function (velocity, restFrequency) { const beta = velocity / this.constants.c; // Relativistic Doppler formula const gamma = 1 / Math.sqrt(1 - beta * beta); const observedFrequency = restFrequency * gamma * (1 - beta); return observedFrequency; }; /** * Calculate apparent size of a black hole shadow * @param {number} mass - Black hole mass (kg) * @param {number} distance - Distance to observer (m) * @returns {number} - Angular diameter of shadow (radians) */ relativisticAstrophysics.blackHoleShadowSize = function (mass, distance) { const rs = this.schwarzschildRadius(mass); // Shadow radius is approximately 2.6 * M (where M = rs/2) const shadowRadius = 2.6 * rs / 2; // Angular size return 2 * shadowRadius / distance; }; /** * Calculate emission from an accretion disk using thin disk model * @param {number} mass - Black hole mass (kg) * @param {number} accretionRate - Mass accretion rate (kg/s) * @param {number} radius - Disk radius (m) * @returns {number} - Surface brightness (W/m²) */ relativisticAstrophysics.accretionDiskEmission = function (mass, accretionRate, radius) { const rs = this.schwarzschildRadius(mass); const efficiency = 0.1; // Typical accretion efficiency // Check if radius is outside the ISCO if (radius < 3 * rs) { throw new Error('Radius must be outside the innermost stable circular orbit'); } // Total luminosity const luminosity = efficiency * accretionRate * this.constants.c * this.constants.c; // Surface brightness using Shakura-Sunyaev model (simplified) const surfaceBrightness = (3 * luminosity / (8 * Math.PI * radius * radius)) * (1 - Math.sqrt(3 * rs / radius)); return surfaceBrightness; }; /** * Calculate Hawking radiation temperature for a black hole * @param {number} mass - Black hole mass (kg) * @returns {number} - Hawking temperature (K) */ relativisticAstrophysics.hawkingTemperature = function (mass) { const hbar = 1.0545718e-34; // Reduced Planck constant (J·s) const kb = 1.380649e-23; // Boltzmann constant (J/K) // Hawking temperature formula return (hbar * this.constants.c * this.constants.c * this.constants.c) / (8 * Math.PI * this.constants.G * mass * kb); }; /** * Calculate black hole entropy * @param {number} mass - Black hole mass (kg) * @returns {number} - Entropy (J/K) */ relativisticAstrophysics.blackHoleEntropy = function (mass) { const hbar = 1.0545718e-34; // Reduced Planck constant (J·s) const kb = 1.380649e-23; // Boltzmann constant (J/K) // Area of the event horizon const area = 4 * Math.PI * this.schwarzschildRadius(mass) ** 2; // Bekenstein-Hawking entropy formula return (kb * area * this.constants.c * this.constants.c * this.constants.c) / (4 * this.constants.G * hbar); }; /** * Calculate frame-dragging (Lense-Thirring) precession * @param {number} mass - Black hole mass (kg) * @param {number} spin - Black hole spin parameter (0 to 1) * @param {number} radius - Orbital radius (m) * @param {number} inclination - Orbital inclination (radians) * @returns {number} - Precession rate (radians/s) */ relativisticAstrophysics.frameDraggingPrecession = function (mass, spin, radius, inclination) { const rs = this.schwarzschildRadius(mass); const J = spin * mass * this.constants.c * rs / 2; // Angular momentum // Lense-Thirring precession formula return (2 * this.constants.G * J) / (this.constants.c * this.constants.c * radius ** 3) * Math.cos(inclination); }; /** * Calculate gravitational wave luminosity from a binary system * @param {number} mass1 - Mass of first object (kg) * @param {number} mass2 - Mass of second object (kg) * @param {number} separation - Separation distance (m) * @returns {number} - Luminosity (W) */ relativisticAstrophysics.gravitationalWaveLuminosity = function (mass1, mass2, separation) { // Reduced mass const mu = (mass1 * mass2) / (mass1 + mass2); const totalMass = mass1 + mass2; // Orbital frequency const omega = Math.sqrt(this.constants.G * totalMass / separation ** 3); // Quadrupole formula for GW luminosity return (32 / 5) * this.constants.G ** (4 / 3) * mu ** 2 * totalMass ** (2 / 3) * omega ** (10 / 3) / this.constants.c ** 5; }; /** * Calculate the geodetic precession rate * @param {number} centralMass - Central mass (kg) * @param {number} semiMajorAxis - Orbital semi-major axis (m) * @param {number} eccentricity - Orbital eccentricity * @returns {number} - Precession rate (radians/s) */ relativisticAstrophysics.geodeticPrecession = function (centralMass, semiMajorAxis, eccentricity) { // Orbital frequency const omega = Math.sqrt(this.constants.G * centralMass / semiMajorAxis ** 3); // Geodetic precession formula return (3 * this.constants.G * centralMass * omega) / (2 * this.constants.c * this.constants.c * semiMajorAxis) * (1 / Math.sqrt(1 - eccentricity * eccentricity)); }; module.exports = relativisticAstrophysics;