# -*- coding: utf-8 -*-
# Chapitre 12 — Refaire la mesure de Millikan (VERSION CORRIGÉE)
# Des mesures (fréquence, énergie cinétique maximale) sur le sodium :
# la droite Ec = h*nu - phi a pour pente la constante de Planck.

import matplotlib.pyplot as plt
from scipy.stats import linregress

# mesures : fréquence (Hz) et énergie cinétique maximale (eV)
nu = [6.0e14, 7.0e14, 8.0e14, 9.0e14, 10.0e14]
Ec = [0.21, 0.62, 1.04, 1.45, 1.86]

e = 1.60e-19   # charge élémentaire (C)

# --- régression linéaire avec la méthode de la fiche M2 ---
reg = linregress(nu, Ec)
pente = reg.slope       # en eV/Hz
ordonnee = reg.intercept  # en eV

h_exp = pente * e             # conversion eV/Hz -> J.s  # À COMPLÉTER
phi = -ordonnee               # travail d'extraction (eV)  # À COMPLÉTER

print("pente =", pente, "eV/Hz")
print("h_exp =", h_exp, "J.s   (valeur admise : 6,63e-34 J.s)")
print("phi   =", phi, "eV")

# --- trace ---
xs = [0] + nu
ys = []
xs_reduits = []
for x in xs:
    ys.append(pente * x + ordonnee)
    xs_reduits.append(x / 1e14)
nu_reduites = []
for x in nu:
    nu_reduites.append(x / 1e14)
plt.plot(xs_reduits, ys, label="modèle ajusté")
plt.scatter(nu_reduites, Ec, color="orange", zorder=3,
            label="mesures")
plt.axhline(0, color="gray", lw=0.8)
plt.xlabel("fréquence (10^14 Hz)")
plt.ylabel("Ec max (eV)")
plt.legend()
plt.grid(True)
plt.show()
