﻿# -*- coding: utf-8 -*-

import numpy as np
from matplotlib import pyplot as plt
import scipy.optimize as spo
I, U, uI , uU= np.loadtxt("TP5_mesures_resistance.dat", skiprows=1, unpack=True)

plt.scatter(I, U)
plt.errorbar(I, U, xerr = uI, yerr = uU,
  fmt = 'none', capsize = 10, ecolor = 'black', zorder = 1)
plt.xlabel('I(A)')
plt.ylabel('U(V)')
plt.title("à modifier")

# fonction f décrivant la courbe à ajuster aux données
def f(I,p):
    R,b = p
    return R*I+b
# dérivée de la fonction f par rapport à la variable de contrôle I
def DI_f(I,p):
    R,b = p
    return R
def affine (I, R, b ):
    return R * I + b

# fonction d'écart pondérée par les erreurs
def residual(p, U, I):
    return (U-f(I,p))/np.sqrt(uU**2 + (DI_f(I,p)*uI)**2)


p0 = np.array([0,0])

result = spo.leastsq(residual, p0, args=(U, I), full_output=True)

# on obtient :
# les paramètres d'ajustement optimaux
popt = result[0];
# la matrice de variance-covariance estimée des paramètres
pcov = result[1];
# les incertitudes-types sur ces paramètres
upopt = np.sqrt(np.abs(np.diagonal(pcov)))
ymod=[]
for i in range(len(I)) :
    ymod.append(affine(I[i],popt[0],popt[1]))
plt.plot(I,U,marker= '.', linestyle='')
plt.errorbar(I, U, xerr = uI, yerr = uU,
  fmt = 'none', capsize = 5, ecolor = 'black', zorder = 1)
plt.plot(I,ymod)
plt.title('U = '+str(popt[0])+'I +' +str(popt[1]))
plt.xlabel("I(A)")
plt.ylabel("U(V)")
print("l'incertitude-type sur la pente de la droite est u(R) = " + str(upopt[0]) )
print( "l'incertitude-type sur l'ordonnée à l'origine est u(b) = " + str(upopt[1]) )
plt.show()

plt.show()



