Spaces:
Sleeping
Sleeping
File size: 5,373 Bytes
f9b644c |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
from ideal_poly_volume_toolkit.geometry import ideal_poly_volume_via_delaunay
import warnings
warnings.filterwarnings('ignore')
print("Central Limit Theorem-like Behavior in Ideal Polyhedra Volumes")
print("="*70)
print("\nHypothesis: As we add more free vertices, the volume distribution")
print("concentrates around its mean, similar to a CLT phenomenon.\n")
# Summary of what we've found
results = {
4: {"mean_ratio": 0.537, "std_ratio": 0.22, "alpha": 1.077, "beta": 0.974,
"max_vol": 1.01494, "name": "tetrahedron"},
5: {"mean_ratio": 0.658, "std_ratio": 0.14, "alpha": 4.77, "beta": 1.80,
"max_vol": 2.02988, "name": "triangular bipyramid"}
}
print("Observed pattern:")
print("Vertices | Mean/Max | Std/Max | Beta(α, β)")
print("-"*50)
for n_verts, data in results.items():
print(f"{n_verts:8d} | {data['mean_ratio']:8.3f} | {data['std_ratio']:7.3f} | "
f"Beta({data['alpha']:.2f}, {data['beta']:.2f})")
# Theoretical CLT-like scaling
print("\n\nCLT-like concentration analysis:")
print("-"*50)
# For CLT, we'd expect std ~ 1/sqrt(degrees of freedom)
# But here it's more complex due to:
# 1. Non-linear volume formula
# 2. Constrained domain (sphere)
# 3. Discrete combinatorial changes
print("\nKey observations:")
print("1. Mean/Max ratio increases: 0.537 → 0.658")
print("2. Relative std decreases: 0.22 → 0.14")
print("3. Beta α parameter increases rapidly: 1.08 → 4.77")
print("4. Distribution becomes more concentrated")
# Visualize the concentration
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
# 1. Compare the Beta distributions
ax = axes[0, 0]
x = np.linspace(0, 1, 1000)
for n_verts, data in results.items():
y = stats.beta.pdf(x, data['alpha'], data['beta'])
ax.plot(x, y, linewidth=2, label=f"{n_verts} vertices")
ax.set_xlabel('Normalized Volume')
ax.set_ylabel('Density')
ax.set_title('Beta Distribution Evolution')
ax.legend()
ax.grid(True, alpha=0.3)
# 2. Concentration measure (α + β)
ax = axes[0, 1]
n_verts_list = list(results.keys())
concentration = [data['alpha'] + data['beta'] for data in results.values()]
ax.plot(n_verts_list, concentration, 'bo-', markersize=10, linewidth=2)
ax.set_xlabel('Number of Vertices')
ax.set_ylabel('α + β (concentration parameter)')
ax.set_title('Distribution Concentration Growth')
ax.grid(True, alpha=0.3)
ax.text(4.5, 5, f"Growth: {concentration[1]/concentration[0]:.1f}x",
fontsize=12, ha='center')
# 3. Mean and std evolution
ax = axes[1, 0]
mean_ratios = [data['mean_ratio'] for data in results.values()]
std_ratios = [data['std_ratio'] for data in results.values()]
ax.plot(n_verts_list, mean_ratios, 'go-', markersize=10, linewidth=2, label='Mean/Max')
ax.plot(n_verts_list, std_ratios, 'ro-', markersize=10, linewidth=2, label='Std/Max')
ax.set_xlabel('Number of Vertices')
ax.set_ylabel('Ratio')
ax.set_title('Mean and Standard Deviation Evolution')
ax.legend()
ax.grid(True, alpha=0.3)
# 4. Theoretical analysis
ax = axes[1, 1]
ax.text(0.5, 0.9, "Why CLT-like but not exactly CLT:",
fontsize=14, weight='bold', ha='center', transform=ax.transAxes)
reasons = [
"1. Volume is highly nonlinear in vertex positions",
"2. Different combinatorial types (triangulations)",
"3. Domain is compact (sphere), not unbounded",
"4. Dependencies through Delaunay triangulation",
"5. Mixture of discrete and continuous effects"
]
for i, reason in enumerate(reasons):
ax.text(0.1, 0.7 - i*0.12, reason, fontsize=11,
ha='left', transform=ax.transAxes)
ax.text(0.5, 0.1, "Result: Concentration but with unique characteristics",
fontsize=12, style='italic', ha='center', transform=ax.transAxes,
bbox=dict(boxstyle="round,pad=0.3", facecolor="lightblue", alpha=0.5))
ax.axis('off')
plt.tight_layout()
plt.savefig('clt_analysis.png', dpi=150)
print("\nSaved analysis to clt_analysis.png")
# Predict next values
print("\n\nPredictions for 6 vertices (3 free points):")
print("-"*50)
# Rough extrapolation
if len(n_verts_list) >= 2:
# Mean ratio appears to grow
mean_growth = mean_ratios[1] / mean_ratios[0]
predicted_mean = mean_ratios[-1] * (mean_growth ** 0.7) # Sublinear growth
# Std ratio appears to shrink
std_shrink = std_ratios[1] / std_ratios[0]
predicted_std = std_ratios[-1] * std_shrink
# Concentration grows rapidly
conc_growth = concentration[1] / concentration[0]
predicted_conc = concentration[-1] * (conc_growth ** 0.8)
print(f"Predicted mean/max ratio: ~{predicted_mean:.2f}")
print(f"Predicted std/max ratio: ~{predicted_std:.2f}")
print(f"Predicted α + β: ~{predicted_conc:.0f}")
print(f"This suggests Beta(~{predicted_conc*0.8:.0f}, ~{predicted_conc*0.2:.0f})")
print("\n\nMixture effects from combinatorial types:")
print("-"*50)
print("As vertices increase, we get more triangulation possibilities.")
print("Each triangulation type might have its own 'mode' in the distribution.")
print("This could create:")
print("- Multi-modal distributions")
print("- Heavier tails than pure CLT would predict")
print("- Discrete jumps in the volume function")
print("\nThe observed smooth Beta distributions suggest these effects")
print("are being 'averaged out' by the continuous vertex positions.")
plt.close() |