LP31 : Présentation de l’optique géométrique à l’aide du principe de Fermat
Biblio
- BFR d’optique (chap.6) : il y a presque tout, c’est la folie
- Champeau
- Portelli physique par la pratique pour le mirage
Slides utiles
- PDF : Lien du PDF
- pptx : LP_31.pptx
On peut faire :
I Principe de Fermat
1.1 Énoncés du principe de Fermat
- 1.1.1 Notion de chemin optique
- 1.1.2 Premier énoncé du principe de Fermat (1657)
- 1.1.3 Second énoncé du principe de Fermat
1.2 Conséquences directes du principe de Fermat
- 1.2.1 Retour inverse de la lumière
- 1.2.2 Propagation dans un milieu homogène
2 Interfaces
- 2.1 Lois de Snell-Descartes
- 2.2 Le miroir parabolique
3 Milieux inhomogènes
- 3.1 Mirage et cuve à gradient d’indice
- 3.2 Équation des rayons
On peut faire la manip du mirage avec une cuve à gradient d’indice avec du sucre, mais c’est délicat.
Code miroir parabolique
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.widgets import Slider
#Définition des points symétriques, ainsi que de K tel que la surface du miroir soit y=Kx^2
A=[-1.5,6]
B=[1.5,6]
K=1
#fonction qui pour une liste d'abscisse x et une abscisse de réflexion X renvoit [Xx,Y], liste des abscisses et ordonnée du segment entre le point A et le point de réflexion sur le miroir
def f(x,X):
r=((A[1]-K*X**2)/(A[0]-X)*(x-X)+K*X**2)
x2=[0 for i in range(len(x))]
for k in range(len(x)):
if r[k]<K*X**2:
r[k]=K*X**2
x2[k]=X
elif r[k]>A[1]:
r[k]=A[1]
x2[k]=A[0]
else:
x2[k]=x[k]
return [x2,r]
#fonction qui pour une liste d'abscisse x et une abscisse de réflexion X renvoit [Xx,Y], liste des abscisses et ordonnée du segment entre le point de réflexion sur le miroir et le point B
def g(x,X):
r=((B[1]-K*X**2)/(B[0]-X)*(x-X)+K*X**2)
x2=[0 for i in range(len(x))]
for k in range(len(x)):
if r[k]<K*X**2:
r[k]=K*X**2
x2[k]=X
elif r[k]>B[1]:
r[k]=B[1]
x2[k]=B[0]
else:
x2[k]=x[k]
return(x2,r)
#fonction qui pour une liste d'abscisse x et une abscisse de réflexion X renvoie une liste d'ordonnée correspondant à la normale au miroir au point de réflexion
def norm(x,X):
return (K*X**2-(x-X)/(2*K*X))
#choix de paramètres pour les figures
mpl.rcParams['font.size'] = 18
mpl.rcParams['axes.linewidth'] = 2
mpl.rcParams['axes.spines.top'] = False
mpl.rcParams['axes.spines.right'] = False
mpl.rcParams['xtick.major.size'] = 10
mpl.rcParams['xtick.major.width'] = 2
mpl.rcParams['ytick.major.size'] = 10
mpl.rcParams['ytick.major.width'] = 2
fig = plt.figure(figsize=(7, 5))
ax = fig.add_subplot(111)
fig.subplots_adjust(bottom=0.2, top=0.75)
ax_X = fig.add_axes([0.3, 0.85, 0.4, 0.05])
ax_X.spines['top'].set_visible(True)
ax_X.spines['right'].set_visible(True)
#paramètre variable, ici X, l'abscisse du point de réflexion
s_X = Slider(ax=ax_X, label='abscisse ', valmin=-3, valmax=3, facecolor='orange')
x = np.linspace(-3, 3, 200) #liste d'abscisse
X_0 = -2 #abscisse de réflexion inititale
X1,Y1,X2,Y2= f(x, X_0)[0] ,f(x, X_0)[1], g(x, X_0)[0], g(x, X_0)[1] #listes initiales pour les rayons entre A, réflexion, et B
f_d, = ax.plot(X1, Y1,'red', linewidth=2.5) #tracé du rayon A-réflexion
f_d2, = ax.plot(X2, Y2,'red', linewidth=2.5) #tracé du rayon réflexion-B
Y=K*x*x #liste des ordonnées du miroir
f_d3, =ax.plot(x,Y,'midnightblue') #tracé du miroir
f_d4, =ax.plot(A[0],A[1],'x',markersize=10) #tracé point A
f_d5, =ax.plot(B[0],B[1],'x',markersize=10) #tracé point B
Y8 = norm(x,X_0) #liste ordonnée de la normale
f_d6, =ax.plot(x,Y8,'black') #tracé de la normale
# met les tracés à jour quand on fait varier X, l'abscisse du point de réflexion
def update(val):
X = s_X.val
f_d.set_data(f(x,X)[0], f(x,X)[1])
f_d2.set_data(g(x,X)[0],g(x,X)[1])
f_d6.set_data(x,norm(x,X))
fig.canvas.draw_idle()
s_X.on_changed(update)
#repère orthonormal (nécessaire car sinon le tracé est complètement déformé, la normale ne semble pas du tout normale à la surface, et les interprétations sont compliquées)
ax.set_aspect('equal', 'box')
plt.show()
#tracé du chemin optique en fonction de l'abscisse du point de réflexion
def L(x):
return(((x-A[0])**2+(K*x**2-A[1])**2)**(1/2)+((x-B[0])**2+(K*x**2-B[1])**2)**(1/2))
C=[L(xi) for xi in x]
plt.plot(x,C)
plt.xlabel('abscisse de la réflexion')
plt.ylabel('longueur du chemin')
plt.show()