On réalise un traitement antireflet sur un verre d’indice de réfraction en déposant une couche d’indice optique et d’épaisseur de l’ordre de la centaine de . Le but de ce traitement est d’annuler la réflexion dans l’air pour la longueur d’onde (longueur d’onde pour laquelle l’œil est le plus sensible en vision diurne).
Les 4 ondes sont des OPPH de même fréquence :
Les champs électrique et magnétique sont continus à chacune des deux interfaces.
L’objectif de cet exercice est de déterminer l’épaisseur et l’indice optique de la couche anti-reflet.
1/ Donner l’expression de l’indice optique en fonction de la vitesse de phase et de la célérité de la lumière dans le vide. En déduire les expressions de , et en fonction de , , et de la célérité de la lumière dans le vide.
On en déduit
2/ Déterminer les champs magnétiques associés à chacune des ondes.
On utilise la relation de structure
3/ En utilisant la continuité des champs, établir un système de 4 équations reliant les amplitudes , , et . Mettre ce système sous la forme où est une matrice à déterminer.
On en déduit
4/ Donner une solution de l’équation . En déduire que pour que le traitement antireflet fonctionne, il faut que .
est une solution de l’équation. C’est une solution triviale, avec des ondes identiquement nulles dans les trois milieux. Cette solution est unique si est inversible, c’est-à-dire si .
Pour que le traitement antireflet fonctionne, il faut qu’il existe une solution non triviale, c’est-à-dire que ne soit pas inversible, c’est-à-dire que .
5/ La fonction np.linalg.det de la bibliothèque numpy permet de calculer le déterminant d’une matrice. Écrire une fonction D(e,nc) qui renvoie le déterminant de la matrice en fonction de et .
import numpy as np
n = 1.5
lam = 550e-9
c = 3e8
omega = 2 * np.pi * c / lam
def D(e,nc):
kt = n * omega / c
kc = nc * omega / c
M = np.array([
[1, -1, -1, 0],
[1, -nc, nc, 0],
[0, np.exp(-1j*kc*e), np.exp(1j*kc*e), -np.exp(-1j*kt*e)],
[0, nc*np.exp(-1j*kc*e), -nc*np.exp(1j*kc*e), -n*np.exp(-1j*kt*e)]
])
return np.linalg.det(M)Pour résoudre numériquement l’équation , on peut utiliser la fonction root de la bibliothèque scipy.optimize qui permet de trouver les racines d’une fonction.
La fonction dont root doit trouver les racines doit prendre en argument un tableau numpy de réels et renvoyer un tableau numpy de réels.
On définit la fonction
def f(X):
e, nc = X
d = D(e, nc)
return [d.real, d.imag]6/ Expliquer pourquoi la fonction f est adaptée pour être utilisée avec la fonction root de scipy.optimize.
La fonction f prend bien en argument un tableau numpy de réels (le tableau X qui contient les valeurs de e et nc) et renvoie un tableau numpy de réels (le tableau [d.real, d.imag]).
Trouver les de la fonction f est bien ce qu’on veut car le complexe est nul si et seulement si sa partie réelle et sa partie imaginaire sont nulles, c’est-à-dire si et seulement si f(X) == [0, 0].
On trouve une solution avec les instructions suivantes :
from scipy.optimize import root
solution = root(f, [1e-7, 1.3] ) # on fournit une estimation initiale pour e et nc
print(solution.x)