🖥️ Désintégration de l’uranium 235 : résolution numérique ★

Notebook Capytale de cet exercice : 2c37-11678460

On étudie une boule de rayon 𝑅 constituée d’uranium 235.

L’uranium 235 n’a pas un noyau stable, celui-ci peut se fissionner en “captant” un neutron selon la réaction nucléaire

92235U + 1 neutron → X + Y + 𝜈 neutrons

où X et Y sont deux noyaux plus légers. La valeur moyenne de 𝜈 est 2,5. Le nombre de réactions par unité de temps et de volume vaut 𝑛𝜏.

On se place en coordonnées sphériques, note 𝑛(𝑡,𝑟) le nombre de neutrons par unité de volume et 𝑗⃗(𝑡,𝑟) le vecteur densité de courant de neutrons.

On prend pour condition aux limites ∀𝑡,𝑛(𝑡,𝑟=𝑅)=0.

1/ En faisant un bilan de neutrons sur un volume mésoscopique, démontrer l’équation aux dérivées partielles vérifiée par 𝑛 :

𝜕𝑛𝜕𝑡=𝐷𝑟2𝜕𝜕𝑟(𝑟2𝜕𝑛𝜕𝑟)+𝜈−1𝜏𝑛
Coup de pouce 1
Combien de neutrons sont captés durant d𝑡 dans le volume considéré ? Combien sont émis ?
Corrigé

On fait un bilan de neutrons sur une coquille sphérique de rayon intérieur 𝑟 et d’épaisseur d𝑟. d2𝑁=𝛿2𝑁

d2𝑁=𝜕𝑛𝜕𝑡d𝑉d𝑡

À chaque fois que la réaction se produit, 𝜈 neutrons sont émis et un neutron est capté, donc 𝜈−1 neutrons supplémentaires apparaissent. Le nombre de réactions dans le volume élémentaire durant d𝑡 est 𝑛𝜏d𝑉d𝑡. Donc

𝛿2𝑁=𝜈−1𝜏𝑛d𝑉d𝑡+(𝑗(𝑡,𝑟)4𝜋𝑟2−𝑗(𝑡,𝑟+d𝑟)4𝜋(𝑟+d𝑟)2)d𝑡=𝜈−1𝜏𝑛d𝑉d𝑡−4𝜋𝜕𝜕𝑟(𝑟2𝑗(𝑡,𝑟))d𝑟d𝑡

Or d𝑉=4𝜋𝑟2d𝑟, donc en divisant par d𝑉d𝑡 on trouve l’équation

𝜕𝑛𝜕𝑡=𝜈−1𝜏𝑛−1𝑟2𝜕𝜕𝑟(𝑟2𝑗(𝑡,𝑟))

La loi de Fick donne 𝑗⃗=−𝐷grad⃗𝑛=−𝐷𝜕𝑛𝜕𝑟𝑒⃗𝑟, avec 𝐷 la diffusivité des neutrons dans l’uranium 235. En remplaçant dans l’équation, on trouve

𝜕𝑛𝜕𝑡=𝐷𝑟2𝜕𝜕𝑟(𝑟2𝜕𝑛𝜕𝑟)+𝜈−1𝜏𝑛

2/ On pose 𝑦(𝑡,𝑟)=𝑟𝑛(𝑡,𝑟). Montrer que 𝑦 vérifie l’équation de diffusion

𝜕𝑦𝜕𝑡=𝐷𝜕2𝑦𝜕𝑟2+𝜈−1𝜏𝑦
Coup de pouce 1
Remplacer 𝑛 par 𝑦𝑟 dans l’équation obtenue précédemment.
Corrigé

On remplace 𝑛 par 𝑦𝑟 dans l’équation précédente :

𝜕𝑦𝑟𝜕𝑡=𝐷𝑟2𝜕𝜕𝑟(𝑟2𝜕𝑦𝑟𝜕𝑟)+𝜈−1𝜏𝑦𝑟=𝐷𝑟2𝜕𝜕𝑟(𝑟𝜕𝑦𝜕𝑟−𝑦)+𝜈−1𝜏𝑦𝑟=𝐷𝑟2(𝜕𝑦𝜕𝑟+𝑟𝜕2𝑦𝜕𝑟2−𝜕𝑦𝜕𝑟)+𝜈−1𝜏𝑦𝑟=𝐷𝑟𝜕2𝑦𝜕𝑟2+𝜈−1𝜏𝑦𝑟

En multipliant par 𝑟, on trouve l’équation

𝜕𝑦𝜕𝑡=𝐷𝜕2𝑦𝜕𝑟2+𝜈−1𝜏𝑦

3/ Quelles sont les conditions aux limites vérifiées par 𝑦 en 𝑟=0 et 𝑟=𝑅 ?

Coup de pouce 1
La densité particulaire doit rester finie en 𝑟=0.
Corrigé

En 𝑟=0, la densité particulaire doit rester finie, donc 𝑦(𝑡,0)=0.

En 𝑟=𝑅, on a la condition aux limites 𝑛(𝑡,𝑅)=0, donc 𝑦(𝑡,𝑅)=𝑅𝑛(𝑡,𝑅)=0.

Pour résoudre numériquement l’équation de diffusion, on discrétise l’espace avec un pas d𝑟 et le temps avec un pas d𝑡. On note 𝑦𝑖,𝑗=𝑦(𝑖d𝑡,𝑗d𝑟).

4/ Établir le schéma d’Euler explicite pour résoudre numériquement l’équation de diffusion vérifiée par 𝑦 :

𝑦𝑖+1,𝑗=𝑦𝑖,𝑗+𝐷d𝑡d𝑟2(𝑦𝑖,𝑗+1−2𝑦𝑖,𝑗+𝑦𝑖,𝑗−1)+𝜈−1𝜏d𝑡𝑦𝑖,𝑗
Coup de pouce 1
Utiliser la relation de Taylor à l’ordre 2 pour approximer 𝑦𝑖,𝑗+1 et 𝑦𝑖,𝑗−1. De même, approximer 𝑦𝑖+1,𝑗 à l’ordre 1.
Corrigé

𝑦𝑖,𝑗+1=𝑦(𝑖d𝑡,𝑗d𝑟+d𝑟)≈𝑦(𝑖d𝑡,𝑗d𝑟)+𝜕𝑦𝜕𝑟d𝑟+12𝜕2𝑦𝜕𝑟2d𝑟2

𝑦𝑖,𝑗−1=𝑦(𝑖d𝑡,𝑗d𝑟−d𝑟)≈𝑦(𝑖d𝑡,𝑗d𝑟)−𝜕𝑦𝜕𝑟d𝑟+12𝜕2𝑦𝜕𝑟2d𝑟2

En additionnant, on trouve 𝑦𝑖,𝑗+1−2𝑦𝑖,𝑗+𝑦𝑖,𝑗−1≈𝜕2𝑦𝜕𝑟2d𝑟2

De plus, 𝑦𝑖+1,𝑗=𝑦(𝑖d𝑡+d𝑡,𝑗d𝑟)≈𝑦(𝑖d𝑡,𝑗d𝑟)+𝜕𝑦𝜕𝑡d𝑡=𝑦𝑖,𝑗+𝜕𝑦𝜕𝑡d𝑡, d’où 𝜕𝑦𝜕𝑡≈𝑦𝑖+1,𝑗−𝑦𝑖,𝑗d𝑡.

L’équation de diffusion s’écrit donc

𝑦𝑖+1,𝑗−𝑦𝑖,𝑗d𝑡=𝐷𝑦𝑖,𝑗+1−2𝑦𝑖,𝑗+𝑦𝑖,𝑗−1d𝑟2+𝜈−1𝜏𝑦𝑖,𝑗

On peut isoler 𝑦𝑖+1,𝑗 :

𝑦𝑖+1,𝑗=𝑦𝑖,𝑗+𝐷d𝑡d𝑟2(𝑦𝑖,𝑗+1−2𝑦𝑖,𝑗+𝑦𝑖,𝑗−1)+𝜈−1𝜏d𝑡𝑦𝑖,𝑗

5/ Compléter le code Python ci-dessous pour simuler la désintégration de l’uranium 235 dans la boule. On prendra comme condition initiale une densité de neutrons uniforme dans la boule égale à 1⋅1012⁠ ⁠m−3 (sauf aux conditions aux limites où elle est nulle).

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
import numpy as np

R = 0.2 # rayon de la boule en m
nu = 2.5 # nombre moyen de neutrons émis par fission
tau = 5.4e-9 # temps moyen entre deux fissions en s
D = 2e5 # diffusivité des neutrons dans l'uranium 235 en m2/s

Nx = 50 # nombre d'échantillons spatiaux
Nt = 1000 # nombre d'échantillons temporels

dx = ... # pas spatial
dt = 0.5 * dx**2 / (2*D) # pas temporel (condition de stabilité)

t = ... # array contenant tous les instants
r = ... # array contenant toutes les positions

y = ... # initialisation de la matrice avec des zéros
y[0,1:-1] = ... # condition initiale : densité uniforme 

for i in range(0, Nt-1):
    y[i+1, ...] = 0 # condition aux limites en r=0
    y[i+1, ...] = 0 # condition aux limites en r=R
    for j in range(1, Nx-1):
        # schéma d'Euler explicite
        y[i+1,j] = ...
Coup de pouce 1
On peut utiliser les fonctions np.linspace et np.zeros de la bibliothèque numpy.
Corrigé
1
2
3
4
5
6
7
8
9
10
11
12
13
14
dx = R / (Nx - 1) # pas spatial

t = np.arange(Nt) * dt # array contenant tous les instants
r = np.linspace(0, R, Nx) # array contenant toutes les positions

y = np.zeros( (Nt,Nx) ) # initialisation de la matrice avec des zéros
y[0,1:-1] = 1e12 * r[1:-1] # condition initiale : densité uniforme 

for i in range(0, Nt-1):
    y[i+1, 0] = 0 # condition aux limites en r=0
    y[i+1, -1] = 0 # condition aux limites en r=R
    for j in range(1, Nx-1):
        # schéma d'Euler explicite
        y[i+1,j] = y[i,j] + D*dt/dx**2 * (y[i,j+1] - 2*y[i,j] + y[i,j-1]) + (nu-1)/tau * y[i,j] * dt

6/ Tracer la densité de neutrons en fonction du rayon aux instants 𝑡=0, 𝑡=𝑡max4, 𝑡=𝑡max2, 𝑡=3𝑡max4 et 𝑡=𝑡max où 𝑡max est le temps final de la simulation.

Coup de pouce 1
Utiliser la bibliothèque matplotlib pour tracer les graphiques demandés.
Coup de pouce 2
Penser à calculer la densité de neutrons 𝑛 à partir de 𝑦 en utilisant la relation 𝑛=𝑦𝑟.
Corrigé

On peut utiliser le code suivant pour tracer la densité de neutrons en fonction du rayon à différents instants :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
n = np.zeros_like(y)
n[:, 1:] = y[:, 1:] / r[1:] # calcul de la densité de neutrons (r[0] = 0)
n[:, 0] = n[:, 1] # en r=0, n est finie : on prolonge par continuité

import matplotlib.pyplot as plt
plt.figure()
plt.plot(r, n[0,:], label=f't={t[0]:.2e} s')
plt.plot(r, n[Nt//4,:], label=f't={t[Nt//4]:.2e} s')
plt.plot(r, n[Nt//2,:], label=f't={t[Nt//2]:.2e} s')
plt.plot(r, n[3*Nt//4,:], label=f't={t[3*Nt//4]:.2e} s')
plt.plot(r, n[-1,:], label=f't={t[-1]:.2e} s')
plt.xlabel('Rayon r (m)')
plt.ylabel('Densité de neutrons (m$^{-3}$)')
plt.title("Évolution de la densité de neutrons dans la boule d'uranium 235")
plt.legend()
plt.show()

7/ Tracer l’évolution temporelle de la densité de neutrons en 𝑟=𝑅2.

Corrigé
1
2
3
4
5
6
plt.figure()
plt.plot(t, n[:, Nx//2])
plt.xlabel('Temps t (s)')
plt.ylabel('Densité de neutrons (m$^{-3}$)')
plt.title("Évolution temporelle de la densité de neutrons en r=R/2")
plt.show()

8/ Pour de petites valeurs de 𝑅, la densité de neutrons tend vers 0 avec le temps. Pour de grandes valeurs de 𝑅, la densité de neutrons croît exponentiellement avec le temps. Déterminer la valeur critique de 𝑅 séparant ces deux comportements. On pourra procéder par essais successifs et on la déterminera à 0,5⁠ ⁠cm près.

Coup de pouce 1
Le profil initial n’est pas le mode fondamental : il commence par se déformer, ce qui masque la croissance ou la décroissance exponentielle. Il faut donc simuler assez longtemps.
Corrigé

Avec 𝑁𝑡=1000, la simulation ne dure que quelques nanosecondes : le profil initial 𝑦=𝑛0𝑟 n’est pas le mode fondamental sin(𝜋𝑟/𝑅), il se déforme d’abord, et cette relaxation masque complètement la tendance exponentielle près du rayon critique. Il faut allonger la simulation, par exemple Nt = 20000.

Pour 𝑅=0,08 m, la densité de neutrons tend vers 0 avec le temps.

Pour 𝑅=0,09 m, la densité de neutrons croît exponentiellement avec le temps.

Le rayon critique est situé entre ces deux valeurs : 𝑅𝑐=(8,5±0,5) cm, en accord avec la valeur analytique 𝜋𝐷𝜏/(𝜈−1)=8,4 cm.