Formalisme matriciel de Macleod et modélisation numérique
Du L2 au M2 — trois niveaux de lectureVersion en ligne et simulateur interactif : tpcouchesminces.vercel.app
Ce document détaille la physique et les équations permettant de calculer les propriétés optiques d'un empilement de couches minces. Conçu pour les étudiants en physique numérique et optique, il tisse le lien entre l'intuition physique (interférences), les équations de Maxwell, et l'implémentation numérique via la méthode des matrices de transfert (TMM).
Au lieu de sommer à la main la série infinie des réflexions multiples dans chaque couche (formule d'Airy), on utilise une approche globale dérivée de l'électromagnétisme : la méthode matricielle. Chaque couche est modélisée par une matrice 2×2 ; l'effet d'un empilement de 50 couches n'est que le produit de 50 matrices.
Pour garantir une lecture sans ambiguïté, l'ensemble des paramètres, variables et symboles utilisés dans ce document est regroupé ci-dessous selon leur domaine physique :
| Symbole | Nom | Unité | Définition & Signification physique |
|---|---|---|---|
| $\lambda$ | Longueur d'onde | $\text{nm}$ (ou $\mu\text{m}$) | Longueur d'onde de la lumière incidente dans le vide ($c/f$). |
| $\omega$ | Pulsation angulaire | $\text{rad}\cdot\text{s}^{-1}$ | $\omega = 2\pi c / \lambda = 2\pi f$, fréquence angulaire de l'oscillation temporelle. |
| $c$ | Célérité de la lumière | $\text{m}\cdot\text{s}^{-1}$ | Vitesse de la lumière dans le vide ($c = 1/\sqrt{\varepsilon_0\mu_0} \approx 3 \times 10^8\text{ m/s}$). |
| $k_0$ | Nombre d'onde dans le vide | $\text{rad}\cdot\text{m}^{-1}$ | $k_0 = \omega/c = 2\pi/\lambda$. |
| $z$ | Coordonnée spatiale normale | $\text{nm}$ (ou $\text{m}$) | Axe orienté vers le haut ($\uparrow$), avec $z=0$ à la surface du substrat. |
| $z_j$ | Altitude d'interface | $\text{nm}$ | $z_j = \sum_{k=1}^j d_k$, altitude du sommet de la couche $j$ ($z_0 = 0$). |
| $\theta_0$ | Angle d'incidence | $\text{rad}$ ou $^\circ$ | Angle du faisceau incident dans l'air par rapport à la normale $z$. |
| $\theta_j$ | Angle de réfraction | $\text{rad}$ (complexe) | Angle dans la couche $j$ ($\hat{n}_j \sin\theta_j = n_0 \sin\theta_0$). |
| $S_0$ | Invariant de Snell-Descartes | sans dim. | $S_0 = n_0 \sin\theta_0$, invariant le long de tout l'empilement multicouche. |
| $k_x$ | Composante transverse d'onde | $\text{rad}\cdot\text{m}^{-1}$ | $k_x = k_0 S_0 = k_0 n_0 \sin\theta_0$ (conservée par invariance par translation). |
| $k_{z,j}$ | Composante normale d'onde | $\text{rad}\cdot\text{m}^{-1}$ | $k_{z,j} = k_0 \hat{n}_j \cos\theta_j = k_0 \sqrt{\hat{n}_j^2 - S_0^2}$. |
| Symbole | Nom | Unité | Définition & Signification physique |
|---|---|---|---|
| $n$ | Indice de réfraction (réel) | sans dim. | Ralentissement de la vitesse de phase ($v_\phi = c/n$) dans le matériau. Pour un diélectrique transparent, $n \ge 1$ ; un métal peut avoir $n < 1$ (argent du § 9 : $n = 0.12$). |
| $\kappa$ | Coefficient d'extinction | sans dim. | Atténuation de l'onde par absorption diélectrique/ohmique ($\kappa \ge 0$). |
| $\hat{n}$ | Indice de réfraction complexe | sans dim. | $\hat{n} = n - i\kappa$ (convention Macleod $e^{+i\omega t}$ imposant $\mathrm{Im}(\hat{n}) \le 0$). |
| $n_0, \eta_0$ | Indice & Admittance de l'air | sans dim. / $\mathcal{Y}_0$ | Milieu incident semi-infini au sommet ($z \ge z_N$, avec $n_0 = 1.0$). |
| $n_{sub}, \eta_{sub}$ | Indice & Admittance du substrat | sans dim. / $\mathcal{Y}_0$ | Milieu émergent semi-infini à la base de l'empilement ($z \le 0$). |
| $d$ ou $d_j$ | Épaisseur physique (géométrique) | $\text{nm}$ | Épaisseur métrique de la couche ($d_j = z_j - z_{j-1}$). |
| $nd$ ou $n_j d_j$ | Épaisseur optique | $\text{nm}$ | Chemin optique effectif traversé par la lumière ($n \times d$). |
| $\delta$ ou $\delta_j$ | Déphasage optique de couche | $\text{rad}$ | $\delta_j = k_{z,j} d_j = \frac{2\pi}{\lambda} \hat{n}_j d_j \cos\theta_j$. |
| $N$ | Nombre total de couches | entier | Nombre de couches du multicouche (numérotées de $j=1$ à la base à $j=N$ au sommet). |
| Symbole | Nom | Unité | Définition & Signification physique |
|---|---|---|---|
| $\vec{E}, \vec{H}$ | Champs $\vec{E}$ et $\vec{H}$ | $\text{V}\cdot\text{m}^{-1}$, $\text{A}\cdot\text{m}^{-1}$ | Vecteurs champs électrique et magnétique complexes. |
| $E_\parallel, H_\parallel$ | Champs tangentiels | $\text{V}\cdot\text{m}^{-1}$, $\text{A}\cdot\text{m}^{-1}$ | Composantes parallèles aux plans des interfaces (strictement continues à $z=z_j$). |
| $E_j^+, E_j^-$ | Ondes montante / descendante | $\text{V}\cdot\text{m}^{-1}$ | Amplitudes des ondes se propageant vers le haut ($+$, réflexion) et vers le bas ($-$). |
| $\eta_j$ | Admittance optique inclinée | sans dim. (norm.) | Rapport des champs tangentiels $H_\parallel / E_\parallel$ dans la couche $j$. |
| $\eta_{j,s}$ | Admittance en polarisation TE (s) | sans dim. | $\eta_{j,s} = \hat{n}_j \cos\theta_j$ ($\vec{E}$ perpendiculaire au plan d'incidence). |
| $\eta_{j,p}$ | Admittance en polarisation TM (p) | sans dim. | $\eta_{j,p} = \hat{n}_j / \cos\theta_j$ ($\vec{H}$ perpendiculaire au plan d'incidence). |
| $M_j$ | Matrice de transfert de couche | matrice $2\times 2$ | Relie $[E(z_j), H(z_j)]^T = M_j [E(z_{j-1}), H(z_{j-1})]^T$ ($\det M_j = 1$). |
| $M$ | Matrice caractéristique globale | matrice $2\times 2$ | Produit ordonné de bas en haut : $M = M_N M_{N-1} \cdots M_1$. |
| $B, C$ | Vecteur de champ équivalent | sans dim. / admittance | $\begin{pmatrix} B \\ C \end{pmatrix} = M \begin{pmatrix} 1 \\ \eta_{sub} \end{pmatrix}$, champ total normalisé au sommet ($z=z_N$). |
| Symbole | Nom | Unité | Définition & Signification physique |
|---|---|---|---|
| $r, t$ | Coefficients de Fresnel complexes | sans dim. (complexes) | Amplitudes : $r = \frac{\eta_0 B - C}{\eta_0 B + C}$ (réflexion) et $t = \frac{2\eta_0}{\eta_0 B + C}$ (transmission). |
| $R$ | Réflectance énergétique | sans dim. ($[0, 1]$) | Fraction de puissance réfléchie : $R = |r|^2$. |
| $T$ | Transmittance énergétique | sans dim. ($[0, 1]$) | Fraction de puissance transmise : $T = \frac{\mathrm{Re}(\eta_{sub})}{\mathrm{Re}(\eta_0)} |t|^2$. |
| $A$ | Absorbance énergétique | sans dim. ($[0, 1]$) | Fraction de puissance absorbée dans les couches : $A = 1 - R - T$. |
| $\vec{S}, S_z$ | Vecteur de Poynting & Flux normal | $\text{W}\cdot\text{m}^{-2}$ | Densité de puissance traversant l'interface : $S_z = \frac{1}{2}\mathrm{Re}(\eta) |E_\parallel|^2$. |
| $R_{total}, T_{total}$ | Coefficients avec face arrière | sans dim. | Coefficients photométriques incohérents tenant compte de la seconde face du verre. |
Convention de repère et de numérotation : l'axe $z$ est orienté vers le haut ($\uparrow$), dans le sens de croissance physique du dépôt. Le plan $z=0$ correspond à la surface du substrat, la couche 1 est collée au substrat ($0 \le z \le d_1$), et la couche $N$ est la dernière couche déposée, en contact avec l'air à $z = z_N = \sum_{j=1}^N d_j$.
En électromagnétisme harmonique, le choix de la dépendance temporelle fixe de manière univoque le signe de la partie imaginaire de l'indice de réfraction. Démonstration :
1. Sous la convention de Macleod / Ingénierie, les champs varient en $e^{+i\omega t}$. Une onde plane se propageant dans le sens direct ($+z$) s'écrit :
$$\vec{E}(z,t) = \vec{E}_0 \, e^{i(\omega t - k z)} \quad \text{avec} \quad k = k_0 \hat{n} = \frac{\omega}{c} \hat{n}$$2. Écrivons l'indice complexe avec sa partie réelle $n$ et sa partie imaginaire $\mathrm{Im}(\hat{n})$ :
$$\vec{E}(z,t) = \vec{E}_0 \, e^{i\left(\omega t - k_0 (n + i\,\mathrm{Im}(\hat{n})) z\right)} = \vec{E}_0 \, \underbrace{e^{k_0 \mathrm{Im}(\hat{n}) z}}_{\text{Atténuation spatiale}} \, \underbrace{e^{i(\omega t - k_0 n z)}}_{\text{Phase oscillante}}$$3. Pour un milieu passif absorbant, l'amplitude doit décroître exponentiellement selon $e^{-k_0 \kappa z}$ (loi de Beer-Lambert, avec le coefficient d'extinction $\kappa \ge 0$).
Par identification directe du facteur d'amplitude :
$$\mathrm{Im}(\hat{n}) = -\kappa \le 0 \implies \mathbf{\hat{n} = n - i\kappa \quad (\kappa \ge 0)}$$Avertissement : Si vous utilisiez par erreur un signe plus ($\hat{n} = n + i\kappa$) avec $e^{+i\omega t}$, le facteur spatial deviendrait $e^{+k_0 \kappa z}$, simulant une amplification exponentielle non physique (création spontanée d'énergie infinie dans le matériau passif).
Dans cette seconde convention, le temps est choisi en $e^{-i\omega t}$. L'onde se propageant vers $+z$ s'écrit alors $\vec{E}(z,t) = \vec{E}_0 e^{-i(\omega t - kz)} = \vec{E}_0 e^{i(kz - \omega t)}$. Pour assurer l'atténuation en $e^{-k_0 \kappa z}$, l'indice complexe s'écrit alors avec un signe plus :
$$\mathbf{\hat{n} = n + i\kappa \quad (\text{Convention Physique Théorique } e^{-i\omega t})}$$| Critère | Convention Couches Minces (Macleod) | Convention Physique Théorique (Born & Wolf) |
|---|---|---|
| Dépendance temporelle | $e^{+i\omega t}$ (ou $\partial_t \to +i\omega$) | $e^{-i\omega t}$ (ou $\partial_t \to -i\omega$) |
| Onde progressive ($+z$) | $\exp[i(\omega t - kz)]$ | $\exp[-i(\omega t - kz)] = \exp[i(kz - \omega t)]$ |
| Indice complexe $\hat{n}$ | $\mathbf{\hat{n} = n - i\kappa}$ | $\mathbf{\hat{n} = n + i\kappa}$ |
| Partie imaginaire $\mathrm{Im}(\hat{n})$ | Strictement négative ($-\kappa \le 0$) | Strictement positive ($+\kappa \ge 0$) |
| Usage dominant | Logiciels de couches minces (OptiLayer, TFCalc, Code Python de ce cours) | Électrodynamique classique, mécanique quantique, optique non linéaire |
Conseil pour l'ingénieur : Les bases de données (ex: refractiveindex.info) fournissent toujours $k$ (ou $\kappa$) sous forme d'un nombre réel positif. Dans notre formalisme de Macleod, vous devez toujours injecter n_complex = n - 1j * k.
Cette section établit rigoureusement, à partir des premiers principes de l'électromagnétisme, comment les équations de Maxwell se réduisent à l'équation de Helmholtz, puis comment les conditions aux limites et la condition d'onde sortante permettent de formuler la matrice de transfert $2 \times 2$ d'une couche mince.
On adopte la convention temporelle de Macleod où tous les champs oscillent à la pulsation $\omega$ selon $e^{+i\omega t}$. Pour un champ électrique réel $\vec{\mathcal{E}}_{phys}(\vec{r}, t) = \mathrm{Re}[\vec{E}(\vec{r}) \, e^{i\omega t}]$, la dérivation temporelle devient un simple produit algébrique : $\frac{\partial}{\partial t} \longrightarrow +i\omega$.
Dans un milieu diélectrique ou conducteur linéaire, homogène, isotrope (LHI) et non magnétique ($\mu_r = 1$), sans charges libres macroscopiques ($\rho = 0$), les équations de Maxwell s'écrivent sous forme complexe :
La permittivité diélectrique complexe relative $\hat{\varepsilon}_r$ unifie la constante diélectrique $\varepsilon_r$ et la conductivité ohmique $\sigma$. Elle est directement reliée à l'indice de réfraction complexe $\hat{n} = n - i\kappa$ :
En appliquant l'opérateur rotationnel à l'équation de Maxwell-Faraday et en utilisant l'identité vectorielle $\nabla \times (\nabla \times \vec{E}) = \nabla(\nabla \cdot \vec{E}) - \Delta \vec{E}$ avec $\nabla \cdot \vec{E} = 0$ (milieu homogène), on obtient :
$$\nabla(\underbrace{\nabla \cdot \vec{E}}_{=0}) - \Delta \vec{E} = -i\omega \mu_0 (\nabla \times \vec{H}) = -i\omega \mu_0 (i\omega \varepsilon_0 \hat{n}^2 \vec{E}) = \omega^2 \mu_0 \varepsilon_0 \hat{n}^2 \vec{E}$$Comme la vitesse de la lumière dans le vide est $c = 1/\sqrt{\varepsilon_0 \mu_0}$ et le nombre d'onde dans le vide est $k_0 = \omega/c = 2\pi/\lambda$, on aboutit à l'équation vectorielle de Helmholtz :
Considérons une onde plane incidente se propageant dans le plan d'incidence $(x,z)$, où $z$ est l'axe perpendiculaire aux couches et $x$ l'axe parallèle aux interfaces. Par invariance par translation selon l'axe transverse $y$, on a $\partial/\partial y = 0$. La dépendance spatiale selon $x$ est commune à toutes les couches et fixée par le milieu incident :
L'équation de Helmholtz se réduit alors à une équation différentielle scalaire unidimensionnelle selon la coordonnée $z$ pour chaque composante :
À chaque interface $z = z_k$ séparant deux milieux d'indices $\hat{n}_1$ et $\hat{n}_2$, les équations de Maxwell imposent des relations de continuité strictes. En intégrant Maxwell-Faraday et Maxwell-Ampère sur un contour rectangulaire infinitésimal chevauchant l'interface (largeur $\Delta l$, hauteur $\Delta h \to 0$), le flux magnétique et le courant traversant la boucle tendent vers zéro :
En l'absence de charges et de courants superficiels libres, les composantes tangentielles du champ électrique et du champ magnétique sont strictement continues :
Dans chaque couche homogène $j$ (délimitée entre sa base $z_{j-1}$ et son sommet $z_j = z_{j-1} + d_j$), la solution générale de l'équation de Helmholtz 1D est la superposition exacte d'une onde se propageant vers le bas (vers le substrat, dans le sens des $z$ décroissants, notée $E_j^-$) et d'une onde réfléchie se propageant vers le haut (vers l'air, dans le sens des $z$ croissants, notée $E_j^+$) :
Pour relier le champ magnétique tangentiel $H_\parallel$ au champ électrique tangentiel $E_\parallel$, on utilise l'équation de Maxwell-Faraday $\nabla \times \vec{E} = -i\omega\mu_0 \vec{H}$ :
Considérons une couche $j$ d'épaisseur $d$ comprise entre son interface supérieure d'entrée $a$ ($z = z_j$) et son interface inférieure de sortie $b$ ($z = z_{j-1} = z_j - d$) :
1. À l'interface supérieure d'entrée ($z = z_j$), en rapportant cette fois les deux amplitudes $E^\pm$ à cette interface (au § 3.4, $E_j^+$ était rapportée à la base de la couche : simple choix d'origine des phases, sans effet sur la matrice) :
$$E_a = E^- + E^+ \qquad \text{et} \qquad H_a = \eta (E^- - E^+)$$Ce qui permet d'exprimer les amplitudes d'ondes en fonction des champs totaux d'entrée :
$$E^- = \frac{1}{2}\left(E_a + \frac{H_a}{\eta}\right) \qquad \text{et} \qquad E^+ = \frac{1}{2}\left(E_a - \frac{H_a}{\eta}\right)$$2. À l'interface inférieure de sortie ($z = z_{j-1} = z_j - d$), en posant le déphasage $\delta = k_z d$ :
$$\begin{aligned} E_b &= E^- e^{-i\delta} + E^+ e^{+i\delta} = \frac{1}{2}\left(E_a + \frac{H_a}{\eta}\right)e^{-i\delta} + \frac{1}{2}\left(E_a - \frac{H_a}{\eta}\right)e^{+i\delta} = E_a \cos\delta - \frac{i}{\eta} H_a \sin\delta \\[8pt] H_b &= \eta\left(E^- e^{-i\delta} - E^+ e^{+i\delta}\right) = -i\eta E_a \sin\delta + H_a \cos\delta \end{aligned}$$3. Inversion matricielle pour exprimer les champs d'entrée $(E_a, H_a)$ en fonction des champs de sortie $(E_b, H_b)$ :
Pour une couche d'indice complexe $\hat{n}_j$ et d'épaisseur $d_j$, la matrice $M_j$ s'écrit :
Où $\delta_j$ est la phase optique accumulée : $\delta_j = \frac{2\pi}{\lambda} (\hat{n}_j) d_j \cos \theta_j$.
Contexte : La loi de Snell-Descartes donne $S_0 = n_0 \sin \theta_0$. Pour obtenir l'angle de propagation dans la couche $j$, on utilise l'identité trigonométrique $\cos \theta_j = \frac{\sqrt{\hat{n}_j^2 - S_0^2}}{\hat{n}_j}$. Le piège réside dans le calcul informatique de la racine carrée $\sqrt{z}$.
La fonction $f(z) = \sqrt{z}$ est multivaluée dans $\mathbb{C}$. Dans Python/NumPy, np.sqrt(z) renvoie par défaut la racine avec une partie réelle $\ge 0$ et impose une coupure (branch cut) sur l'axe réel négatif.
Le champ électrique dans la couche $j$ évolue en $E_j(z,t) \propto \exp[-i k_{z,j} z]$ avec $k_{z,j} = \frac{2\pi}{\lambda} \hat{n}_j \cos\theta_j$. Pour que l'amplitude s'atténue en pénétrant dans la matière (absorption ou onde évanescente), il faut impérativement satisfaire :
Contrairement à une croyance répandue, les métaux ne posent pas de problème avec la convention de Macleod : $\hat{n}_{Ag} = 0.12 - 3.45i$ donne, sous $45^\circ$ d'incidence depuis l'air ($S_0^2 = 0.5$), $z = \hat{n}^2 - S_0^2 \approx -12.4 - 0.8i$ (demi-plan inférieur). np.sqrt(z) renvoie $0.12 - 3.52i$, ce qui satisfait bien $\text{Im} \le 0$.
Le véritable problème survient lors d'une Réflexion Totale Interne dans un diélectrique (ex: lumière passant du verre $n=1.5$ à l'air $n=1.0$ à $45^\circ$). On a alors $S_0 = 1.06$ et $z = n^2 - S_0^2 = -0.125$ (pur réel négatif). Dans ce cas précis, np.sqrt(-0.125 + 0j) renvoie +0.353j. La partie imaginaire est positive ! L'onde simulée va croître exponentiellement au lieu de s'évanouir.
Il est donc crucial de forcer manuellement le bon signe dans le code pour les ondes évanescentes (voir Section 10) :
if n_cos_th.imag > 0:
n_cos_th = -n_cos_th # Force l'atténuation physique
La matrice globale $M$ du système est le produit matriciel des matrices de chaque couche. On multiplie en partant de la base sur le substrat ($z=0$, couche 1) vers le sommet en contact avec l'air ($z=z_N$, couche $N$) :
L'admittance optique $\eta_j$ caractérise le rapport entre les champs tangentiels ($H_\parallel / E_\parallel$). En incidence oblique, elle dépend de la polarisation de la lumière :
| Polarisation | Description physique | Admittance $\eta_j$ |
|---|---|---|
| TE (s) | Champ électrique transverse (parallèle à l'interface) | $$\eta_{j,s} = \hat{n}_j \cos \theta_j$$ |
| TM (p) | Champ magnétique transverse (parallèle à l'interface) | $$\eta_{j,p} = \frac{\hat{n}_j}{\cos \theta_j}$$ |
Pour l'empilement complet, on définit le vecteur caractéristique $\begin{pmatrix} B \\ C \end{pmatrix}$ en multipliant la matrice globale $M$ par le vecteur des conditions aux limites du substrat :
Les coefficients d'amplitude en réflexion ($r$) et en transmission ($t$) s'écrivent :
On en déduit les grandeurs mesurables expérimentalement, à savoir la réflectance $R$ et la transmittance $T$ (avec conservation de l'énergie $R+T+A=1$, où $A$ est l'absorption) :
Une erreur classique chez les étudiants est d'écrire $T = |t|^2$. Or, la transmittance est le ratio des puissances surfaciques (liées au flux du vecteur de Poynting $\vec{S}$), et non pas le simple ratio des carrés des champs électriques.
La puissance transportée par une onde est $|\vec{S}| = \frac{1}{2} \mathrm{Re}(\hat{n}) |E|^2$. Mais la conservation de l'énergie à l'interface dépend de l'énergie qui traverse effectivement cette surface, c'est-à-dire la composante normale du flux : $S_z$.
En incidence oblique (angle $\theta$), un faisceau de largeur spatiale $W$ "s'étale" sur l'interface pour occuper une empreinte de taille $W/\cos\theta$. La puissance par unité de surface de l'interface diminue donc géométriquement d'un facteur $\cos\theta$.
Mathématiquement, projeter ce flux sur la normale donne :
Remarquez le terme $\hat{n} \cos\theta$ : il correspond *exactement* à la définition de l'admittance optique $\eta_s$ en polarisation TE (s). L'admittance $\eta$ n'est donc pas qu'une commodité mathématique matricielle, elle intègre intrinsèquement l'indice matériel et la projection géométrique du faisceau (cette démonstration est également valide pour TM avec $\eta_p$).
La réflectance reste simple $R = |r|^2$ car l'onde incidente et réfléchie évoluent dans le même milieu (l'admittance s'annule dans le ratio). Mais l'onde transmise entre dans un nouveau substrat, d'où le facteur correctif de transmission faisant intervenir la partie réelle des admittances.
Les équations précédentes supposent un substrat de sortie semi-infini. En réalité, une lame de verre possède une face arrière. En raison de l'épaisseur importante du substrat (millimétrique, $\gg \lambda$), la cohérence optique spatiale est perdue. On ne somme donc plus les amplitudes complexes (interférences), mais les intensités des rebonds multiples incohérents dans le verre.
À retenir : en optique linéaire passive, la transmittance de puissance est réciproque. Autrement dit, si elle est bien définie et bien normalisée, on a $T'_{front} = T_{front}$. Ce qui peut changer avec le sens d'illumination, ce sont surtout $R$ et $A$.
Important : dans le cas d'un substrat fini, $T_{total}$ n'est pas la même chose que $T_{front}$. Il faut appliquer la formule complète ci-dessus ; sinon, on commet une erreur de physique.
Exemple rapide : un verre nu réfléchit environ 4% par face ($R_{front} = R'_{front} = R_{back} \approx 0.04$). La réflectance totale d'une vitre simple vaut alors environ $7.7\%$. La transmittance totale doit, elle aussi, être recalculée avec la formule de substrat fini.
Calculer le profil d'intensité à l'intérieur de l'empilement est fondamental, notamment pour évaluer les seuils de dommage laser (LIDT) ou optimiser l'absorption dans des cellules solaires.
Méthode : On connaît le champ transmis dans le substrat à $z=0$ (qui vaut l'amplitude transmise $t$). On peut remonter mathématiquement le long de l'axe $z$ (dans le sens de croissance des couches, de $z=0$ jusqu'au sommet $z=z_N$) couche après couche. Dans la couche $j$ ($z_{j-1} \le z \le z_j$), on part des champs à sa base, obtenus en appliquant successivement $M_1, \dots, M_{j-1}$ au vecteur de départ $t\,(1, \eta_{sub})^T$ :
Où $\delta_j(z) = \frac{2\pi}{\lambda} \hat{n}_j (z - z_{j-1}) \cos \theta_j$ est le déphasage accumulé depuis la base de la couche $j$. Pour une couche unique ($j = 1$, $z_0 = 0$), le départ est directement le champ au substrat, $E(0) = t$.
Profil d'intensité $|E(z)|^2$ calculé par TMM pour une couche de TiO₂ ($n=2.35$) sur substrat ($n_{sub}=1.5$), éclairée depuis l'air à droite ($z \ge d$).
Note physique : L'axe $z$ débute à la surface du substrat ($z=0$) et croît vers la surface en contact avec l'air ($z=d$).
L'objectif est d'annuler les $\sim 4\%$ de réflexion parasite du verre. On dépose une épaisseur telle que le déphasage aller-retour soit de $\pi$ (interférence totalement destructive). L'épaisseur optique requise est $nd = \lambda / 4$.
La réflexion s'annule complètement si l'indice de la couche vérifie $n_{couche} = \sqrt{n_{air} \cdot n_{verre}}$. Pour un verre standard, on voudrait $n \approx 1.22$. Le Fluorure de Magnésium (MgF₂, $n=1.38$) est le matériau approchant le plus couramment utilisé en optique classique pour s'approcher de cet idéal.
Une épaisseur calculée à six décimales n'est pas une prescription industrielle. La fabrication introduit une résolution finie, des erreurs aléatoires couche par couche et des erreurs corrélées, par exemple un biais de calibration du quartz. La décision doit donc suivre la chaîne complète ci-dessous.
Fil rouge expérimental — prescription Fresnel imposée.
BK7 / H L 2H L H L H L 2H L H L H L 2H L H L / Air
L'empilement comporte exactement 18 couches, numérotées du substrat BK7 vers l'air. En pré-fabrication, BFGS ne peut modifier que les couches 16, 17 et 18 ; les quinze premières définissent l'architecture qui sera déposée. La performance est évaluée sur la fenêtre utile, et non sur tout le spectre :
$$Q_r=\frac{2\,\overline T_{535-565}}{\overline T_{460-500}+\overline T_{620-680}},\qquad \overline T_{pass}=\overline T_{535-565}.$$Ces moyennes doivent d'abord être mesurées séparément sur T puis combinées par l'étudiant. L'optimisation n'autorise pas à changer le nombre de couches ni à « améliorer » le résultat en libérant les quinze premières. En revanche, la qualification perturbe les 18 couches réellement déposées : une couche figée en conception n'est pas une couche sans erreur en fabrication.
Fabricabilité nominale. On vérifie au minimum le nombre de couches et de matériaux, l'ordre de dépôt, $d_{min}$, $d_{max}$, l'épaisseur totale et la compatibilité de chaque valeur avec la résolution du procédé. Une couche sous le seuil de continuité retenu rend la prescription non fabricable, même si son spectre nominal est excellent.
Modèle pédagogique unique. Chaque couche déposée reçoit une erreur gaussienne indépendante d'écart-type $\sigma=\Delta d/2$. La graine pseudo-aléatoire est figée afin de rendre les études reproductibles et les comparaisons A/B appariées. Le verrou de couche appartient uniquement à l'optimisation BFGS : une couche figée pendant la conception reste physiquement déposée et est donc perturbée pendant la qualification.
Rendement et incertitude. Si $x$ réalisations parmi $N$ satisfont à la fois la fabricabilité et le cahier des charges optique, le rendement estimé est $\hat p=x/N$. L'intervalle de Wilson à 95 % est :
Il faut rapporter le rendement avec cet intervalle. Une valeur affichée de 100 % sur un nombre fini de tirages ne signifie jamais « zéro risque ».
| Indicateur | Question d'ingénierie | Usage correct |
|---|---|---|
| Moyenne ± écart-type | Où se situe la population et quelle est sa dispersion ? | Description, pas décision unique |
| P05 | Quelle performance basse reste dépassée par 95 % des réalisations ? | Grandeur à maximiser : $Q_r$, $T_{pass}$ |
| P95 | Quel coût élevé n'est dépassé que par 5 % des réalisations ? | Grandeur à minimiser : $\overline R$, RMSE |
| IC95 % de Wilson | Quelle est l'incertitude d'échantillonnage sur le rendement ? | Comparer la borne basse à l'exigence |
Ce cas de test complexe permet de valider le code Python, car il inclut des angles obliques, de la polarisation et de l'absorption. Il sert surtout à vérifier deux choses :
| Angle et Polarisation | Face avant seule (semi-infini) | Lame avec face arrière nue | |||
|---|---|---|---|---|---|
| Réflectance $R$ | Transmittance $T$ | Absorption $A$ | $R_{total}$ | $T_{total}$ | |
| 0° (Normale) | 0.357319 | 0.556823 | 0.085858 | 0.370750 | 0.542352 |
| 45° (Polarisation s / TE) | 0.586690 | 0.324859 | 0.088451 | 0.597575 | 0.312870 |
| 45° (Polarisation p / TM) | 0.482173 | 0.446639 | 0.071187 | 0.484049 | 0.444613 |
Le code ci-dessous résume mathématiquement la théorie exposée. Il prend en compte l'absorption, l'angle d'incidence, les polarisations et corrige le problème de la racine complexe pour les ondes évanescentes (voir § 4.1).
import numpy as np
def compute_tmm(n_inc, n_exit, n_layers, d_layers, wl, theta0=0.0, pol='s'):
"""
Calcule les propriétés optiques d'un empilement de couches minces (TMM).
Arguments :
n_inc, n_exit : Indices complexes du milieu incident (air) et du substrat.
n_layers : Liste des indices complexes des couches (n - i*k), de la
couche 1 (contre le substrat) à la couche N (contre l'air).
d_layers : Liste des épaisseurs physiques des couches (en nm), même ordre.
wl : Longueur d'onde de travail (en nm).
theta0 : Angle d'incidence dans le milieu incident (en radians).
pol : Polarisation ('s' pour TE, 'p' pour TM).
Retourne :
R (Réflectance), T (Transmittance), A (Absorption)
"""
# =====================================================================
# Étape 1 : Protection de la Convention de Macleod (Assure n - ik)
# =====================================================================
# En optique des couches minces, l'onde s'écrit formellement exp(i(wt - kz)).
# Pour que le milieu absorbe l'énergie (et ne l'amplifie pas), la partie
# imaginaire de l'indice complexe doit être strictement négative.
def enforce_macleod(n):
return n if n.imag <= 0 else n.real - 1j * n.imag
n_inc = enforce_macleod(n_inc)
n_exit = enforce_macleod(n_exit)
n_layers = [enforce_macleod(n) for n in n_layers]
# Nombre d'onde dans le vide
k0 = 2 * np.pi / wl
# =====================================================================
# Étape 2 : Loi de Snell-Descartes et Angles Complexes (Correction TIR)
# =====================================================================
# L'invariant de Snell-Descartes (n * sin(theta)) est conservé partout.
S0 = n_inc * np.sin(theta0)
def safe_cos_th(n_val):
# On utilise l'identité trigonométrique classique :
# cos(theta) = sqrt(n^2 - (n*sin(theta))^2) / n
n_cos_th = np.sqrt(n_val**2 - S0**2 + 0j)
# ATTENTION AU PIÈGE NUMÉRIQUE (Coupure complexe / Branch cut) :
# En cas de Réflexion Totale Interne (TIR) ou d'onde évanescente,
# numpy peut renvoyer une partie imaginaire positive, ce qui simule
# un gain non-physique d'énergie. On force la décroissance physique :
if n_cos_th.imag > 0:
n_cos_th = -n_cos_th
return n_cos_th / n_val
# Calcul des cosinus (complexes si TIR/absorption) pour chaque milieu
cos_inc = np.cos(theta0)
cos_exit = safe_cos_th(n_exit)
cos_layers = [safe_cos_th(n) for n in n_layers]
# =====================================================================
# Étape 3 : Calcul des Admittances optiques (eta)
# =====================================================================
# L'admittance relie le champ magnétique au champ électrique (H = eta * E)
def get_eta(n_val, cos_th, pol):
if pol.lower() == 's':
# Polarisation TE (Champ E transverse) : projection par multiplication
return n_val * cos_th
else:
# Polarisation TM (Champ H transverse) : projection par division
return n_val / cos_th
eta_inc = get_eta(n_inc, cos_inc, pol)
eta_exit = get_eta(n_exit, cos_exit, pol)
eta_layers = [get_eta(n_layers[i], cos_layers[i], pol) for i in range(len(n_layers))]
# =====================================================================
# Étape 4 : Multiplication Matricielle (Du substrat vers l'air)
# =====================================================================
# On initialise la matrice système globale à la matrice Identité
M_sys = np.eye(2, dtype=complex)
for i in range(len(n_layers)):
# Calcul du déphasage optique local (delta) accumulé dans la couche i
delta = k0 * n_layers[i] * d_layers[i] * cos_layers[i]
c, s = np.cos(delta), 1j * np.sin(delta)
eta = eta_layers[i]
# Construction de la matrice caractéristique 2x2 de la couche locale i
M_i = np.array([
[c, s / eta],
[s * eta, c]
], dtype=complex)
# Accumulation : M_sys = M_i * M_sys
# L'ordre de multiplication est crucial : on part du substrat (sortie)
# vers le milieu incident (entrée), donc de droite à gauche.
M_sys = np.dot(M_i, M_sys)
# =====================================================================
# Étape 5 : Extraction des coefficients d'amplitude de Fresnel
# =====================================================================
# On applique la matrice globale aux conditions aux limites du substrat
# Équation matricielle : [B, C]^T = M_sys * [1, eta_exit]^T
B = M_sys[0,0]*1 + M_sys[0,1]*eta_exit
C = M_sys[1,0]*1 + M_sys[1,1]*eta_exit
# Calcul des coefficients complexes de réflexion (r) et transmission (t)
r = (eta_inc * B - C) / (eta_inc * B + C)
t = (2.0 * eta_inc) / (eta_inc * B + C)
# =====================================================================
# Étape 6 : Bilan des puissances (Conservation de l'énergie)
# =====================================================================
# La réflectance se mesure dans le même milieu, donc un simple module carré
R = abs(r)**2
# Correction du vecteur de Poynting (Flux d'énergie) :
# La transmittance nécessite de comparer la partie réelle des admittances
# des milieux extrêmes car l'onde change de milieu de propagation.
T_factor = (eta_exit.real) / (eta_inc.real) if eta_inc.real > 1e-12 else 0.0
T = T_factor * abs(t)**2
# L'énergie manquante est nécessairement absorbée par l'empilement
A = 1.0 - R - T
return R, T, A
# --- Exemple d'utilisation simple (Verre nu) ---
# Pour un verre d'indice 1.5 dans l'air (1.0) à 550 nm en incidence normale :
# R, T, A = compute_tmm(1.0, 1.5, [], [], 550)
# print(f"Réflectance du verre nu : {R*100:.2f}%") # Affichera ~4.00%