$$\newcommand{\SI}[2]{{#1}~\mathrm{#2}} \newcommand{\si}[1]{\mathrm{#1}} \renewcommand{\vec}[1]{\mathbf{#1}} $$
Bodies which absorb all incident radiation are known as black bodies and stars are very good approximations to black bodies. The intensity of the light we get from stars at different wavelengths has a distinctive shape and can be measured to determine its black-body temperature.
The flux $F$ (power per unit area of a black body is given by $$F\left(\equiv \frac{P}{A}\right)=\sigma T^4,$$ where $\sigma$ is the Stefan–Boltzmann constant (its value is $\sigma = 5.67\times 10^{-8}\mathrm{~W~m^{-2}~K^{-4}}$).
The Stefan–Boltzmann Law shows how the total power emitted depends on temperature. The Wien displacement law gives the way in which the wavelength of maximum intensity—the peak of the curve—shifts with temperature.
It is found that the peak wavelength, $\lambda_\mathrm{peak}$, is inversely proportional to temperature $$\lambda_\mathrm{peak}T=2.90\mathrm{~mm~K}.$$
The shape of black-body curves is given by the Planck radiation law, which gives the energy density as a fuction of wavelength (the Stefan–Boltzmann law and Wien’s displacement law follow immediately from it: by integrating over all $\lambda$ and finding the peak value of $\lambda$ respectively).
Max Planck in 1901 published an equation which fitted the experimental results for black-body radiation, but he could only derive it by quantizing the vibrations allowed in the oscillators within such bodies. This, together with Einstein’s paper quantizing light in 1905, established quantum theory, a cornerstone of modern physics.
The Planck radiation law gives the spectral emissive power of a black body as $$e_{\lambda b}=\frac{2\pi h c^2 \lambda^{-5}}{\exp(hc/\lambda k T)-1}.$$
import numpy as np
import matplotlib.pyplot as plt
# Constants
from scipy.constants import c
from scipy.constants import h
from scipy.constants import Boltzmann as kB
from scipy.constants import Wien
def planck (wavelength, temp):
e = 2*np.pi*h*c**2 / (wavelength**5*(np.exp(h*c/(wavelength*kB*temp))-1))
return e
wavelength = np.linspace(100e-9,2000e-9,100)
#Maxima line
peak = 2*np.pi*h*c**2/(wavelength**5*(np.exp(h*c/(kB*Wien))-1))
temps=np.array([2000,2500,3000,3500,4000,4500,5000,5500])
#Plotting from here on in
fig = plt.figure(figsize=(6, 4))
ax = fig.add_subplot(111)
plt.rcdefaults()
ax.plot(Wien/temps, planck(Wien/temps,temps), 'ko', ms=10, mfc='none')
ax.plot(wavelength, planck(wavelength,3500), 'k-')
ax.plot(wavelength, planck(wavelength,4000), 'k-')
ax.plot(wavelength, planck(wavelength,4500), 'k-')
ax.plot(wavelength, planck(wavelength,5000), 'k-')
ax.plot(wavelength, planck(wavelength,5500), 'k-')
ax.plot(wavelength, peak, 'k--')
ax.set_ylim(0,7e13) # note this has to come after plotting of data
ax.set_xlim(left=0,right=2e-6)
ax.set_xlabel(r'$\lambda / \mathrm{m}$')
ax.set_ylabel(r'$\mathrm{spectral\;radiance}\,/\,\mathrm{W}\,\mathrm{m}^{-3}$')
#ax.set_title('Black body radiation curves')
from matplotlib import ticker
formatter = ticker.ScalarFormatter(useMathText=True)
formatter.set_scientific(True)
formatter.set_powerlimits((-1,1))
ax.xaxis.set_major_formatter(formatter)
ax.yaxis.set_major_formatter(formatter)
ax.text(Wien/3500+1e-8, planck(Wien/3500,3500)+18e11, r'$3500\;\mathrm{K}$')
ax.text(Wien/4000+1e-8, planck(Wien/4000,4000)+18e11, r'$4000\;\mathrm{K}$')
ax.text(Wien/4500+1e-8, planck(Wien/4500,4500)+18e11, r'$4500\;\mathrm{K}$')
ax.text(Wien/5000+1e-8, planck(Wien/5000,5000)+18e11, r'$5000\;\mathrm{K}$')
ax.text(Wien/5500+1e-8, planck(Wien/5500,5500)+18e11, r'$5500\;\mathrm{K}$')
plt.show()
The Wien displacement law tells us the region of the spectrum in which thermal radiation is most intense for sources at different temperatures: room temperature, $\lambda_{\text{peak}}\approx\SI{10}{\mu m}$, far infra-red; sun’s surface ($\SI{5800}{K}$), $\lambda_{\text{peak}}\approx\SI{480}{nm}$, blue; etc. It is obvious that the colour with which a hot body seems to glow will change with the temperature of the body. Between about $\SI{500}{^\circ C}$ and $\SI{1500}{^\circ C}$, the temperature of a body may be judged quite accurately by eye.
$t / ^\circ\mathrm{C}$ | colour |
---|---|
500 | red, just visible in daylight |
700 | dark red |
900 | bright red (“cherry” red) |
1100 | orange |
1300 | yellowish-white |
1500 | dazzling white |
Hotter stars produce more of their light at the blue/violet end of the spectrum and appear white or blue-white. Cooler stars look red, since they produce more of their light at longer wavelengths.
%load_ext version_information
%version_information numpy, matplotlib, scipy
The version_information extension is already loaded. To reload it, use: %reload_ext version_information
Software | Version |
---|---|
Python | 3.6.1 32bit [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] |
IPython | 5.3.0 |
OS | Linux 3.2.98 smp i686 Intel R _Pentium R _4_CPU_2.40GHz with slackware 14.0 |
numpy | 1.12.1 |
matplotlib | 2.0.2 |
scipy | 0.19.0 |
Thu Apr 26 19:32:26 2018 GMT |