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 82
| import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button
fig, main_ax = plt.subplots()
plt.subplots_adjust(left=0.2, bottom=0.4)
# coefficients stoechiométriques
nu_C3H8 = 1
nu_O2 = 5
nu_CO2 = 3
nu_H2O = 4
# Quantités de matières initiales (en mol)
no_C3H8 = 1
no_O2 = 1
no_CO2 = 0
no_H2O = 0
# Avancement maximal
x_max_C3H8 = no_C3H8 / nu_C3H8
x_max_O2 = no_O2 / nu_O2
if x_max_C3H8 < x_max_O2:
x_max = x_max_C3H8
else:
x_max = x_max_O2
# Listes de quantités de matière
x = np.arange(0, x_max, x_max/100)
n_C3H8 = no_C3H8-nu_C3H8*x
n_O2 = no_O2 - nu_O2*x
n_CO2 = no_CO2 + nu_CO2*x
n_H2O = no_H2O + nu_H2O*x
# Cree le slider dans un ax dédié
ax_slider_C3H8 = plt.axes([0.10, 0.05, 0.80, 0.03])
ax_slider_O2 = plt.axes([0.10, 0.1, 0.80, 0.03])
ax_slider_CO2 = plt.axes([0.10, 0.15, 0.80, 0.03])
ax_slider_H2O = plt.axes([0.10, 0.2, 0.80, 0.03])
s_C3H8 = Slider(ax_slider_C3H8, 'Propane', 0, 10.0, valinit=no_C3H8)
s_O2 = Slider(ax_slider_O2, 'Dioxygène', 0, 10.0, valinit=no_O2)
s_CO2 = Slider(ax_slider_CO2, 'Dioxyde de carbone', 0, 10.0, valinit=no_CO2)
s_H2O = Slider(ax_slider_H2O, 'Eau', 0, 10.0, valinit=no_H2O)
# Courbes
l1, = main_ax.plot(x, n_C3H8, label="C3H8", lw=2)
l2, = main_ax.plot(x, n_O2, label="O2")
l3, = main_ax.plot(x, n_CO2, label="CO2")
l4, = main_ax.plot(x, n_H2O, label="H2O")
liste_des_n_max = [max(n_C3H8), max(n_O2), max(n_CO2), max(n_H2O)]
n_max = 1.1*max(liste_des_n_max)
main_ax.set_title("Evolution de la réaction de combustion")
main_ax.set_xlabel("Avancement (mol)")
main_ax.set_ylabel("Quantité de matière (mol)")
main_ax.legend(loc='upper center')
main_ax.grid()
def update(val):
C3H8 = s_C3H8.val
O2 = s_O2.val
CO2 = s_CO2.val
H2O = s_H2O.val
l1.set_ydata(C3H8-nu_C3H8*np.arange(0, x_max, x_max/100))
l2.set_ydata(O2-nu_O2*np.arange(0, x_max, x_max/100))
l3.set_ydata(CO2+nu_CO2*np.arange(0, x_max, x_max/100))
l4.set_ydata(H2O+nu_H2O*np.arange(0, x_max, x_max/100))
plt.draw()
s_C3H8.on_changed(update)
s_O2.on_changed(update)
s_CO2.on_changed(update)
s_H2O.on_changed(update)
# Cree un bouton reset
resetax = plt.axes([0.8, -0.02, 0.1, 0.04])
button = Button(resetax, 'Reset', hovercolor='0.975')
button.on_clicked(lambda event: s_C3H8.reset())
# Affichage
plt.show() |
Partager