Planck’s radiation law

PyAstronomy.pyasl.planck(T, lam=None, nu=None)

Evaluate Planck’s radiation law.

Depending on whether wavelength or frequency is specified as input, the function evaluates:

\[B_{\nu} = \frac{2\pi h \nu^3}{c^2} \frac{1}{e^{\frac{h\nu}{kT}} - 1}\]


\[B_{\lambda} = \frac{2\pi h c^2}{\lambda^5} \frac{1}{e^{\frac{h c}{\lambda kT}} - 1} \; .\]

If lambda is given (in meters), the output units are W/(m^2 m). To convert into erg/(cm^2 A s), the output has to be multiplied by a factor of 1e-7.


Temperature in Kelvin.

lamfloat or array, optional

Wavelength in meters.

nufloat or array, optional

Frequency in Hz.

Spectral radiancefloat or array

Depending on whether lam or nu were specified, returns the spectral radiance per area and wavelength or frequency. The unit (SI) will be W/(m^2 m) if lam was given and W/(m^2 Hz) if nu was specified.


from __future__ import print_function
import numpy as np
import matplotlib.pylab as plt
from PyAstronomy.pyasl import planck

# Define wavelength in meters
lam = np.arange(1000.0*1e-10, 20000.*1e-10, 20e-10)

# Get the Planck spectrum in [W/(m**2 m)] for a temperature of 7000 K
s7 = planck(7000., lam=lam)
# Get the Planck spectrum in [W/(m**2 m)] for a temperature of 5000 K
s5 = planck(5000., lam=lam)

# Convert into erg/(cm**2 * A * s)
s5erg = s5 * 1e-7
s7erg = s7 * 1e-7

# Integrate the spectrum and compare with Stefan-Boltzmann law
i5 = np.sum(s5) * (lam[1] - lam[0])
i7 = np.sum(s7) * (lam[1] - lam[0])

print("5000 K integral: %.3e W/m**2 (Stefan-Boltzmann predicts %.3e W/m**2)" % (i5, (5.67e-8*5000.**4)))
print("7000 K integral: %.3e W/m**2 (Stefan-Boltzmann predicts %.3e W/m**2)" % (i7, (5.67e-8*7000.**4)))

plt.xlabel("Wavelength [$\AA$]")
plt.ylabel("Flux [erg/cm$^2$/A/s]")
plt.plot(lam*1e10, s5erg, 'r-')
plt.plot(lam*1e10, s7erg, 'b-')