Skip to main content

  | मौसम…

411 समाचार
Public archive edition · Attributed source reporting with original dates · AI drafts are excluded

411 REFERENCE · Wikibooks

Moving objects in retarded gravitational potentials of an expanding spherical shell/Java program

Reference material by Wikibooks contributors. This retains its source identity and is not 411 news reporting.

Table with computed results Java program The following Java program can be used to numerically compute the Schwarzschild distances for different linear mass densities. It implements a numerical integration for the effective masses as well as the numerical solvation for the Schwarzschild distances. /* Source file: SchwarzschildDistance.java Program: Computation of the Schwarzschild Distance within the Hubble sphere Autor: Markus Bautsch Location: Berlin, Germany Licence: public domain Date: 18th July 2024 Version: 1.3 Programming language: Java */ /* This Java-Programm computes Schwarzschild distances for any black shell masses. The black shell is at the outer rim of the Hubble space. */ public class SchwarzschildDistance { // Class constants final static double G = 6.67430e-11; // Gravitational constant in cube metres per kilogram and square second final static double c = 2.99792458e8; // Speed of light in metres per second final static double TropicalYear = 365.24219052 * 24 * 3600; // Tropical year in seconds final static double LightYear = c * TropicalYear; // Light-year in metres final static double R = 1.36e26; // Hubble length in metres final static double MUniverse = 2.97e53; // Mass of the visible universe in kilograms final static double lambdaMfirst = 3.36663e26; // start value for linear mass density of black shell final static double lambdaMlast = 3.36670e26; // startop value for linear mass density of black shell final static double deltaLambda = 0.00001e26; // step size for linear mass density of black shell // This method computes and returns the distance s of a mass m to a mass point dM in the black shell // distance is the closest distance of the mass m to to the mass point dM in the black shell in m // alpha is the angle beweteen the mass m and the mass point dM in the black shell as seen from the centre of the universe in rad private static double distanceToMassElementShell (double distance, double alpha) { double cosAlpha = java.lang.Math.cos (alpha); double squareDistance = distance * distance; double argument = 2*R*R - 2*R*distance + squareDistance - 2*R*(R-distance)*cosAlpha; double s; if (argument <= squareDistance) // because of possible rounding errors { s = distance; } else { s = java.lang.Math.sqrt (argument); } return s; } // This method computes and returns the angle of a half chord x in m as seen from the centre of the universe in rad private static double alpha (double x) { double alpha = java.lang.Math.asin (x / R); return alpha; } // This method computes and returns the integrand of the integral // distance is the closest distance of the mass m to to the mass point dM in the black shell in m // alpha is the angle beweteen the mass m and the mass point dM in the black shell as seen from the centre of the universe in rad private static double integrand (double distance, double alpha) { double s = distanceToMassElementShell (distance, alpha); double e = R * (1 - java.lang.Math.cos (alpha)); // the auxiliary sagitta e double cosBeta = (distance - e) / s; double integrand = cosBeta / s / s; return integrand; } // This method computes and returns the effective mass from 0 to alphaR for a given lambdaM and a given distance // lambdaM is the linear mass density of the black shell in kg/m // distance is the closest distance of the mass m to to the mass point dM in the black shell in m private static double integrateEffectiveMass (double lambdaM, double distance) { final long steps = 1000000; // number of steps for numerical integration double squareDistance = distance * distance; double xMax = java.lang.Math.sqrt (2*R*distance - squareDistance); // maximum half chord for a given maximum angle alphaR double x = xMax; // x runs from xMax to 0 in steps of deltaX double alpha = alpha (x); // alpha runs from alphaR to 0 double integrand = integrand (distance, alpha); double integral = 0; long step = 0; while (step <= steps) { x = xMax * (1 - (double) step / steps); double alphaNext = alpha (x); double integrandNext = integrand (distance, alphaNext); double deltaAlpha = alpha - alphaNext; double averageIntegrand = (integrandNext + integrand) / 2; double area = averageIntegrand * deltaAlpha; // numerical integration integral = integral + area; alpha = alphaNext; integrand = integrandNext; step++; } double effectiveMass = R * lambdaM * squareDistance * (2*integral); return effectiveMass; } // This method computes and returns the Schwarzschild distance d_S for a given effective mass mEff private static double schwarzschildDistance (double effectiveMass) { double schwarzschildDistance = 2 * G * effectiveMass / c / c; return schwarzschildDistance; } // This method computes and returns the effective mass mEff for a given Schwarzschild distance d_S private static double effectiveMass (double schwarzschildDistance) { double effectiveMass = schwarzschildDistance * c * c / 2 / G; return effectiveMass; } // This method solves and returns the Schwarzschild distance d_S for a given lambdaM // lambdaM is the linear mass density of the black shell in kg/m private static double solve (double lambdaM) { final double limit = 5e-16; // for relative precision of determination of Schwarzschild distance double lowerDistance = 1e20; // first low guess for Schwarzschild distance double upperDistance = 1e25; // first high guess for Schwarzschild distance double delta; // delta shall become smaller than limit double distance; double schwarzschildDistance; double deltaDistance; do { distance = (lowerDistance + upperDistance) / 2; double effectiveMass = integrateEffectiveMass (lambdaM, distance); schwarzschildDistance = schwarzschildDistance (effectiveMass); deltaDistance = (distance - schwarzschildDistance) / schwarzschildDistance; if (deltaDistance < 0) // Schwarzschild distance too large { lowerDistance = (upperDistance + lowerDistance) / 2; } else // Schwarzschild distance too small { upperDistance = (upperDistance + lowerDistance) / 2; } delta = (upperDistance - lowerDistance) / lowerDistance; } while (delta > limit); if (java.lang.Math.abs (deltaDistance) > 1e-6) { java.lang.System.out.println ("unstable numerical result:"); java.lang.System.out.println ("Computed distance = " + distance); java.lang.System.out.println ("Schwarzschild distance = " + schwarzschildDistance); } return schwarzschildDistance; } // This method outputs the table header private static void printHeader () { java.lang.System.out.print ("lambda_M in kg/m;"); java.lang.System.out.print (" M_S in kg ;"); java.lang.System.out.print (" M_S/M ;"); java.lang.System.out.print (" M_eff in kg ;"); java.lang.System.out.print (" d_S im m ;"); java.lang.System.out.print (" d_S/R ;"); java.lang.System.out.print (" d_S in ly ;"); java.lang.System.out.print (" (R-d)/R "); java.lang.System.out.println (); } // This method outputs a table result line // lambdaM is the linear mass density of the black shell in kg/m // distance is the closest distance of the mass m to to the mass point dM in the black shell in m // mEff is the effective mass of a sphere in the black shell private static void printResults (double lambdaM, double distance, double effectiveMass) { double mShell = lambdaM * R * 2 * java.lang.Math.PI; // mass of black shell double mRatio = mShell / MUniverse; double dRatio = distance / R; double dLightYears = distance / LightYear; double deltaRatio = (R - distance) / R; java.lang.System.out.printf ("%15.7e", lambdaM); java.lang.System.out.print (" ;"); java.lang.System.out.printf ("%15.6e", mShell); java.lang.System.out.print (" ;"); java.lang.System.out.printf ("%15.6f", mRatio); java.lang.System.out.print (" ;"); java.lang.System.out.printf ("%15.2e", effectiveMass); java.lang.System.out.print (" ;"); java.lang.System.out.printf ("%15.2e", distance); java.lang.System.out.print (" ;"); java.lang.System.out.printf ("%15.2e", dRatio); java.lang.System.out.print (" ;"); java.lang.System.out.printf ("%15.0f", dLightYears); java.lang.System.out.print (" ;"); java.lang.System.out.printf ("%15.9f", + deltaRatio); java.lang.System.out.println (); } // This method has a loop for computing a sequence of effective masses and Schwarzschild distances for different lambdaM values // lambdaM is iterated from lambdaMfirst to lambdaMlast in steps of deltaLambda private static void computeScharzschildRadii (double lambdaMfirst, double lambdaMlast, double deltaLambda) { double lambdaM = lambdaMfirst; // linear mass density of black shell at Hubble radius in kg/m lambdaMlast = lambdaMlast * 1.00000001; // for the reason of numerical rounding errors printHeader (); do { double schwarzschildDistance = solve (lambdaM); double effectiveMass = effectiveMass (schwarzschildDistance); printResults (lambdaM, schwarzschildDistance, effectiveMass); lambdaM = lambdaM + deltaLambda; } while (lambdaM <= lambdaMlast); } // Main program public static void main (java.lang.String [] arguments) { computeScharzschildRadii (lambdaMfirst, lambdaMlast, deltaLambda); } }