The expansion of the spherical ball of fire generated in an explosion may be analysed to deduce the initial energy, $E$, released by a nuclear weapon. The British physicist Geoffrey Taylor used dimensional analysis to demonstrate that the radius of this sphere, $R(t)$ should be related to $E$, the air density, $\rho_\mathrm{air}$, and time, $t$, through
$$
R(t) = CE^{\frac{1}{5}}\rho_\mathrm{air}^{-\frac{1}{5}}t^{\frac{2}{5}},
$$
where, using model-shock wave problems, Taylor estimated the dimensionless constant $C \approx 1$.
Using the data obtained from declassified timed images of the first New Mexico atomic explosion, Taylor confirmed this law and produced an estimate of the (then unknown) value of $E$. Use a log-log plot to fit the data in the table below (after G. I. Taylor, *Proc. Roy. Soc. London* **A201**, 159 (1950)) to the model and confirm the time-dependence of $R$. Taking $\rho_\mathrm{air} = 1.25\;\mathrm{kg\,m^{-3}}$ deduce $E$ and express its value in Joules and in 'kilotons of TNT' where the explosive energy released by 1 ton of TNT is arbitrarily defined to be $4.184\times 10^9\;\mathrm{J}$.

$t\;/\mathrm{ms}$ | $R\;/\mathrm{m}$ | $t\;/\mathrm{ms}$ | $R\;/\mathrm{m}$ | $t\;/\mathrm{ms}$ | $R\;/\mathrm{m}$ |

0.1 | 11.1 | 1.36 | 42.8 | 4.34 | 65.6 |

0.24 | 19.9 | 1.50 | 44.4 | 4.61 | 67.3 |

0.38 | 25.4 | 1.65 | 46.0 | 15.0 | 106.5 |

0.52 | 28.8 | 1.79 | 46.9 | 25.0 | 130.0 |

0.66 | 31.9 | 1.93 | 48.7 | 34.0 | 145.0 |

0.80 | 34.2 | 3.26 | 59.0 | 53.0 | 175.0 |

0.94 | 36.3 | 3.53 | 61.1 | 62.0 | 185.0 |

1.08 | 38.9 | 3.80 | 62.9 | ||

1.22 | 41.0 | 4.07 | 64.3 |

Note: this data can be downloaded as new-mexico-blast-data.txt.

The code below shows a good fit to the model and predicts an energy release of 22.9 kilotons of TNT, close to the actual value of approximately 20 kilotons.

```
import numpy as np
import matplotlib.pyplot as plt
# Load the data, skipping the header line, and convert to log10, time in secs
t, R = np.loadtxt('new-mexico-blast-data.txt', unpack=True, skiprows=1)
logt, logR = np.log10(t/1000), np.log10(R)
# Linear, least-squares fit: logR = m(logt) + c
m, c = np.polyfit(logt, logR, 1)
print('Best fit line to log-log plot: m = {}, c = {}'.format(m,c))
# Density of air, kg.m-3
rho_air = 1.25
E = rho_air * 10**(5 * c)
# Report the estimated energy in J and kilotons of TNT (1 kton TNT = 4.184e12 J)
print('Estimated energy release: {:.3e} J, approximately = {:.1f} ktons of TNT'
.format(E, E / 4.184e12))
# Plot the data and best fit line
plt.plot(logt, logR, 'ko')
logtfit = np.linspace(min(logt), max(logt), 1000)
lfit = m * logtfit + c
plt.plot(logtfit, lfit, 'k')
plt.show()
```

Output:

```
Best fit line to log-log plot: m = 0.40582262510045536, c = 2.7767362140219047
Estimated energy release: 9.563e+13 J, approximately = 22.9 ktons of TNT
```