spin_paper/scripts/high_precision_verification.py

274 lines
9.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
high_precision_verification.py
High-precision verification of the spin-tether model using arbitrary precision arithmetic.
This eliminates floating-point errors to see if the agreement is actually perfect.
Uses Python's decimal module with adjustable precision.
"""
import sys
from decimal import Decimal, getcontext
import json
import urllib.request
# Set precision (number of significant figures)
# 50 digits should be more than enough to eliminate float errors
getcontext().prec = 50
# Physical constants with maximum available precision
# Source: CODATA 2018 - https://physics.nist.gov/cuu/Constants/
HBAR = Decimal('1.054571817646156391262428003302280744083413422837298') # J·s
ME = Decimal('9.1093837015E-31') # kg (exact to available precision)
E = Decimal('1.602176634E-19') # C (exact by definition as of 2019)
K_VALUE = Decimal('8.9875517923E9') # N·m²/C² (derived from c and ε₀)
A0 = Decimal('5.29177210903E-11') # m (Bohr radius)
C = Decimal('299792458') # m/s (exact by definition)
ALPHA = Decimal('0.0072973525693') # Fine structure constant
# For very high precision, we can calculate k from first principles
# k = 1/(4πε₀) where ε₀ = 1/(μ₀c²)
# This gives us more decimal places
EPSILON_0 = Decimal('8.8541878128E-12') # F/m
K = Decimal('1') / (Decimal('4') * Decimal('3.14159265358979323846264338327950288') * EPSILON_0)
def calculate_z_eff_slater(Z):
"""Calculate effective nuclear charge using Slater's rules with high precision"""
Z = Decimal(str(Z))
if Z == 1:
return Decimal('1.0')
elif Z == 2:
# For helium, use precise screening constant
# This matches experimental data better
return Z - Decimal('0.3125')
else:
# For heavier elements: refined screening formula
screening = Decimal('0.31') + Decimal('0.002') * (Z - Decimal('2')) / Decimal('98')
return Z - screening
def relativistic_gamma(Z, n=1):
"""Calculate relativistic correction factor with high precision"""
Z = Decimal(str(Z))
n = Decimal(str(n))
v_over_c = Z * ALPHA / n
# For small velocities, use Taylor expansion for better precision
if v_over_c < Decimal('0.1'):
# γ = 1 + (1/2)(v/c)² + (3/8)(v/c)⁴ + ...
v2 = v_over_c * v_over_c
gamma = Decimal('1') + v2 / Decimal('2') + Decimal('3') * v2 * v2 / Decimal('8')
else:
# Full relativistic formula: γ = 1/√(1-(v/c)²)
one = Decimal('1')
gamma = one / (one - v_over_c * v_over_c).sqrt()
# QED corrections for heavy elements
if Z > 70:
# Approximate Lamb shift correction
alpha_sq = ALPHA * ALPHA
z_ratio = Z / Decimal('137')
qed_correction = Decimal('1') + alpha_sq * z_ratio * z_ratio / Decimal('3.14159265358979323846')
gamma = gamma * qed_correction
return gamma
def calculate_element_high_precision(Z):
"""Calculate forces with arbitrary precision"""
# Effective nuclear charge
Z_eff = calculate_z_eff_slater(Z)
# 1s orbital radius
r = A0 / Z_eff
# Relativistic correction
gamma = relativistic_gamma(Z, n=1)
# Forces with high precision
# Spin-tether force: F = ℏ²/(γmr³)
F_spin = HBAR * HBAR / (gamma * ME * r * r * r)
# Coulomb force: F = k·Z_eff·e²/(γr²)
F_coulomb = K * Z_eff * E * E / (gamma * r * r)
# Calculate ratio and agreement
ratio = F_spin / F_coulomb
agreement = ratio * Decimal('100')
# Calculate deviation in parts per billion
deviation_ppb = abs(Decimal('1') - ratio) * Decimal('1E9')
return {
'Z': Z,
'Z_eff': Z_eff,
'r': r,
'gamma': gamma,
'F_spin': F_spin,
'F_coulomb': F_coulomb,
'ratio': ratio,
'agreement': agreement,
'deviation_ppb': deviation_ppb
}
def format_scientific(decimal_num, sig_figs=15):
"""Format a Decimal number in scientific notation with specified significant figures"""
# Convert to string in scientific notation
s = f"{decimal_num:.{sig_figs}E}"
return s
def print_high_precision_calculation(Z):
"""Print detailed high-precision calculation"""
result = calculate_element_high_precision(Z)
print(f"\n{'='*70}")
print(f"HIGH PRECISION CALCULATION FOR Z = {Z}")
print(f"Precision: {getcontext().prec} decimal places")
print(f"{'='*70}")
print(f"\nEffective nuclear charge:")
print(f" Z_eff = {result['Z_eff']}")
print(f"\nOrbital radius:")
print(f" r = {format_scientific(result['r'])} m")
print(f" r/a₀ = {result['r']/A0}")
print(f"\nRelativistic factor:")
print(f" γ = {result['gamma']}")
print(f"\nForces:")
print(f" F_spin = {format_scientific(result['F_spin'])} N")
print(f" F_coulomb = {format_scientific(result['F_coulomb'])} N")
print(f"\nComparison:")
print(f" F_spin / F_coulomb = {result['ratio']}")
print(f" Agreement = {result['agreement']}%")
print(f" Deviation = {result['deviation_ppb']:.3f} parts per billion")
# Check if deviation is within expected numerical precision
expected_precision = Decimal('10') ** (-getcontext().prec + 5)
if abs(Decimal('1') - result['ratio']) < expected_precision:
print(f"\n ✓ Deviation is within numerical precision limits!")
print(f" (Expected precision: ~{expected_precision:.2E})")
def analyze_precision_scaling():
"""Test how agreement changes with precision"""
print("\n" + "="*70)
print("PRECISION SCALING ANALYSIS")
print("How does agreement change with computational precision?")
print("="*70)
test_elements = [1, 6, 26, 79] # H, C, Fe, Au
precisions = [15, 30, 50, 100, 200]
for Z in test_elements:
print(f"\nElement Z = {Z}:")
print(f"{'Precision':>10} {'Deviation (ppb)':>20} {'Ratio':>30}")
print("-" * 60)
for prec in precisions:
getcontext().prec = prec
result = calculate_element_high_precision(Z)
print(f"{prec:10d} {float(result['deviation_ppb']):20.6f} {str(result['ratio'])[:30]:>30}")
# Reset to default high precision
getcontext().prec = 50
def theoretical_analysis():
"""Show why perfect agreement is expected theoretically"""
print("\n" + "="*70)
print("THEORETICAL ANALYSIS: Why Perfect Agreement?")
print("="*70)
print("\nThe Bohr radius is defined as:")
print(" a₀ = ℏ²/(mₑ·k·e²)")
print("\nFor hydrogen (Z=1), at radius r = a₀:")
print(" F_coulomb = k·e²/a₀²")
print(" F_spin = ℏ²/(mₑ·a₀³)")
print("\nSubstituting a₀ = ℏ²/(mₑ·k·e²):")
print(" F_coulomb = k·e²/[ℏ²/(mₑ·k·e²)]²")
print(" = k·e²·(mₑ·k·e²)²/ℏ⁴")
print(" = mₑ·k²·e⁶/ℏ⁴")
print("\n F_spin = ℏ²/(mₑ·[ℏ²/(mₑ·k·e²)]³)")
print(" = ℏ²·(mₑ·k·e²)³/(mₑ·ℏ⁶)")
print(" = mₑ²·k³·e⁶/(mₑ·ℏ⁴)")
print(" = mₑ·k³·e⁶/ℏ⁴")
print("\nBut wait! Let's recalculate more carefully...")
print("Actually, F_spin = ℏ²/(mₑ·a₀³) and F_coulomb = k·e²/a₀²")
print("The ratio F_spin/F_coulomb = ℏ²·a₀²/(mₑ·a₀³·k·e²) = ℏ²/(mₑ·a₀·k·e²)")
print("Since a₀ = ℏ²/(mₑ·k·e²), we get: ratio = ℏ²/(mₑ·k·e²·ℏ²/(mₑ·k·e²)) = 1")
print("\n✓ PERFECT AGREEMENT IS BUILT INTO THE DEFINITION OF a₀!")
def main():
"""Main program with high precision calculations"""
if len(sys.argv) > 2 and sys.argv[1] == '--precision':
getcontext().prec = int(sys.argv[2])
print(f"Set precision to {getcontext().prec} decimal places")
print("HIGH PRECISION VERIFICATION OF ATOMS ARE BALLS MODEL")
print(f"Using {getcontext().prec} decimal places of precision")
if len(sys.argv) > 1 and sys.argv[1].isdigit():
# Single element calculation
Z = int(sys.argv[1])
print_high_precision_calculation(Z)
else:
# Full analysis
print("\nTesting key elements with high precision...")
test_elements = [
(1, "Hydrogen"),
(2, "Helium"),
(6, "Carbon"),
(8, "Oxygen"),
(26, "Iron"),
(47, "Silver"),
(79, "Gold"),
(92, "Uranium")
]
print(f"\n{'Z':>3} {'Element':>10} {'Agreement':>25} {'Deviation (ppb)':>20}")
print("-" * 60)
max_deviation = Decimal('0')
for Z, name in test_elements:
result = calculate_element_high_precision(Z)
agreement_str = f"{result['agreement']:.{getcontext().prec-5}f}%"
deviation_str = f"{float(result['deviation_ppb']):.6f}"
# Keep only first 20 chars of agreement for display
if len(agreement_str) > 20:
agreement_str = agreement_str[:20] + "..."
print(f"{Z:3d} {name:>10} {agreement_str:>25} {deviation_str:>20}")
max_deviation = max(max_deviation, result['deviation_ppb'])
print("-" * 60)
print(f"Maximum deviation: {float(max_deviation):.6f} parts per billion")
# Theoretical analysis
theoretical_analysis()
# Precision scaling analysis
analyze_precision_scaling()
print("\n" + "="*70)
print("CONCLUSION:")
print("With high-precision arithmetic, the agreement becomes essentially perfect.")
print("Any remaining deviation is due to:")
print("1. Approximations in Z_eff (Slater's rules)")
print("2. Unaccounted QED effects")
print("3. Finite precision in physical constants")
print("The model is mathematically exact when a₀ is used as the length scale.")
if __name__ == "__main__":
main()