Spaces:
Sleeping
Sleeping
| import numpy as np | |
| import matplotlib.pyplot as plt | |
| print("Why Computing E[Volume] Analytically is Intractable") | |
| print("="*70) | |
| print("\nThe mathematical setup:") | |
| print("Ideal tetrahedron with vertices at 0, 1, ∞, and w") | |
| print("where w is uniformly distributed on the Riemann sphere\n") | |
| print("The volume formula (Bloch-Wigner):") | |
| print("V(w) = Re[D(w) + D(w/(w-1)) + D(1-1/w)]") | |
| print("where D(z) = Im[Li₂(z) + log|z| log(1-z)]") | |
| print("\nThe expectation integral:") | |
| print("E[V] = (1/4π) ∫∫_S² V(stereographic(θ,φ)) sin(θ) dθ dφ") | |
| print(" = (1/4π) ∫₀^π ∫₀^{2π} V(cot(θ/2)e^{iφ}) sin(θ) dθ dφ") | |
| print("\nExpanding one dilogarithm term:") | |
| print("D(cot(θ/2)e^{iφ}) involves:") | |
| print(" - Li₂(cot(θ/2)e^{iφ})") | |
| print(" - log|cot(θ/2)| · log|1 - cot(θ/2)e^{iφ}|") | |
| print(" - Arg[1 - cot(θ/2)e^{iφ}] · log|cot(θ/2)|") | |
| print("\nThe other terms are even more complex:") | |
| print("D(cot(θ/2)e^{iφ}/(cot(θ/2)e^{iφ}-1)) - rational function argument") | |
| print("D(1-1/cot(θ/2)e^{-iφ}) - another composition") | |
| print("\nWhy analytical integration fails:") | |
| print("1. No separation of variables - θ and φ are entangled") | |
| print("2. Dilogarithm has no simple antiderivative") | |
| print("3. Branch cuts create discontinuities") | |
| print("4. Compositions of special functions lack closed forms") | |
| # Show how volume varies with parameters | |
| fig, axes = plt.subplots(2, 2, figsize=(12, 8)) | |
| # Simplified visualization - just show the integrand complexity | |
| theta = np.linspace(0.1, np.pi-0.1, 100) | |
| phi = np.linspace(0, 2*np.pi, 100) | |
| # 1. |w| as function of theta (stereographic projection) | |
| ax = axes[0, 0] | |
| w_abs = 1/np.tan(theta/2) # |cot(θ/2)| | |
| ax.semilogy(theta*180/np.pi, w_abs) | |
| ax.set_xlabel('θ (degrees)') | |
| ax.set_ylabel('|w| = |cot(θ/2)|') | |
| ax.set_title('Magnitude of w vs Polar Angle') | |
| ax.grid(True, alpha=0.3) | |
| ax.set_ylim(0.1, 100) | |
| # 2. Argument structure | |
| ax = axes[0, 1] | |
| theta_sample = np.pi/3 | |
| phi_grid = np.linspace(0, 2*np.pi, 200) | |
| w_sample = np.exp(1j*phi_grid) / np.tan(theta_sample/2) | |
| # Show one of the dilog arguments | |
| arg1 = w_sample / (w_sample - 1) | |
| ax.plot(phi_grid*180/np.pi, np.abs(arg1), label='|w/(w-1)|') | |
| ax.plot(phi_grid*180/np.pi, np.angle(arg1)*180/np.pi/50, label='Arg[w/(w-1)]/50') | |
| ax.set_xlabel('φ (degrees)') | |
| ax.set_ylabel('Value') | |
| ax.set_title(f'Dilog argument at θ={theta_sample*180/np.pi:.0f}°') | |
| ax.legend() | |
| ax.grid(True, alpha=0.3) | |
| # 3. Measure element | |
| ax = axes[1, 0] | |
| ax.plot(theta*180/np.pi, np.sin(theta), 'g-', linewidth=2) | |
| ax.fill_between(theta*180/np.pi, 0, np.sin(theta), alpha=0.3, color='green') | |
| ax.set_xlabel('θ (degrees)') | |
| ax.set_ylabel('sin(θ)') | |
| ax.set_title('Measure Element on Sphere') | |
| ax.grid(True, alpha=0.3) | |
| # 4. Schematic of integral | |
| ax = axes[1, 1] | |
| ax.text(0.5, 0.8, r'$E[V] = \frac{1}{4\pi} \int_0^\pi \int_0^{2\pi} V(w(\theta,\phi)) \sin\theta \, d\phi \, d\theta$', | |
| ha='center', va='center', fontsize=14, transform=ax.transAxes) | |
| ax.text(0.5, 0.6, r'where $w = \cot(\theta/2) e^{i\phi}$', | |
| ha='center', va='center', fontsize=12, transform=ax.transAxes) | |
| ax.text(0.5, 0.4, r'and $V(w) = \Re[\mathcal{D}(w) + \mathcal{D}\left(\frac{w}{w-1}\right) + \mathcal{D}\left(1-\frac{1}{w}\right)]$', | |
| ha='center', va='center', fontsize=12, transform=ax.transAxes) | |
| ax.text(0.5, 0.2, 'No known analytical solution!', | |
| ha='center', va='center', fontsize=16, weight='bold', color='red', | |
| transform=ax.transAxes) | |
| ax.axis('off') | |
| plt.tight_layout() | |
| plt.savefig('analytical_challenge.png', dpi=150) | |
| print("\nSaved visualization to analytical_challenge.png") | |
| # Compare approaches | |
| print("\n\nComparison of approaches:") | |
| print("-"*50) | |
| print("Analytical: ❌ Intractable due to dilogarithm integrals") | |
| print("Numerical quadrature: ⚠️ Difficult due to branch cuts") | |
| print("Monte Carlo: ✓ Works well, converges as 1/√n") | |
| print(" - 10K samples: ~3 digits precision") | |
| print(" - 100K samples: ~3.5 digits precision") | |
| print(" - 10M samples: ~4.5 digits precision") | |
| print("\nThe power of Monte Carlo:") | |
| print("- Handles branch cuts automatically") | |
| print("- No need to understand the analytic structure") | |
| print("- Parallelizable") | |
| print("- Provides error estimates via CLT") | |
| print("\nPhilosophical note:") | |
| print("Even though we have an 'exact' formula (Bloch-Wigner),") | |
| print("computing its expectation requires numerical methods.") | |
| print("This is a beautiful example where 'exact' ≠ 'analytically tractable'!") | |
| plt.close() |