1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| import matplotlib.pyplot as plt
class Bar:
"""
Cette classe sert à calculer le transfert thermique à etat stationnaire en deux dimensions
selon la méthode du carré de Dichelet, ou carré des moyennes d'une tranche longitudinale d'une barre
"""
def __init__(self,*args):
t_a, t_d, t_f, longueur, hauteur = args
self.t_ambiante = t_a# t en °C
self.t_debut = t_d# t en °C
self.t_fin = t_f# t en °C
self.longueur = longueur# l en mm
self.hauteur = hauteur# h en mm
self.n_eff_bord = 3#nombre de hauteur pour traiter l'effet de bord
self.t_verif = list()
"""
construction du tableau ou de la matrice à état initiale, à l'état initial
nous avons la température ambiante et celle des extrémités, la température
initial de la tranche est défini à 0 ou à la valeur mini des entrées...
A défini selon des critères non sélectionnés
Returns
-------
t_a t_a t_a t_a... t_a
t_d 0 0 0 0 ... 0 t_f
t_d 0 0 0 0 ... 0 t_f
t_a t_a t_a t_a... t_a
"""
borne=[t_a,]*(longueur + 2)
self.bar=[borne[:],] + \
list(([t_a,]*(longueur + 2)) for i in range(2)) +\
list(([t_d,] + [0.,]*longueur + [t_f,]) for i in range(hauteur)) + \
list(([t_a,]*(longueur + 2)) for i in range(2)) +\
[borne[:],]
#for i in range(len(self.bar)):
#print(i,self.bar[i])
def calcul_t(self):
for t in range(int((self.longueur*self.hauteur))*50):
for i in range(len(self.bar[:-1])):
for n in range(len(self.bar[i])):
if i != 0 and n != 0 and n != self.longueur+1 :
self.bar[i][n] = round((self.bar[i][n-1]+self.bar[i][n+1]+self.bar[i-1][n]+self.bar[i+1][n])/4,3)
if n == self.longueur and i == int(self.hauteur/2)+self.n_eff_bord+1 :
#print(self.bar[i][-2:-1])
self.t_verif.append(self.bar[i][-2:-1])
if t>(self.longueur*self.hauteur)/2 and self.t_verif[-2:-1] == self.t_verif[-2:-1]:
#print(t,self.t_verif[-2:-1],self.t_verif[-1:])
break
def show_bar(self):
for i in range(self.n_eff_bord) :
print(i,self.t_ambiante,"|",self.bar[i][1:4]," -- ",self.bar[i][-4:-1],"|",self.t_ambiante)
print(" ","_"*68," ")
for i in range(self.n_eff_bord,len(self.bar)-self.n_eff_bord):
print(i,self.t_debut,"|",self.bar[i][1:4],"----",self.bar[i][-4:-1],"|",self.t_fin)
print(" ","_"*68," ")
for i in range(self.n_eff_bord-1+self.hauteur+1,len(self.bar)) :
print(i,self.t_ambiante,"|",self.bar[i][1:4]," -- ",self.bar[i][-4:-1],"|",self.t_ambiante)
#print(i)
#print(len(self.bar))
def graph_t(self):
fig, ax = plt.subplots()
#ax.plot(self.t_verif[:])
#print(self.t_verif[-1:])
for i in range(self.n_eff_bord,int((len(self.bar[:])+self.n_eff_bord)/2)-1):
ax.plot(self.bar[i],label = str(i-self.n_eff_bord)+' [mm]')
ax.set(xlabel='Longueur [mm]', ylabel='Temperature [°C]',
title="Transfert thermique à l'état stationnaire\ndans une barre de "+str(self.longueur)+" mm et de "
+str(self.hauteur)+" mm d'épaisseure")
ax.grid()
plt.legend(title='Profondeur:',bbox_to_anchor=(1.05, 1), loc='upper left',ncol=3)
plt.show()
c = Bar(13,0,250,29,6)
#c.show_bar()
c.calcul_t()
c.show_bar()
c.graph_t() |