Un script Python qui permet de voir le spectre du corps noir à différentes températures (choisies par l'utilisateur) et le confronter au spectre du visible.
Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
Le code prend utilise la formule de Planck et la constante de Stefan pour afficher la courbe du spectre d'émittance pour différentes températures que l'utilisateur peut changer. Cela permet de le confronter au spectre du visible.
SKOH
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
'''
@file : Corps_noir.py
@brief : Montre l'emittance spectrale du corps noir pour différentes températures.
@author : S+KOH
'''
import numpy as np
from scipy.constants import *
import matplotlib.pyplot as plt
import matplotlib.pylab as pl
#####################################################
# Liste à changer pour afficher différentes courbes
# Vous povez en mettre autant que vous voulez
# ATENTION: important de les trier par odre croissant
temperatures = [3500, 4000, 4500, 5000, 5500, 6000, 6500, 7000]
#####################################################
#########
# CALCULS
#########
# min et max des longueurs d'onde du visible
min_visible, max_visible = 380, 780
# Constante de Stefan
Stefan = (2 * np.pi**5 * k**4) / (15 * c**2 * h**3)
# Formule de Planck
def Planck(l, T):
intens = (2 * h * c**2) / ((l**5) *
(np.exp((h * c / (l * k * T))) - 1))
return intens
# On commence à 0.5 mm pour éviter de diviser par zéro
# On va jusqu'à 2.5ym
# tips pour afficher la dernière valeur sur les axes
onde = np.arange(0.5e-9, 2.501e-6, 0.5e-9)
# intnsité
intensity = []
for i in range(len(temperatures)):
intensity.append(Planck(onde, temperatures[i]))
# determination des pics pour les affichages par la suite
maxx = []
for i in intensity:
maxx.append(onde[i.argmax()] * 1e9)
maxy = [0]
for i in range(len(temperatures)):
maxy.append(np.max(intensity[i]))
###############
# PREMIER GRAPH
###############
fig, axs = plt.subplots(nrows=1, ncols=2, figsize=(
20, 10), constrained_layout=True, sharey=True)
ax1 = axs[0]
# couleur des courbes
colors = pl.cm.jet(np.linspace(0, 1, len(temperatures)))
# plot
for i in range(len(temperatures)):
ax1.plot(onde * 1e9, intensity[i],
label=temperatures[i], color=colors[i])
ax1.plot(maxx[i], np.max(intensity[i]), 'ko',
alpha=0.5) # plot des max
ax1.plot(maxx[-1], np.max(intensity[-1]), 'ko',
alpha=0.5, label='$\lambda_{max}$') # dernier plot des max pour la légende
ax1.legend(loc='best', title='Températures (°K)') # légende
# lignes pour les zones de longueurs d'ondes
ax1.axvline(min_visible, c='k', ls='--', lw='1')
ax1.axvline(max_visible, c='k', ls='--', lw='1')
# texte pour les zones
bbox = dict(boxstyle="round", fc="0.8", alpha=0.8)
ax1.text(50, maxy[-1], 'Ultraviolet', color='black',
bbox=bbox, fontsize=10)
ax1.text(500, maxy[-1], 'Visible', color='black',
bbox=bbox, fontsize=10)
ax1.text(850, maxy[-1], 'Infrarouge', color='black',
bbox=bbox, fontsize=10)
# axes setup
ax1.set_xlabel("Longueur d'onde $\lambda\ (nm)$")
ax1.set_ylabel('Intensité $(x10^{13}\ W/m^3)$')
fig.suptitle('Emittance spectrale du corps noir',
fontsize=20, fontweight='bold', fontname='Ubuntu')
ax1.set_title('Tout le spectre', fontsize=12,
fontweight='bold', fontname='Ubuntu')
ax1.set_xticks([0, 2500], minor=True)
for tick in ax1.xaxis.get_major_ticks():
tick.label.set_fontsize(10)
tick.label.set_rotation(45) # afin d'éviter de supperposer
ax1.set_yticks(maxy)
for tick in ax1.yaxis.get_major_ticks():
tick.label.set_fontsize(10)
# pas de marges
ax1.margins(0)
# grille
ax1.grid(which='both', alpha=0.5, linestyle='-')
################
# DEUXIEME GRAPH
################
ax2 = axs[1]
# plot
for i in range(len(temperatures)):
plt.plot(onde * 1e9, intensity[i],
label=(temperatures[i]), color=colors[i])
ax2.plot(maxx[i], np.max(intensity[i]), 'ko', alpha=0.5)
ax2.axvline(maxx[i], color="k", alpha=0.3)
# lignes pour les zones de longueurs d'ondes
ax2.axvline(min_visible, c='k', ls='--', lw='1')
ax2.axvline(max_visible, c='k', ls='--', lw='1')
# axes setup
ax2.set_xlim((maxx[-1] - 50, maxx[0] + 50))
ax2.set_xlabel("Longueur d'onde $\lambda\ (nm)$")
ax2.set_title('Zoom autours des extremums',
fontsize=12, fontweight='bold', fontname='Ubuntu')
ax2.set_xticks(maxx)
for tick in ax2.xaxis.get_major_ticks():
tick.label.set_fontsize(10)
tick.label.set_rotation(45) # afin d'éviter de supperposer
# grille
ax2.grid(which='both', alpha=0.5, linestyle='-')
###############################
# spectre du Visible
###############################
ax1.axvspan(380, 400, facecolor='#760043', alpha=0.8)
ax1.axvspan(400, 420, facecolor='#FF00C8', alpha=0.8)
ax1.axvspan(420, 440, facecolor='#D200E9', alpha=0.8)
ax1.axvspan(440, 460, facecolor='#6F00F6', alpha=0.8)
ax1.axvspan(460, 480, facecolor='#5100FF', alpha=0.8)
ax1.axvspan(480, 500, facecolor='#00E9FF', alpha=0.8)
ax1.axvspan(500, 520, facecolor='#00E085', alpha=0.8)
ax1.axvspan(520, 540, facecolor='#00C940', alpha=0.8)
ax1.axvspan(540, 560, facecolor='#00DC27', alpha=0.8)
ax1.axvspan(560, 580, facecolor='#B3FF18', alpha=0.8)
ax1.axvspan(580, 600, facecolor='#F8FF0B', alpha=0.8)
ax1.axvspan(600, 620, facecolor='#FF9100', alpha=0.8)
ax1.axvspan(620, 640, facecolor='#FF5200', alpha=0.8)
ax1.axvspan(640, 700, facecolor='#FF0000', alpha=0.8)
ax1.axvspan(700, 780, facecolor='#840000', alpha=0.8)
ax2.axvspan(380, 400, facecolor='#760043', alpha=0.8)
ax2.axvspan(400, 420, facecolor='#FF00C8', alpha=0.8)
ax2.axvspan(420, 440, facecolor='#D200E9', alpha=0.8)
ax2.axvspan(440, 460, facecolor='#6F00F6', alpha=0.8)
ax2.axvspan(460, 480, facecolor='#5100FF', alpha=0.8)
ax2.axvspan(480, 500, facecolor='#00E9FF', alpha=0.8)
ax2.axvspan(500, 520, facecolor='#00E085', alpha=0.8)
ax2.axvspan(520, 540, facecolor='#00C940', alpha=0.8)
ax2.axvspan(540, 560, facecolor='#00DC27', alpha=0.8)
ax2.axvspan(560, 580, facecolor='#B3FF18', alpha=0.8)
ax2.axvspan(580, 600, facecolor='#F8FF0B', alpha=0.8)
ax2.axvspan(600, 620, facecolor='#FF9100', alpha=0.8)
ax2.axvspan(620, 640, facecolor='#FF5200', alpha=0.8)
ax2.axvspan(640, 700, facecolor='#FF0000', alpha=0.8)
ax2.axvspan(700, 780, facecolor='#840000', alpha=0.8)
#######################
# sauvegarder une image
#######################
fig.savefig('Corps_Noir - Corentin MICHEL.png', bbox_inches='tight', dpi=300)
# show the plot
plt.show()
