Partage
  • Partager sur Facebook
  • Partager sur Twitter

Exo de modélisation en Python

Equation de la chaleur 2D

7 janvier 2019 à 20:04:13

Bonjour,

Je suis actuellement inscrit au CNAM afin d’obtenir un diplôme d'ingénieur. Ce semestre, j'ai en UE une matière qui se nomme "Modélisation en machines et moteurs". 

J'aimerais vous demander de l'aide pour mon devoir maison.

Enoncé :
On considère une plaque métallique carrée de côté L, de coefficient de diffusion 𝛼. Ce coefficient de diffusion dépend de la nature du matériau constituant le barreau : 𝛼=𝜆𝜌𝑐
Avec :
𝜆 : conductivité thermique du matériau (𝑊.𝑚−1.𝐾−1)
𝜌 : masse volumique du matériau (𝑘𝑔.𝑚−3)
𝑐 : capacité thermique massique du matériau (𝐽.𝑘𝑔−1.𝐾−1)
Les 2 côtés horizontaux sont maintenus à une température 𝑇1 et les 2 côtés verticaux à une température 𝑇2 (Figure 1).

Hypothèses :
- La plaque est très mince: le problème devient donc un problème 2D.
- Le contact thermique est supposé parfait sur les 4 côtés de la plaque.
- On note 𝐿 la longueur des 4 côtés de la plaque et 𝑇 la fonction de température dépendant du temps 𝑡 (en secondes), de l’abscisse 𝑥 (en mètres) et de l’ordonnée y (en mètres).
- Le barreau est initialement à la température 𝑇0= 293 K (environ 20°C), sauf sur les 4 côtés.
Pour résoudre ce problème, on obtient l’équation de la chaleur 2D suivante:
Données numériques :
𝛼=2.10−5𝑚2.𝑠−1
𝐿=1.5 𝑚
𝑇1=400𝐾
𝑇2=300𝐾
1.Réécrire sur papier l’équation (1) en utilisant les méthodes des différences finies suivantes :
     -Schéma avant d’ordre 1 pour la dérivée temporelle
     -Schéma centré d’ordre 2 pour les dérivées secondes en espace
2. Dessiner le stencil de la méthode numérique utilisée pour ce problème.
3. Discuter de la stabilité de la méthode utilisée.
4. Quel est le type de conditions aux limites utilisées (Dirichlet ou Neuman) et quel est le type de problème à résoudre (problème aux frontières, problème extérieur ou problème de Cauchy) ?
5. Exprimer la valeur de la température au noeud (i,j) au pas de temps n+1.
(les noeuds (i,j) du maillage découpent la longueur x en pas dx, la longueur y en pas dy et le temps t est représenté par des pas dt)
6. Ecrire le script Python qui permet de calculer l’évolution de la température dans la plaque et de l’afficher toutes les 10min sur une période de 2h (pour avoir une bonne précision, on pourra prendre un pas de temps d’une seconde et 100 points de calcul sur la barre).
7. Discuter les résultats.
J'aurais besoin de vous pour la question 6.
Je vais mettre mon code ci-dessous:
#Etapes 1: Importation des modules
import numpy as np
import scipy as sp
import matplotlib as mpl
import matplotlib.pyplot as plt
import os
# Etapes 2: Donner d'entrées (variables)
L=1.5                   # Longueur des 4 cotés de la plaque en m
tf= float(2*3600)       # Temps d'évolution de 2h
alpha=2.10E-5           # Diffusivité thermique en m2/s
T1= 400.                # Température des cotés horizontaux  en °C
T2=300.                 # Temperature des cotés vertiticaux  en °C
T0= 293                 # Température initial sur les 4 cotés en °C
#lamb= 0                 # Conductivité thermique du matériaux en W.m^-1.K^-1
#Rho=0                   # Masse volumique du matériau en kg.^-3
#c= 0                    # Capacité thermique massique du materiau en J.kg^-1.K^-1
Nx= 100               # Nombres de points de calcule sur la barre
Ny= 100              # Nombres de points de calcule sur la barre
dt=1.                 # Fréquence de calcule
Nt= int(tf/dt)        # Nombre de point de calcule dans le temps
dx=float(L/100)       # Pas d'espace
dy=float(L/100)
K=alpha*(dt/(dx*dx*dy*dy))  # Constante K
x=np.linspace(0,L,num=Nx+1)
y=np.linspace(L,0,num=Ny+1)
# Etape 3: Vérification de la condition de stabilité CFL
# K > 0.5 pour être stable
CFL=K
print("CFL = ",CFL)
if CFL<=0.5:
    print("La condition CFL est respectée")
else:
    print("La condition CFL n'est pas respectée")
#Etapes 4: Condition initial
Tx=sp.ones((Nt+1,Nx+1))        # Matrice de température T(x,t)
Tx=293*Tx                       #  Ou 293*np.ones((Nx+1,Nt+1))
for i in range(0,Nx+1):
    Tx[i,1]= 293.
Ty=sp.ones((Ny+1,Nt+1))       # Matrice de température T(y,t)
Ty=293*Ty
for j in range(0,Ny+1):
    Ty[j,1]= 293.
# Etapes 5: Les conditions aux limites 
for n in range(0,Nt+1):
    Tx[n,0]=T2
    Tx[n,Nx]=T2
for n in range(0, Nt+1):
    Ty[0,n]=T1
    Ty[Ny,n]=T1
# Profile de température initial dans le barreau
plt.figure(1)
plt.plot(x,Tx[:,1])
plt.plot(y, Ty[:,1])
plt.legend(["Tx pour t=0s","Ty pour t=0s"])
# Etape 6: Calcul de la température à tous les Nt ponts et pour tous les noeuds
# du barreau
for n in range(1,Nt):
    for i in range(1,Nx):
        for j in range(1,Ny):
            Tx[i,n+1]=K*((Tx[i+1,n]+Tx[i-1,n])*dy*dy+(Ty[j+1,n]+Ty[j-1,n])*dx*dx-2*(Tx[i,n]*dx*dx+Ty[j,n]dy*dy)+Tx[i,n])
# Etape 7: Graphiques
#Graphique pour tracer l'évolution de la température au début 
#Aumilieur et à la fin du processus
plt.figure(2)
plt.plot(x,Tx[:,1],'-b',x,Tx[:,(int(Nt/2))],'--k',x,Tx[:,Nt],'-r')   
# ATTENTION que toutes les valeurs soit bien interpreté comme un nombre entier
plt.legend(['T pour t=0s','Tpour t=1h','T pour t=2h'])
plt.xlabel('Longueur x (m)')
plt.ylabel('Température T(K)')
........................................................................................
Dites-moi ce que vous en passez.
Je voulais faire un tableau pour 3 axes, mais je n'ai pas réussi. Donc j'ai créé 2 tableaux, un pour T1 et un autre pour T2.
Je vous remercie par avance

-
Edité par ManuelBriceTeixeira 7 janvier 2019 à 20:39:10

  • Partager sur Facebook
  • Partager sur Twitter
8 janvier 2019 à 15:11:25

Hello, peux tu editer ton message en utilisant le bouton <I> pour rentrer le code, ça donne pas envie de lire là
  • Partager sur Facebook
  • Partager sur Twitter
HOPE
8 janvier 2019 à 18:44:43

#Etapes 1: Importation des modules
 
import numpy as np
import scipy as sp
import matplotlib as mpl
import matplotlib.pyplot as plt
import os

# Etapes 2: Donner d'entrées (variables)

L=1.5                   # Longueur des 4 cotés de la plaque en m
tf= float(2*3600)       # Temps d'évolution de 2h
alpha=2.10E-5           # Diffusivité thermique en m2/s
T1= 400.                # Température des cotés horizontaux  en °C
T2=300.                 # Temperature des cotés vertiticaux  en °C
T0= 293                 # Température initial sur les 4 cotés en °C
#lamb= 0                 # Conductivité thermique du matériaux en W.m^-1.K^-1
#Rho=0                   # Masse volumique du matériau en kg.^-3
#c= 0                    # Capacité thermique massique du materiau en J.kg^-1.K^-1

Nx= 100               # Nombres de points de calcule sur la barre
Ny= 100              # Nombres de points de calcule sur la barre
dt=1.                 # Fréquence de calcule
Nt= int(tf/dt)        # Nombre de point de calcule dans le temps
dx=float(L/100)       # Pas d'espace
dy=float(L/100)
K=alpha*(dt/(dx*dx*dy*dy))  # Constante K
x=np.linspace(0,L,num=Nx+1)
y=np.linspace(L,0,num=Ny+1)

# Etape 3: Vérification de la condition de stabilité CFL
# K > 0.5 pour être stable

CFL=K
print("CFL = ",CFL)
if CFL<=0.5:
    print("La condition CFL est respectée")
else:
    print("La condition CFL n'est pas respectée")
 
#Etapes 4: Condition initial
    
Tx=sp.ones((Nt+1,Nx+1))        # Matrice de température T(x,t)
Tx=293*Tx                       #  Ou 293*np.ones((Nx+1,Nt+1))
for i in range(0,Nx+1):
    Tx[i,1]= 293.

Ty=sp.ones((Ny+1,Nt+1))       # Matrice de température T(y,t)
Ty=293*Ty
for j in range(0,Ny+1):
    Ty[j,1]= 293.

# Etapes 5: Les conditions aux limites 
    
for n in range(0,Nt+1):
    Tx[n,0]=T2
    Tx[n,Nx]=T2

for n in range(0, Nt+1):
    Ty[0,n]=T1
    Ty[Ny,n]=T1
    
# Profile de température initial dans le barreau
plt.figure(1)
plt.plot(x,Tx[:,1])
plt.plot(y, Ty[:,1])
plt.legend(["Tx pour t=0s","Ty pour t=0s"])

# Etape 6: Calcul de la température à tous les Nt ponts et pour tous les noeuds
# du barreau

for n in range(1,Nt):
    for i in range(1,Nx):
        for j in range(1,Ny):
            Tx[i,n+1]=K*((Tx[i+1,n]+Tx[i-1,n])*dy*dy+(Ty[j+1,n]+Ty[j-1,n])*dx*dx-2*(Tx[i,n]*dx*dx+Ty[j,n]dy*dy)+Tx[i,n])

# Etape 7: Graphiques
        
#Graphique pour tracer l'évolution de la température au début 
#Aumilieur et à la fin du processus
        
plt.figure(2)
plt.plot(x,Tx[:,1],'-b',x,Tx[:,(int(Nt/2))],'--k',x,Tx[:,Nt],'-r')   
# ATTENTION que toutes les valeurs soit bien interpreté comme un nombre entier
plt.legend(['T pour t=0s','Tpour t=1h','T pour t=2h'])
plt.xlabel('Longueur x (m)')
plt.ylabel('Température T(K)')
























  • Partager sur Facebook
  • Partager sur Twitter
9 janvier 2019 à 10:04:59

Merci, et du coup qu'est ce qui ne marche pas dans ton programme ? quel est ton bug ?
  • Partager sur Facebook
  • Partager sur Twitter
HOPE
11 janvier 2019 à 17:41:50

Bonjour Manuel-Brice,

Je suis la même UE que toi et je suis tombé sur ce post en essayant de trouver de l'aide.

Dans ton code j'ai plusieurs questions :

Ci-dessous pourquoi ranges-tu les valeurs de y de L à 0 et pas de 0 à L comme pour x ?

x=np.linspace(0,L,num=Nx+1)

y=np.linspace(L,0,num=Ny+1)



Même question ici pourquoi pas [0;n] et [Nx,n] ? comme pour Ty ?

for n in range(0,Nt+1):

Tx[n,0]=T2

Tx[n,Nx]=T2



 Enfin pour la formule je ne vois pas pourquoi le premier terme est Tx ? N'est-ce pas T[i,j,n+1] ?

Idem a la fin de l'équation tu marques Tx[i,n], n'est-ce pas  T[i,j,n+1] ?

for n in range(1,Nt):

for i in range(1,Nx):

for j in range(1,Ny):

Tx[i,n+1]=K*((Tx[i+1,n]+Tx[i-1,n])*dy*dy+(Ty[j+1,n]+Ty[j-1,n])*dx*dx-2*(Tx[i,n]*dx*dx+Ty[j,n]dy*dy)+Tx[i,n])



Je n'ai aucune certitude, j'ai un message d'erreur de syntaxe sur mon programme...

De plus j'ai du mal a faire le tableau à 3 dimensions pour afficher en 3D...

Bon courage.

-
Edité par BastienGuiheneuf1 11 janvier 2019 à 17:42:31

  • Partager sur Facebook
  • Partager sur Twitter
14 janvier 2019 à 20:18:41

Bonjour, 

loumierex:

Je n'arrive pas à créer un tableau 2D. Je pense que le problème vient de là.

BastienGuiheneuf1:

J'ai modifié les axes pour essayer de le faire fonctionner, mais sans résultat. 

Si je rentre T[i,j,n+1] ,   Python me met une erreur de syntaxe et ne fonctionnement pas.

Je n'arrive pas non plus à créer un tableau deux 2D (3D si je compte le temps dedans)

Bon courage à toi aussi.

  • Partager sur Facebook
  • Partager sur Twitter
18 janvier 2019 à 10:38:18

Un tableau 2D c'est simplement une liste dans une liste, ou un array dans un array 

Tableau2D=[[1,2,3][4,5,6]]

mais peut-être que je comprends mal ton problème 

  • Partager sur Facebook
  • Partager sur Twitter
HOPE
22 janvier 2019 à 19:20:59

Le problème est pour la création d'un affichage en 3D avec :

     Température selon l'axe x Tx

     Températures selon l'axe y Ty

      Tout cela en fonction du temps T.

Pour faire les listes Tx, Ty et T je pense que ça va. 

Par contre je ne sais pas comment réaliser l'affichage (matplolib et plot_surface a priori)

Je pense que Manuel-Brice est dans le même cas

  • Partager sur Facebook
  • Partager sur Twitter
24 janvier 2019 à 21:42:59

d'acc, alors pour un affichage 3d j'ai trouvé ces codes en cherchant un peu : 

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111,projection='3d')
X=[1,2,3,4,5,6,7,8,9]
Y=[5,6,1,2,3,4,7,8,9]
Z=[9,5,1,3,2,6,4,7,8]

ax.scatter(X, Y, Z, c='r', marker='o')
ax.set_xlabel('x_axis')
ax.set_ylabel('y_axis')
ax.set_zlabel('z_axis')
plt.show()

Je vous laisse gerer la transciption de vos liste de liste en une liste par axe, indéxé par point.

Là on a bien les 3 dimensions. Est ce que c'est ce que vous cherchez ou vous chercher quelque chose plus time serie, cad une abscisse temporelle, et 2 courbes surperposées, avec chacune leur axe d'ordonné différent ?

-
Edité par loumierex 24 janvier 2019 à 21:47:24

  • Partager sur Facebook
  • Partager sur Twitter
HOPE
29 janvier 2019 à 18:55:16

Salut !

Oui voila c'est pas mal ça. 

Il y a 2 graphes (l'un Tx en fonction du temps et de la température, et l'autre Ty en fonction du temps et de la température.

#Graphique pour tracer l'evolution de la T° de Tx   
X,Y = np.meshgrid(x, t)                         #matrice x, t
Txx=Tx.T                                        #Transpose Tx
fig = plt.figure(1)                             #nom figure
ax = fig.add_subplot(111, projection='3d')      #representation 3D
ax.set_xlabel('Axe X (m)', fontsize = 10)       #titre axe x, taille police
ax.set_ylabel('Temps (s)', fontsize = 10)       #titre axe y,taille police
ax.set_zlabel('Temperature (degres C)', fontsize = 10) #titre axe z, taille 
#police
plt.title('Evolution de Tx en fonction du temps') #titre du graphique
p = ax.plot_surface(X,Y,Txx,cstride=1,linewidth=0,cmap='jet') #surface
cb = fig.colorbar(p,ax = ax)   #barre de niveau coloree
plt.savefig('EvolutionTx.png') #sauvegarde

#Graphique pour tracer l'evolution de la T° de Ty   
X,Y = np.meshgrid(y, t)                             #matrice y, t
Tyy=Ty.T                                            #Transpose Tx
fig = plt.figure(2)                                 #nom figure
ax = fig.add_subplot(111, projection='3d')          #representation 3D
ax.set_xlabel('Axe Y (m)', fontsize = 10)           #titre axe x, taille police
ax.set_ylabel('Temps (s)', fontsize = 10)           #titre axe y, taille police
ax.set_zlabel('Temperature (degres C)', fontsize = 10)   #titre axe z, taille 
#police
plt.title('Evolution de Ty en fonction du temps')      #titre du graphique
p = ax.plot_surface(X,Y,Tyy,cstride=1,linewidth=0,cmap='jet') #surface
cb = fig.colorbar(p,ax = ax)   #barre de niveau coloree
plt.savefig('EvolutionTy.png') #sauvegarde



  • Partager sur Facebook
  • Partager sur Twitter
29 janvier 2019 à 20:53:14

Donc les 2 courbes ont les même axes et tu veux juste avoir 2 courbes sur le même graph?
  • Partager sur Facebook
  • Partager sur Twitter
HOPE
3 février 2019 à 18:32:22

 Voila ce que ça donne selon Tx (j'ai un 2eme graphe selon Ty). Je pense que ça répond à la problématique

Encore un soucis j'aimerai que l'utilisateur rentre le coeff de diffusion, ou si il ne le connait pas le calculer à partir de 3 autres données :

#Etape 1 : Valeur du coeff de diffusion alpha
saisie = input("Connaissez-vous le coefficient de diffusion du materiau en 10^-6 m2.s-1 ? Repondre par oui ou non :")

if saisie == 'oui':
    print('Indiquez le coefficient de diffusion du materiau en 10^-6 m2.s-1 :')
    a=input()
if saisie == 'non':
    print'Indiquez la conductivité thermique du materiau en W.m-1.K-1 :'
    Lambda=input()
    print'Indiquez la chaleur spécifique du materiau en kJ.kg-1.K-1 :'
    c=input()
    print'Indiquez la masse volumique du materiau en 10^3kg.m-3 :'
    ro=input()
    a=(Lambda/(ro*c))*e-6
    print'Alpha =',a,'10^-6 m2.s-1'

J'ai l'impression que 'oui' et 'non' ne sont pas reconnus, j'ai un message d'erreur lorsque j'écris if saisie == 'XXX'. 

Une idée du problème ? Faut-il déclarer oui et non d'une autre manière ?

Merci.


  • Partager sur Facebook
  • Partager sur Twitter
30 août 2019 à 18:19:47

Bonsoir chers internaut. j'ai un problème et j'aimerai que vous m'aidiez à le solutionner.

Je cherche à crée un fonction dans python pour le calcule et l'affichage de la matrice de température pour l'équation de la chaleur 2D. Merci de bien vouloir m'aider.

  • Partager sur Facebook
  • Partager sur Twitter