##importation
import matplotlib.pyplot as plt
import numpy as np
import math as m
import os
from scipy.special import erf

## Récupération des données expérimentales
# on précise le répertoire dans lequel se trouve le fichier de données (chemin et nom du répertoire A COMPLETER) :
os.chdir(r"C:\Users\Virginie\Desktop\MP\_poly MP 202223\_poly MP\TP\tests tp conduction thermique\2025_conductoo et cylindres étuve")
# on convertit le fichier texte de données en un tableau comportant 10 colonnes : 
num,texp,T0,T1,T2,T3,T4,T5,T6,T7=np.loadtxt("conductoo chauffe sans ventilation_virgule point.txt",unpack=True)

## Caracteristiques du problème
# Paramètres de la barre d'aluminium A COMPLETER
S=2e-4 # section en m^2
capath=897 # capacité thermique massique en J/(K.kg)
rho=2.7e3 # masse volumique en kg/m^3
Ti=28 # température initiale de la barre
P0=7.5 # puissance de chauffe en W en x = 0
phi=P0/S # puissance surfacique de chauffe en W/m^2 en x = 0


## Tracer des courbes T(xk,t) pour visualiser l'évolution des températures pendant l'acquisition
plt.plot(texp,T0,texp,T1,texp,T2,texp,T3,texp,T4,texp,T5,texp,T6,texp,T7)
plt.title("évolutions temporelles au niveau des différents capteurs")
plt.legend(["T0","T1", "T2", "T3","T4", "T5", "T6","T7"],loc="best")
plt.xlabel("t (s)")
plt.ylabel("Tk (°C)")
plt.grid(True)
plt.show()


## Analyse de l’évolution temporelle de la température en x = 0
# Construction de la liste des abscisses
abs=[m.sqrt(texpi) for texpi in texp]
# Régression linéaire 
a,b=np.polyfit(abs,T0,1)
# Construction de la liste des températures en x = 0 à partir du résultat de la régression linéaire
T0mod=[a*absi+b for absi in abs]
# Tracés de la courbe expérimentale et de la courbe modèle
delta_T = np.array([0.6]*len(T0))
plt.errorbar(abs,T0,xerr=0 ,yerr=2*delta_T/np.sqrt(3),fmt='b.',label='Mesures')
plt.plot(abs,T0mod,label='régression linéaire')
plt.title("Analyse de l’évolution temporelle de la température en x = 0")
plt.xlabel("t^0.5 (s^0.5)")
plt.ylabel("T(x=0,t) (°C)")
plt.legend()
plt.grid()
plt.show()
# Calcul et affichage de la conductivité thermique de l'aluminium
conduct_exp=4*phi**2/(rho*capath*m.pi*a**2)
print("conductivité thermique déterminée expérimentalement en W/(m.K)=",conduct_exp)

# Simulations Monte Carlo pour obtenir l'incertitude sur la pente de la droite modèle 
N = 1000 # nombre des simulations
liste_pente = []
for i in range(N):
# A COMPLETER 
    l=len(abs)
    tirage_T0=np.random.uniform(T0-delta_T,T0+delta_T,l)
    modele=np.polyfit(abs,tirage_T0,1)
    liste_pente.append(modele[0])     
pente_moy =  np.average(liste_pente) # pour vérification, A COMPLETER
u_pente =  np.std(liste_pente,ddof=1)# A COMPLETER
u_conduct = conduct_exp*2*u_pente/pente_moy # A COMPLETER

print("moyenne sur la pente de la droite T0(t^0.5) en K/s^0.5 =",pente_moy) 
print("incertitude-type sur la pente de la droite T0(t^0.5) en K/s^0.5 =",u_pente) 
print("incertitude-type sur la conductivité thermique en W/(m.K) =",u_conduct) 


## Analyse de l’évolution temporelle de la température en x = 9 cm
# Paramètres 
x5=9e-2 # position du capteur n°6
D =  conduct_exp/(capath*rho)   # coefficient de diffusion en m^2/s
# Construction de la liste des températures en x = 9 cm à partir du modèle théorique (solution analytique)
def modele5(t):
    return(Ti+(phi/conduct_exp)*(2*m.sqrt(D*t/(m.pi))*m.exp(-x5**2/(4*D*t)) -x5*(1-erf(x5/(2*m.sqrt(D*t))))))
T5mod=[modele5(texpi) for texpi in texp]
# Tracés de l'évolution temporelle de la température en x = 9 cm selon l'expérience et le modèle théorique
plt.errorbar(texp,T5,xerr=0 ,yerr=2*delta_T/np.sqrt(3),fmt='b.',label='Mesures')
plt.plot(texp,T5mod,label='modèle')
plt.title("Analyse de l’évolution temporelle de la température en x = 9 cm")
plt.xlabel("t (s)")
plt.ylabel("T(x=9 cm,t) (°C)")
plt.legend()
plt.grid(True)
plt.show()