Annus Mirabilis · Interactive critical edition in preparation
Classical mode-energy allocation
Give every resonator the same mean energy, and see whether the radiation's total energy ever settles.
Classical mode-energy allocation
Classical mode-energy allocation
Static worked examplePredict before the numbers
Widening the resonator range from 100 THz to 1000 THz changes the energy by how much?
The result appears when you choose, say you have one in mind, or skip.
Worked example: with resonators up to 1 × 10¹⁴ Hz at 1500 K, the classical allocation holds 0.00644 J per cubic metre, and widening the cutoff tenfold multiplies it by 1000.
| Mean energy per resonator oscillation | 2.070974 × 10−20 J |
|---|---|
| Energy with resonators up to the cutoff | 0.006439187 J/m³ |
| Share of that energy above the probe frequency | 0.9990000 |
| Energy after widening the cutoff tenfold | 6.439187 J/m³ |
| Ratio: tenfold-widened energy ÷ current energy | 1000 |
With resonators up to 1.000 × 1014 Hz at 1500 K, the classical allocation holds 0.006439 J per cubic meter; each tenfold widening multiplies it by 1000. Every resonator oscillation carries the same mean energy kBT (source notation (R/N)T), which §1 notes is two-thirds of a free molecule's mean kinetic energy.
§2's Avogadro match and §4's later entropy argument (a separate instrument) use two disjoint limits of the same spectrum: the classical region, admitted at the 1% criterion for x ≤ 0.0198678, and the Wien region, admitted at x ≥ 4.60517. Meeting both arguments does not mean one "quantum regime" supplied both numbers.
The historical Avogadro readout, from Einstein's §2 constants
| N, from Einstein's printed §2 constants (historical) | 6.170486 × 1023 mol⁻¹ |
|---|---|
| N, as printed in §2 | 6.17 × 1023 mol⁻¹ |
| NA, defined, 2019 SI (modern) | 6.02214076 × 1023 mol⁻¹ |
| Hydrogen-atom mass from the printed N (historical) | 1.62 × 10−24 g |
| Hydrogen-atom mass, modern (labeled modern) | 1.673533 × 10−24 g |
α is a suspected historical typographical correction (10⁻⁵⁷, not the witness's 10⁻⁵⁶); R = 8.31×10⁷ erg mol⁻¹ K⁻¹ and L = 3×10¹⁰ cm s⁻¹ are declared editorial inputs, not printed values, since §2 does not appear to print either. This readout is never mixed with a modern constant in the same number.
Not modeled: The mechanism coupling matter and radiation beyond Planck's stated equilibrium condition; Cavity shape and walls; The approach to equilibrium; Any quantum hypothesis; Measured spectra (a separate instrument shows those).
Show which functions computed these numbers
src/physics/reference/radiation/classical.ts (classicalCutoffEnergyDensity, classicalTotalEnergy, meanResonatorEnergy), src/physics/reference/radiation/avogadro.ts (avogadroFromPlanckConstants), src/physics/reference/radiation/spectra.ts (regimeRelativeErrors), and src/experiments/lq02/session.ts (which gathers these results for the page; this component never recomputes any of them).
If every way a resonator can vibrate gets the same share of energy, the energy of the radiation grows without limit as higher and higher frequencies are allowed. Einstein notes that on this picture matter and light could never settle into a definite share of the energy.
Section 1 puts a gas, free electrons and resonators, electrons bound to fixed points, in a box with mirror walls. Collisions give each resonator's vibration along one line a mean energy Ē = (R/N)T, the same at every frequency; at 1500 K that is 2.07 × 10−20 J. Planck's relation between a resonator and the radiation around it, Ēν = (L3/8πν2)ρν, then fixes the density: ρν = (R/N)(8πν2/L3)T. The energy per unit volume up to a highest frequency νc is (8πkBT/3c3)νc3, which at 1500 K is 0.00644 J/m3 up to 1014 Hz, and 99.9 percent of it lies above 1013 Hz. Allow frequencies ten times higher and the energy grows a thousandfold, to 6.44 J/m3; allow them all and there is no finite total, which the instrument reports as a refusal rather than a number. Einstein concludes that the relation disagrees with experience and that on this picture there can be no definite distribution of energy between the ether and matter. Section 2 then shows that Planck's formula, which fits experience, agrees with this law at long wavelengths, and that matching the two gives N = 6.17 × 1023.
Take a resonator vibrating along one line. In a gas at temperature T each molecule's energy of motion averages (3/2)(R/N)T, which is (1/2)(R/N)T for each direction. A bound electron also has potential energy, and for a spring force the average potential energy equals the average kinetic energy, so the vibration along one line averages (R/N)T in all. With R/N = kB = 1.381 × 10−23 J/K and T = 1500 K that is 2.071 × 10−20 J. Planck showed that a resonator of frequency ν, in radiation whose energy per unit volume and unit frequency is ρν, settles at Ēν = c3ρν/(8πν2). Setting Ēν = kBT gives ρν = 8πν2kBT/c3. The energy up to νc adds this density up: the integral of 8πν2kBT/c3 from 0 to νc is (8πkBT/3c3)νc3. The factor in front is 8π × 2.071 × 10−20/(3 × (2.998 × 108)3) = 6.44 × 10−45 J s3/m3, and multiplied by (1014)3 = 1042 it gives 0.00644 J/m3. Up to 1013 Hz the cube is a thousand times smaller, 6.44 × 10−6 J/m3, so 1 − 1/1000 = 99.9 percent of the energy lies between 1013 and 1014 Hz. Each tenfold widening multiplies the energy by 103, to 6.44 J/m3 at 1015 Hz, and there is no highest frequency at which to stop, so the total is infinite. For N: at low frequency Planck's formula αν3/(eβν/T − 1) becomes (α/β)ν2T, because eβν/T − 1 is then close to βν/T. Matching (R/N)(8π/c3) = α/β gives N = (β/α)(8πR/c3); with Planck's constants that is 6.17 × 1023, and a hydrogen atom weighs 1/N gram, 1.62 × 10−24 g.
Modern qualifications
Einstein wrote Ē for the resonator's mean energy, L for the speed of light and ρν for the density, and he gave the result no name; the name it later carried in textbooks is Ehrenfest's, from 1911. Rayleigh had given a density growing as ν2T for long waves in June 1900, and Jeans corrected its coefficient in July 1905, after this paper was received. Planck had derived the resonator relation in 1900 by treating the radiation as the most disordered process conceivable, which is how Einstein cites it; Einstein uses it without Planck's energy elements. The value N = 6.17 × 1023 is Planck's own. The exponent of α as the edition reads the plate, 10−56, would give a tenth of that N; the constants that give 6.17 × 1023 need 10−57, and the provenance record leaves the printed digit to a second witness.
Show the code
The site’s own reference code for this law, in TypeScript. It computes the numbers above when the page runs it, and it is what the page uses wherever a FrankenSim result is not available.
meanResonatorEnergy · src/physics/reference/radiation/classical.ts · this site’s source, as built · sha256:8e2de4a307208c7d7d1db091948f7f506dcb965f85b6b13bb6d9eea35664fd47
This function computes the listed outputs when it runs.
In words
The classical equipartition result, returned in joules and in electronvolts, with the ratio to a free molecule's average kinetic energy beside it. At 300 K it is 4.141947 times 10^-21 J, which is 0.025852 eV. The function takes the Boltzmann constant from the declared set rather than a literal, so a historical set gives Einstein's printed R over N instead.
Implementation
/** Mean resonator energy E_bar = k_B * T = (R/N) * T. */
export function meanResonatorEnergy(
T: number,
set: ConstantSet,
): Readonly<{
status: "value";
quantityId: "meanResonatorEnergy";
unit: "J";
value: number;
valueEv: number;
linearRepresentable: true;
ratioToFreeMoleculeKineticEnergy: number;
}> {
const kB = thermalConstant(set).value;
const energyJoules = kB * T;
const energyEv = energyJoules / JOULES_PER_EV;
return {
status: "value",
quantityId: "meanResonatorEnergy",
unit: "J",
value: energyJoules,
valueEv: energyEv,
linearRepresentable: true,
ratioToFreeMoleculeKineticEnergy: 2 / 3, // E_bar / (3/2 * k_B * T) = 2/3
};
}The site’s own reference code for this law, in TypeScript. It computes the numbers above when the page runs it, and it is what the page uses wherever a FrankenSim result is not available.
classicalCutoffEnergyDensity · src/physics/reference/radiation/classical.ts · this site’s source, as built · sha256:30fafb7552580daad6a33f3b2a92743fa440291109a59225b8d52c85a7502397
This function computes the listed outputs when it runs.
In words
U = (8 pi k_B T / 3 c^3) times the cube of the cutoff frequency, which is the Rayleigh-Jeans density integrated from zero up to that cutoff. At a cutoff of 10^15 Hz and 5800 K it returns 24.898 J/m^3. Doubling the cutoff multiplies it by eight, and that is the whole of the difficulty: there is no frequency at which the classical allocation stops adding energy.
Implementation
/** Classical cutoff energy density U(nu_c) = (8 * pi * k_B * T / (3 * c^3)) * nu_c^3 in J m^-3. */
export function classicalCutoffEnergyDensity(
nuCutoff: CyclicFrequency | number,
T: number,
set: ConstantSet,
): RadiationResult<number> {
const quantityId = "radiationEnergy";
const unit = "J/m^3";
if (!Number.isFinite(nuCutoff) || nuCutoff === Number.POSITIVE_INFINITY) {
return {
status: "outside-domain",
quantityId,
unit,
condition: "classical-total-diverges",
domainKind: "physical",
reason:
"The classical allocation assigns unbounded total energy; an infinite cutoff diverges.",
};
}
if (nuCutoff <= 0) {
return {
status: "outside-domain",
quantityId,
unit,
condition: "nonpositive-cutoff-frequency",
domainKind: "physical",
reason: `Cutoff frequency must be positive and finite (got ${nuCutoff}).`,
};
}
if (!Number.isFinite(T) || T <= 0) {
return {
status: "outside-domain",
quantityId,
unit,
condition: "nonpositive-temperature",
domainKind: "physical",
reason: `Temperature must be positive and finite (got ${T}).`,
};
}
const c = constantValue(set, "speedOfLight").value;
const kB = thermalConstant(set).value;
// U(nu_c) = (8 * pi * k_B * T / (3 * c^3)) * nu_c^3
const uCutoff = ((8 * Math.PI * kB * T) / (3 * c ** 3)) * nuCutoff ** 3;
// The allocation grows as the cube of the cutoff without bound, so a large enough cutoff or
// temperature carries the product past the floating-point range (the cube alone leaves it above
// a cutoff of about 5.6 x 10^102 Hz). That is a limit of the arithmetic, not a value: returned as
// one, it printed "Infinity J/m³" on lq-02 with a NaN share beside it.
if (!Number.isFinite(uCutoff)) {
return {
status: "outside-domain",
quantityId,
unit,
condition: "energy-beyond-number-range",
domainKind: "numerical",
reason:
"At this cutoff the classical energy is larger than this calculation can represent. It grows as the cube of the cutoff without bound.",
};
}
return {
status: "value",
quantityId,
unit,
value: uCutoff,
linearRepresentable: true,
};
}The site’s own reference code for this law, in TypeScript. It computes the numbers above when the page runs it, and it is what the page uses wherever a FrankenSim result is not available.
classicalTotalEnergy · src/physics/reference/radiation/classical.ts · this site’s source, as built · sha256:3ce397f29778d8b35371d97d40d6278b47c6c19bca6bf7ecc7132745953540bb
This function computes the listed outputs when it runs.
In words
Integrating the classical density from zero to infinity gives no finite answer, because the density rises as the square of the frequency and never turns over. So this function computes nothing. It returns an outside-domain result whose reason is that the classical allocation assigns unbounded total energy, and it does that for every temperature.
Implementation
/** Classical total energy integral over [0, infinity] diverges. */
export function classicalTotalEnergy(_T: number, _set: ConstantSet): RadiationResult<number> {
return {
status: "outside-domain",
quantityId: "radiationEnergy",
unit: "J/m^3",
condition: "classical-total-diverges",
domainKind: "physical",
reason: "the classical allocation assigns unbounded total energy",
};
}The site’s own reference code for this law, in TypeScript. It computes the numbers above when the page runs it, and it is what the page uses wherever a FrankenSim result is not available.
avogadroFromPlanckConstants · src/physics/reference/radiation/avogadro.ts · this site’s source, as built · sha256:df0de169bcc51df201761940d1cede359d1b87afa7a55ee78c6cc2e5968526c3
This function computes the listed outputs when it runs.
In words
N = (beta / alpha) times 8 pi R / L^3, with alpha and beta the two constants of Wien's law as Planck had fitted them, R the gas constant and L the speed of light. Run on the 1905 CGS inputs it returns 6.170486250063268 times 10^23, against the 6.17 times 10^23 Einstein printed and 6.02214076 times 10^23 in the modern definition: high by 2.5 per cent. It returns both the unrounded value and the printed one, and it derives the hydrogen atom mass and R over N from the PRINTED N, so that the page's numbers and the paper's numbers agree digit for digit.
Implementation
export function avogadroFromPlanckConstants(set?: ConstantSet): AvogadroReadout {
// If no set or modern set is passed, compute with standard historical 1905 CGS inputs or set entries
let alpha = 6.1e-57;
let beta = 4.866e-11;
let R_cgs = 8.31e7;
let L_cgs = 3e10;
let alphaStatus = "printed-corrected";
let alphaReason = "Corrected witness exponent from 10^-56 to 10^-57.";
let rStatus = "editorial-input";
let rReason = "Einstein did not print R in §2; standard 1905 value R = 8.31e7 erg/(mol K).";
let rSensitivity = "Linear in R.";
let lStatus = "editorial-input";
let lReason = "Speed of light rounded to 3e10 cm/s in 1905 text.";
let lSensitivity = "Inverse cubic in L.";
if (set) {
if (set.id === "planck-1900-1901-printed") {
// Planck's own 1900-1901 printed readout
return {
status: "value",
avogadroConstant: 6.175e23,
printedAvogadroConstant: 6.175e23,
hydrogenAtomMassGrams: 1 / 6.175e23,
printedHydrogenAtomMassGrams: 1.62e-24,
unroundedHydrogenAtomMassGrams: 1 / 6.175e23,
rOverN: 8.31e7 / 6.175e23,
printedROverN: 8.31e7 / 6.175e23,
unroundedROverN: 8.31e7 / 6.175e23,
markers: {
avogadroConstant: { printedStatus: "printed", reason: "Planck 1900-1901 printed value." },
},
modernComparisons: {
modernAvogadro: MODERN_AVOGADRO,
modernReciprocalGram: MODERN_RECIPROCAL_GRAM,
modernHydrogenAtomMassGrams: MODERN_H1_ATOM_MASS_GRAMS,
modernBoltzmannConstant: MODERN_BOLTZMANN,
},
};
}
// Check if set has entries for alpha, beta, R, L
const alphaEntry = set.entries.find((e) => e.quantityId === "wienConstantAlpha");
if (alphaEntry) {
alpha = alphaEntry.value;
if (alphaEntry.printedStatus) alphaStatus = alphaEntry.printedStatus;
if (alphaEntry.reason) alphaReason = alphaEntry.reason;
}
const betaEntry = set.entries.find((e) => e.quantityId === "wienConstantBeta");
if (betaEntry) {
beta = betaEntry.value;
}
const rEntry = set.entries.find((e) => e.quantityId === "molarGasConstant");
if (rEntry) {
// If R is in SI (8.31), convert to CGS erg/(mol K)
R_cgs = rEntry.value < 100 ? rEntry.value * 1e7 : rEntry.value;
if (rEntry.printedStatus) rStatus = rEntry.printedStatus;
if (rEntry.reason) rReason = rEntry.reason;
if (rEntry.sensitivity) rSensitivity = rEntry.sensitivity;
}
const lEntry = set.entries.find((e) => e.quantityId === "speedOfLight");
if (lEntry) {
L_cgs = lEntry.value < 1e9 ? lEntry.value * 100 : lEntry.value;
if (lEntry.printedStatus) lStatus = lEntry.printedStatus;
if (lEntry.reason) lReason = lEntry.reason;
if (lEntry.sensitivity) lSensitivity = lEntry.sensitivity;
}
}
// N = (beta / alpha) * (8 * pi * R / L^3)
const N_unrounded = (beta / alpha) * ((8 * Math.PI * R_cgs) / L_cgs ** 3);
const N_printed = 6.17e23;
const hMass_from_printed_N = 1 / N_printed; // 1.62074554e-24 g
const hMass_printed = 1.62e-24;
const hMass_unrounded = 1 / N_unrounded; // 1.62061805e-24 g
const rOverN_from_printed_N = R_cgs / N_printed; // 1.34683955e-16 erg/K
const rOverN_unrounded = R_cgs / N_unrounded; // 1.34673347e-16 erg/K
return {
status: "value",
avogadroConstant: N_unrounded,
printedAvogadroConstant: N_printed,
hydrogenAtomMassGrams: hMass_from_printed_N,
printedHydrogenAtomMassGrams: hMass_printed,
unroundedHydrogenAtomMassGrams: hMass_unrounded,
rOverN: rOverN_from_printed_N,
printedROverN: rOverN_from_printed_N,
unroundedROverN: rOverN_unrounded,
markers: {
wienConstantAlpha: { printedStatus: alphaStatus, reason: alphaReason },
molarGasConstant: { printedStatus: rStatus, reason: rReason, sensitivity: rSensitivity },
speedOfLight: { printedStatus: lStatus, reason: lReason, sensitivity: lSensitivity },
},
modernComparisons: {
modernAvogadro: MODERN_AVOGADRO,
modernReciprocalGram: MODERN_RECIPROCAL_GRAM,
modernHydrogenAtomMassGrams: MODERN_H1_ATOM_MASS_GRAMS,
modernBoltzmannConstant: MODERN_BOLTZMANN,
},
};
}The site’s own reference code for this law, in TypeScript. It computes the numbers above when the page runs it, and it is what the page uses wherever a FrankenSim result is not available.
regimeRelativeErrors · src/physics/reference/radiation/spectra.ts · this site’s source, as built · sha256:a4b44ec160f4721a8ce8233a6c39adb4e6b2dc061a427db51151d9bddaee5917
This function computes the listed outputs when it runs.
In words
Everything turns on one dimensionless number, x = h nu / (k_B T). Wien's relative error is e to the minus x, so Wien is good where x is large, which is high frequency or low temperature. The classical error is (e^x - 1)/x - 1, which vanishes where x is small. The function returns both errors, the regime they put you in, and the value of x at which each error reaches its tolerance, one per cent by default. Measured at 600 THz and 5800 K: x = 4.96, Wien runs 0.70 per cent below Planck, and the classical law is 27.7 times too large.
Implementation
/**
* Relative error analysis comparing Wien and Rayleigh-Jeans approximations to Planck's exact law.
*/
export function regimeRelativeErrors(
nu: CyclicFrequency | number,
T: number,
set: ConstantSet,
options: { epsilonW?: number; epsilonRJ?: number } = {},
): RegimeReport {
const { h, kB } = getBasePhysicsConstants(set);
const epsilonW = options.epsilonW ?? 0.01;
const epsilonRJ = options.epsilonRJ ?? 0.01;
const x = (h * nu) / (kB * T);
const wienRelativeError = Math.exp(-x);
// The classical (Rayleigh-Jeans) relative error, measured against Planck like Wien's above:
// (u_classical - u_Planck) / u_Planck = (e^x - 1)/x - 1. It was computed as 1 - x/(e^x - 1),
// which divides by u_classical instead: the two agree to first order at small x, but at
// x = 5.76 that read 0.98 while the classical law is 54.8 times Planck's value, and it put the
// 1% boundary at x = 0.020067 where the owning bead specifies 0.0198678. Past x = 700, e^x
// exceeds binary64 and the error is reported as Infinity, which callers must show in words.
let rayleighJeansRelativeError: number;
if (x < 1e-7) {
rayleighJeansRelativeError = x / 2;
} else if (x > 700) {
rayleighJeansRelativeError = Number.POSITIVE_INFINITY;
} else {
rayleighJeansRelativeError = Math.expm1(x) / x - 1;
}
const wienBoundaryX = Math.log(1 / epsilonW);
// Solve (e^x - 1)/x - 1 = epsilonRJ, that is e^x - 1 = (1 + epsilonRJ) x, by Newton's method.
// For small epsilonRJ, x ~ 2 * epsilonRJ - (2/3) * epsilonRJ^2.
let rjBoundaryX = 2 * epsilonRJ;
for (let iter = 0; iter < 20; iter++) {
const fVal = Math.expm1(rjBoundaryX) - (1 + epsilonRJ) * rjBoundaryX;
const dfVal = Math.exp(rjBoundaryX) - (1 + epsilonRJ);
const step = fVal / dfVal;
rjBoundaryX -= step;
if (Math.abs(step) < 1e-12) break;
}
const wienAdmitted = wienRelativeError <= epsilonW;
const rayleighJeansAdmitted = rayleighJeansRelativeError <= epsilonRJ;
let regime: "wien" | "rayleigh-jeans" | "intermediate";
if (wienAdmitted) {
regime = "wien";
} else if (rayleighJeansAdmitted) {
regime = "rayleigh-jeans";
} else {
regime = "intermediate";
}
return {
x,
wienRelativeError,
rayleighJeansRelativeError,
regime,
wienAdmitted,
rayleighJeansAdmitted,
wienBoundaryX,
rayleighJeansBoundaryX: rjBoundaryX,
};
}The explanation
Full explanation
Each resonator oscillation gets the mean energy (R/N)T whatever its frequency, so the energy up to a highest frequency grows as the cube of that frequency. Widen the range tenfold and the energy grows a thousandfold; remove the upper limit and the laboratory refuses the total, because on this model it has no finite value.
Show every step of the investigation
Set the temperature and the highest frequency, and read the energy up to it and the share lying above the probe frequency. Widen the range tenfold and compare the two energies, then remove the upper limit and read the refusal. The Avogadro readout repeats the calculation of §2 from the constants printed there.
An explanatory model, not an observation of nature. This embed starts from the laboratory’s worked defaults, not a saved run. Presentation options change the surrounding guide, never the numerical inputs.