Table des matières Python

Indice de réfraction des verres optiques

1. Dispersion des verres

Les verres transparents pour la lumière visible sont caractérisés par leur indice de réfraction. Cet indice dépendant de la longueur d'onde, on le mesure pour les raies de référence de Fraunhofer (raies du spectre solaire). Les plus utilisées sont données dans le tableau suivant ([1]).

Nomλ (nm)
C656.3
D589.3
d587.6
F486.1

La variation de l'indice du verre avec la longueur d'onde est caractérisée par le nombre d'Abbe, appelé aussi constringence du verre :

Pour modéliser la dispersion d'un verre, il suffit (en première approche) de connaitre l'indice pour la raie D et le nombre d'Abbe. Le tableau suivant donne ces valeurs pour quelques verres :

NomnDVD
Crown C1.512560.5
Crown flint CF11.528651.6
Light flint LF11.572542.5
Dense flint DF11.60538
Extra dense flint EDF31.7229.3

Ces données sont suffisantes pour déterminer les conditions d'achromatisme des systèmes optiques mais ne permettent pas de modéliser les spectres secondaires résiduels, qui en général ne sont pas négligeables. Une modélisation plus précise nécessite la connaissance des indices pour différentes raies.

Pour calculer l'indice à une longueur d'onde quelconque du spectre visible, on peut utiliser le modèle de Cauchy :

Les deux constantes s'expriment en fonction de l'indice nD et du nombre d'Abbe :

2. Module python

Le module IndiceVerre.py définit une classe qui permet de calculer l'indice d'un verre en fonction de la longueur d'onde, à l'aide de la formule de dispersion de Cauchy. Le constructeur prend en argument l'indice de la raie D et le nombre d'Abbe.

from numpy import zeros
            
class IndiceVerre:
    def __init__(self,nD,VD):
        self.nD=nD
        self.VD=VD
        lC=656.3
        lD=589.3
        lF=486.1
        self.B = (nD-1)/(VD*(1/(lF*lF)-1/(lC*lC)))
        self.A=nD-self.B/(lD*lD)
        self.n = nD
    def indice(self,Lambda):
        self.n = self.A+self.B/(Lambda*Lambda)
        return self.n
    def indiceArray(self,Lambda):
        s = Lambda.size
        na = zeros(s,dtype=float)
        for k in range(s):
            na[k] = self.indice(Lambda[k])
        return na
    def negatif(self):
        self.A = -self.A
        self.B = -self.B
        self.n = -self.n
            

La classe suivante permet de définir l'indice du vide avec la même interface :

class IndiceVide:
    def __init__(self):
        self.n = 1.0
    def indice(self,Lambda):
        return self.n
    def negatif(self):
        self.n = -1
            

Exemple : tracé de l'indice en fonction de la longueur d'onde.

from pylab import *
from IndiceVerre import *
n1 = IndiceVerre(1.51,60)
n2 = IndiceVerre(1.60,38)
Lambda = arange(400,700,1)
n1a = n1.indiceArray(Lambda)
n2a = n2.indiceArray(Lambda)
figure()
plot(Lambda,n1a,color='r',label='Crown')
plot(Lambda,n2a,color='b',label='Dense flint')
xlabel('lambda (nm)')
ylabel('n')
legend()
grid(True)
            
plotAplotA.pdf

Des données plus précises sur les verres sont obtenues dans le catalogue Shott et Ohara. Les classes suivantes permettent d'accéder aux données de quelques verres commerciaux désignés par leur nom.

class Verre:
    def __init__(self,nd,nF,nC):
        self.n = {}
        self.n['d'] = nd # raie d 587 nm
        self.n['F'] = nF # raie F 486 nm
        self.n['C'] = nC # raie C 656 nm
        self.signe = +1
    def indice(self,raie):
        return self.n[raie]*self.signe
    def negatif(self):
        self.signe = -self.signe
    def clone(self):
        v = Verre(self.n['d'],self.n['F'],self.N['C'])
        v.signe = self.signe
        return v
class Vide(Verre):
    def __init__(self):
        self.n = {}
        self.n['d'] = 1.0 # raie d 587 nm
        self.n['F'] = 1.0 # raie F 486 nm
        self.n['C'] = 1.0 # raie C 656 nm
        self.signe = +1
class CatalogueVerre:
    def __init__(self):
        self.verre = {}
        self.verre['N-BK7'] = Verre(1.51680,1.522374,1.51432)
        self.verre['N-KZFS4'] = Verre(1.61336,1.623005,1.60922)
        self.verre['F5'] = Verre(1.60342,1.614617,1.59875)
        self.verre['N-FK51A'] = Verre(1.48656,1.4906,1.49088)
        self.verre['S-FPL53'] = Verre(1.4388,1.442,1.4373)
            
Références
[1]  E. Hecht,  Optics,  (Addison Wesley, 2002)
Creative Commons LicenseTextes et figures sont mis à disposition sous contrat Creative Commons.