🖥️ Propagation de la chaleur

Notebook Capytale de cet exercice : 1285-5360170

On cherche à modéliser l’évolution de la température dans un barreau cylindrique en aluminium (𝐷=99⋅10−6 m2 s−1) de longueur 𝑙=10 cm. L’évolution de la température est donnée par l’équation de diffusion 𝜕𝑇𝜕𝑡=𝐷𝜕2𝑇𝜕𝑥2.

On discrétise spatialement la barre en prenant 𝑁𝑥=20 points.

1/ Sachant que le schéma d’Euler est stable ssi 2𝐷Δ𝑡Δ𝑥2<1, quel pas temporel maximal peut-on choisir ? On choisira dans toute la suite Δ𝑡=0,1 s. Compléter le code suivant.

D = 99e-6
l = 10e-2
N_x = 20
Delta_x = ... # pas spatial
Delta_t = 0.1 # pas temporel
Coup de pouce 1
Quelle relation relie le pas spatial Δ𝑥, la longueur de la barre 𝑙 et le nombre de points 𝑁𝑥 ?
Corrigé

Les 𝑁𝑥 points sont régulièrement répartis de 𝑥=0 à 𝑥=𝑙 : ils délimitent 𝑁𝑥−1 intervalles, donc

Δ𝑥=𝑙𝑁𝑥−1=10⋅10−219=5,3⋅10−3 mΔ𝑡<(Δ𝑥)22𝐷=1,4⋅10−1 s

Le pas Δ𝑡=0,1 s proposé convient donc.

Delta_x = l/(N_x - 1) # pas spatial

2/ La température dans le barreau à chaque instant sera stockée dans une matrice de sorte que 𝑇𝑖,𝑗=𝑇(𝑖⋅Δ𝑡,𝑗⋅Δ𝑥). On souhaite simuler l’évolution de la température durant 4 minutes. Combien de lignes doit comporter la matrice ? Combien de colonnes ? Compléter le code suivant.

import numpy as np
T = np.zeros((...,...))
Coup de pouce 1
Quelle relation relie le pas temporel Δ𝑡, la durée totale de la simulation et le nombre de pas temporels 𝑁𝑡 ?
Coup de pouce 2
La fonction np.zeros((a,b)) permet de créer une matrice de a lignes et b colonnes initialisée à zéro.
Corrigé

Il faut 𝑁𝑡=4×600.1=2400 lignes et 𝑁𝑥=20 colonnes.

import numpy as np
N_t = int((4 * 60) / Delta_t)
T = np.zeros((N_t,N_x))

3/ On initialise la simulation en supposant la température égale à 298⁠ ⁠K dans le barreau au début. Compléter le code suivant.

T[...] = 298 # Température initiale de la barre
Coup de pouce 1
À quel endroit de la matrice 𝑇𝑖,𝑗 correspond la température initiale de la barre ?
Coup de pouce 2
On peut utiliser le “slicing” de Python pour sélectionner des sous-parties d’une matrice : T[i,:] sélectionne la i-ième ligne de T.
Corrigé
T[0, :] = 298 # Température initiale de la barre

4/ L’extrémité gauche du barreau (𝑥=0) est maintenue à une température de 350⁠ ⁠K tandis que son extrémité droite (𝑥=10 cm) est maintenue à 298⁠ ⁠K. Compléter le code suivant.

T[...] = 350 # Température de la barre en x=0
T[...] = 298 # Température de la barre en x=10cm
Coup de pouce 1
À quel endroit de la matrice 𝑇𝑖,𝑗 correspondent l’abscisse 𝑥=0 ? et l’abscisse 𝑥=𝑙 ?
Coup de pouce 2
On peut utiliser le “slicing” de Python pour sélectionner des sous-parties d’une matrice : T[:,j] sélectionne la j-ième colonne de T.
Corrigé
T[:,0] = 350 # Température de la barre en x=0
T[:,-1] = 298 # Température de la barre en x=10cm

5/ Montrer que l’équation de diffusion peut donner lieu à un schéma d’Euler 𝑇𝑖+1,𝑗=𝐷Δ𝑡Δ𝑥2𝑇𝑖,𝑗+1+𝐷Δ𝑡Δ𝑥2𝑇𝑖,𝑗−1+(1−2𝐷Δ𝑡Δ𝑥2)𝑇𝑖,𝑗. Compléter le code suivant.

for i in range(len(T)-1):
    for j in range(1, N_x-1):
        T[i+1,j] = ...
Coup de pouce 1
La démonstration a été vue en cours.
Corrigé

Démo faite en cours.

for i in range(len(T)-1):
    for j in range(1, N_x-1):
        T[i+1,j] = D * (Delta_t/(Delta_x**2)) * (T[i,j+1] + T[i,j-1]) + (1 - 2*D * (Delta_t/(Delta_x**2))) * T[i,j]

6/ Expliquer le choix des bornes des deux boucles du code précédent.

Corrigé

La boucle sur i remplit la ligne i+1 à chaque tour : elle doit donc s’arrêter à l’avant-dernière ligne, sinon T[i+1] sortirait de la matrice. C’est ce que donne range(len(T)-1).

La boucle sur j utilise les voisins T[i,j-1] et T[i,j+1] : elle ne peut pas traiter la première ni la dernière colonne, qui n’ont qu’un seul voisin. Ces deux colonnes sont précisément celles des extrémités du barreau, dont la température est imposée par les conditions aux limites (350⁠ ⁠K et 298⁠ ⁠K) : il ne faut surtout pas les recalculer.

7/ Tracer sur le même graphe le profil de température dans la barre au bout de 15⁠ ⁠s, 30⁠ ⁠s, 1⁠ ⁠min, 2⁠ ⁠min et 4⁠ ⁠min. Compléter le code suivant.

import matplotlib.pyplot as plt
x = ... # Positions des points de la barre (m)
plt.plot(x, ..., label='t=15s')
plt.plot(x, ..., label='t=30s')
plt.plot(x, ..., label='t=1min')
plt.plot(x, ..., label='t=2min')
plt.plot(x, ..., label='t=4min')
plt.xlabel('Position le long de la barre (m)')
plt.ylabel('Température (K)')
plt.legend()
plt.show()
Coup de pouce 1
Où dans la matrice T se trouve le profil de température à l’instant 𝑡=15 s ?
Coup de pouce 2
Pour générer les abscisses de la courbe, on peut utiliser la fonction np.linspace(a,b,n) pour créer un tableau de n valeurs régulièrement espacées entre a et b.
Corrigé
import matplotlib.pyplot as plt
x = np.linspace(0, l, N_x)
for t in [15, 30, 60, 120, 240]: # en secondes
    i = int(t / Delta_t)
    plt.plot(x, T[i, :], label=f't={t}s')
plt.xlabel('Position le long de la barre (m)')
plt.ylabel('Température (K)')
plt.legend()
plt.show()

8/ Tracer la température du point central de la barre en fonction du temps. Compléter le code suivant.

t = ... # Instants simulés (s)
plt.plot(t, ...)
plt.xlabel('Temps (s)')
plt.ylabel('Température au centre de la barre (K)')
plt.show()
Coup de pouce 1
Où dans la matrice T se trouve le profil de température à l’abscisse 𝑥=𝑙2 ?
Coup de pouce 2
L’abscisse de la courbe est le temps : il y a une valeur par ligne de T, espacées de Δ𝑡.
Corrigé
import matplotlib.pyplot as plt
j = N_x // 2
t = np.arange(N_t) * Delta_t # les instants simulés, un par ligne de T
plt.plot(t, T[:, j])
plt.xlabel('Temps (s)')
plt.ylabel('Température au centre de la barre (K)')
plt.show()