Traitement de mesures

  • L'objectif est de tracer la courbe représentative d'une variable en fonction d'une autre, à la suite de mesures effectuées en TP.
  • Il s'agit de distances Objet-Lentille et Lentille-Image pour une lentille de +5\Delta.
  • Les mesures se trouvent dans un fichier nommé mesures.csv Capture%20d%E2%80%99%C3%A9cran%20de%202020-09-17%2018-30-40.png

Import des librairies utiles

In [1]:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from scipy.optimize import curve_fit

Lecture du csv

  • Le fichier est lu et les valeurs sont rangées dans un objet mesures
  • On précise que les valeurs sont séparées par ";"
  • On précise que le séparateur décimal est "," ce qui le convertira en "."
In [2]:
mesures=pd.read_csv('mesures.csv',sep=';',decimal=',')

Mais la variable possède un type difficile à appréhender

In [3]:
type(mesures)
Out[3]:
pandas.core.frame.DataFrame

Aussi, on la convertit en un tableau

In [4]:
mesures=pd.DataFrame(mesures).to_numpy()
## Affichage
mesures
Out[4]:
array([[-70. ,  28. ],
       [-65. ,  28.9],
       [-60. ,  30. ],
       [-55. ,  31.4],
       [-50. ,  33.3],
       [-45. ,  36. ],
       [-40. ,  40. ],
       [-35. ,  46.5],
       [-30. ,  60. ],
       [-25. , 205. ]])

Passage en mètres

Les valeurs récupérées sont des distances en cm. Il est nécessaire de les convertir en mètre pour vérifier la formule de conjugaison.

In [5]:
mesures_en_mètre=mesures/100
## Affichage
mesures_en_mètre
Out[5]:
array([[-0.7  ,  0.28 ],
       [-0.65 ,  0.289],
       [-0.6  ,  0.3  ],
       [-0.55 ,  0.314],
       [-0.5  ,  0.333],
       [-0.45 ,  0.36 ],
       [-0.4  ,  0.4  ],
       [-0.35 ,  0.465],
       [-0.3  ,  0.6  ],
       [-0.25 ,  2.05 ]])

L'opération de division par 100 se fait sur chacunes des valeurs du tableau. Pas de double boucle à gérer.

Passage en dioptries

In [6]:
inverses=1/mesures_en_mètre
## Affichage
inverses
Out[6]:
array([[-1.42857143,  3.57142857],
       [-1.53846154,  3.46020761],
       [-1.66666667,  3.33333333],
       [-1.81818182,  3.18471338],
       [-2.        ,  3.003003  ],
       [-2.22222222,  2.77777778],
       [-2.5       ,  2.5       ],
       [-2.85714286,  2.15053763],
       [-3.33333333,  1.66666667],
       [-4.        ,  0.48780488]])

Idem. L'opération se fait sur chacune des valeurs du tableau.

Tracé

On récupère chacunes des colonnes de valeurs.

In [7]:
abscisses=[row[0] for row in inverses]
ordonnees=[row[1] for row in inverses]

Puis on trace l'un en fonction de l'autre, avec des croix (+) rouges (r).

In [8]:
plt.plot(abscisses,ordonnees,'r+')
plt.show()

Il faut ajuster les axes.

Ajustement des axes

In [9]:
# Création d'un système d'axes appelé "axes"
axes = plt.gca()

# On choisit les bornes.
axes.set_xlim(-5, 1)
axes.set_ylim(-1, 5)

# Les axes gauche et bas se croisent en (0,0)
axes.spines['left'].set_position('zero')
axes.spines['bottom'].set_position('zero')

# On efface les axes restants.
axes.spines['right'].set_color('none')
axes.spines['top'].set_color('none')

# On trace la courbe dans le nouveau système d'axes.
plt.plot(abscisses,ordonnees,'r+',label='data')
plt.legend()
plt.show()

Régression linéaire

In [10]:
def modele(x, a, b):
    return a*x+b
pop, covop = curve_fit(modele, abscisses, ordonnees)
aop, bop = pop
abscisse_modele=np.linspace(-6, 1, 300)
ordonnee_modele=modele(abscisse_modele,aop,bop)
In [11]:
# Création d'un système d'axes appelé "axes"
axes = plt.gca()

# On choisit les bornes.
axes.set_xlim(-6, 1)
axes.set_ylim(-1, 6)

# Les axes gauche et bas se croisent en (0,0)
axes.spines['left'].set_position('zero')
axes.spines['bottom'].set_position('zero')

# On efface les axes restants.
axes.spines['right'].set_color('none')
axes.spines['top'].set_color('none')

# On trace la courbe dans le nouveau système d'axes.
plt.plot(abscisses,ordonnees,'r+',label='data')

plt.plot(abscisse_modele, ordonnee_modele, label='fit')
plt.legend()
plt.show()
In [ ]: