Programme pour tableau avancement chimie terminale

Fermé
chu123 - 31 oct. 2021 à 17:55
yg_be Messages postés 22753 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 4 mai 2024 - 1 nov. 2021 à 09:55
Bonjour,
Nous voyons en ce moment les avancements finaux en chimie et nous devons compléter un code python permettant de calculer l'avancement final selon différentes variables.
Voilà mon code:

import numpy as np
import matplotlib.pyplot as plt
# La reaction consideree est A + B -> C + D
# Coefficients stoechiometriques
a, b, c, d = 1, 1, 1, 1
# Quantites de matiere initiales et volume initial
n_iA, n_iB, n_iC, n_iD = 0.1, 0.1, 0, 0
V = 100.0e-3
# Constante d'equilibre
K = 1e-1
# Calcul de l'avancement final et generation des valeurs de x entre 0 mol et xmax
xmax = min(n_iA/a, n_iB/b)
x = np.arange(0, xmax, xmax/10000.0)
tau = x/xmax
# Calcul des quantites de matiere et du quotient de reaction a chaque avancement x
n_A = n_iA-a*x
n_B = n_iB-b*x
n_C = n_iC+c*x
n_D = n_iD+d*x
Q_r = ((n_C/V)**c*(n_D/V)**d)/((n_A/V)**a*(n_B/V)**b)
# Determination de l'avancement final x_f
for i in range(len(x)) :
if Q_r<K:
x_f = x[i]
i = i+1
else :
continue
plt.subplot(2,1,1)
plt.ylabel('Quantites de matiere \n de A, B, C et D (mol/L)', fontsize=8)
plt.title('Evolutions des concentrations', fontsize=8)
plt.grid()
plt.axis(xmin=0, xmax=1)
plt.axvline(x = x_f/xmax, label = '$\\tau_f$')
plt.plot(tau, n_A, color = 'red', label='$n_A$')
plt.plot(tau, n_B, color = 'blue', label='$n_B$')
plt.plot(tau, n_C, color = 'green', label='$n_C$')
plt.plot(tau, n_D, color = 'orange', label='$n_D$')
plt.legend()
plt.show()
plt.subplot(2,1,2)
plt.xlabel('Taux d\'avancement $\\tau$', fontsize=8)
plt.ylabel('Constante de reaction $Q_r$ \n et constante d\'equilibre $K$', fontsize=8)
plt.title('Evolution du quotient de reaction \n en fonction de l\'avancement', fontsize=8)
plt.axvline(x = x_f/xmax, label = '$\\tau_f$')
plt.axis(xmin=0, xmax=1)
plt.plot(tau, K*np.ones(len(x)), color = 'blue', label='$K$')
plt.plot(tau, Q_r, color = 'red', label='$Q_r$')
plt.yscale('log')
plt.legend()
plt.show()
print('L\'avancement final correspond a x_f = ' + str(x_f) + ' mol, soit un taux d\'avancement final tau_f = ' + str(x_f/xmax) + '.')

Mais en l'exécutant, je reçois le message d'erreur suivant:
ValueError Traceback (most recent call last)
<ipython-input-13-8b9e8f373c4f> in <module>()
21 # Determination de l'avancement final x_f
22 for i in range(len(x)) :
---> 23 if Q_r<K:
24 x_f = x[i]
25 i = i+0,1

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Je suis bloquée :(
Merci d'avance pour votre aide!

Configuration: Windows / Chrome 95.0.4638.54
A voir également:

2 réponses

yg_be Messages postés 22753 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 4 mai 2024 1 477
31 oct. 2021 à 21:30
bonjour,
1) utilise les balises de code quand tu partages du code: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
2) tu dois compléter un code, ne penses-tu pas utile de nous montrer le code de départ?
3) tu as une erreur à une ligne où tu compares deux variables.
as-tu écrit cette ligne? à quoi sert-elle?
as-tu visualisé le contenu de ces deux variables?
1
Merci beaucoup de votre réponse!
Voilà les questions de l'exercice:
1. Le programme, dans un premier temps, doit pouvoir calculer les quantités de matière à chaque nouvel avancement x. À l’aide d’un tableau d’avancement, compléter les lignes 22 à 25 permettant de calculer les quantités de matière nA, nB, nC et nD.

2. Décommenter les lignes 42 à 45 permettant de représenter l’évolution des quantités de matière au cours de l’avancement x.

Le quotient de réaction Qr est une grandeur ne dépendant que des concentrations des espèces chimiques en solution. Le solvant et les solides n’ont pas d’influence :
Qr=((n_C/V)**c*(n_D/V)**d)/((n_A/V)**a*(n_B/V)**b)

On considère un volume V constant au cours de la réaction. La concentration standard c°, évoquée dans le chapitre, n'est pas abordée ici.

3. Compléter la ligne 26 permettant de calculer le quotient de réaction Qr à chaque avancement x.

4. Décommenter la ligne 55 permettant d’afficher l’évolution de Qr
​en fonction de l’avancement x.

La boucle permettant la détermination de l’avancement final xf, entre les lignes 29 et 34, nécessite une condition pour être fonctionnelle. Pour une réaction chimique, si Qr atteint la constante d’équilibre K, l’avancement final xf est atteint.

5. Décommenter les lignes 29 à 34 ainsi que les lignes 41, 52 et 60. Écrire la condition permettant la détermination de l’avancement final xf et lancer le programme.
(les lignes ne correspondent pas, mais celles à compléter sont signalées par #A complete)

Et le programme donné:
 import numpy as np
import matplotlib.pyplot as plt
# La reaction consideree est A + B -> C + D
# Coefficients stoechiometriques
a, b, c, d = 1, 1, 1, 1
# Quantites de matiere initiales et volume initial
n_iA, n_iB, n_iC, n_iD = 0.1, 0.1, 0, 0
V = 100.0e-3
# Constante d'equilibre
K = 1e-1
# Calcul de l'avancement final et generation des valeurs de x entre 0 mol et xmax
xmax = min(n_iA/a, n_iB/b)
x = np.arange(0, xmax, xmax/10000.0)
tau = x/xmax
# Calcul des quantites de matiere et du quotient de reaction a chaque avancement x
#n_A = # A complete
#n_B = # A complete
#n_C = # A complete
#n_D = # A complete
#Q_r = # A complete
# Determination de l'avancement final x_f
#for i in range(len(x)) :
#    if (# A complete) :
#        x_f = x[i]
#        i = i+1
#    else :
#        continue
plt.subplot(2,1,1)
plt.ylabel('Quantites de matiere \n de A, B, C et D (mol/L)', fontsize=8)
plt.title('Evolutions des concentrations', fontsize=8)
plt.grid()
plt.axis(xmin=0, xmax=1)
#plt.axvline(x = x_f/xmax, label = '$\\tau_f$')
#plt.plot(tau, n_A, color = 'red', label='$n_A$')
#plt.plot(tau, n_B, color = 'blue', label='$n_B$')
#plt.plot(tau, n_C, color = 'green', label='$n_C$')
#plt.plot(tau, n_D, color = 'orange', label='$n_D$')
plt.legend()
plt.show()
plt.subplot(2,1,2)
plt.xlabel('Taux d\'avancement $\\tau$', fontsize=8)
plt.ylabel('Constante de reaction $Q_r$ \n et constante d\'equilibre $K$', fontsize=8)
plt.title('Evolution du quotient de reaction \n en fonction de l\'avancement', fontsize=8)
#plt.axvline(x = x_f/xmax, label = '$\\tau_f$')
plt.axis(xmin=0, xmax=1)
plt.plot(tau, K*np.ones(len(x)), color = 'blue', label='$K$')
#plt.plot(tau, Q_r, color = 'red', label='$Q_r$')
plt.yscale('log')
plt.legend()
plt.show()
#print('L\'avancement final correspond a x_f = ' + str(x_f) + ' mol, soit un taux d\'avancement final tau_f = ' + str(x_f/xmax) + '.')


Le lien de l'exercice: https://www.lelivrescolaire.fr/page/14270721

Mon code:
import numpy as np
import matplotlib.pyplot as plt
# La reaction consideree est A + B -> C + D
# Coefficients stoechiometriques
a, b, c, d = 1, 1, 1, 1
# Quantites de matiere initiales et volume initial
n_iA, n_iB, n_iC, n_iD = 0.1, 0.1, 0, 0
V = 100.0e-3
# Constante d'equilibre
K = 1e-1
# Calcul de l'avancement final et generation des valeurs de x entre 0 mol et xmax
xmax = min(n_iA/a, n_iB/b)
x = np.arange(0, xmax, xmax/10000.0)
tau = x/xmax
# Calcul des quantites de matiere et du quotient de reaction a chaque avancement x
n_A = n_iA-a*x
n_B = n_iB-b*x
n_C = n_iC+c*x
n_D = n_iD+d*x
Q_r = ((n_C/V)**c*(n_D/V)**d)/((n_A/V)**a*(n_B/V)**b)
# Determination de l'avancement final x_f
for i in range(len(x)) :
    if Q_r<K:
        x_f = x[i]
        i = i+1
    else :
        continue
plt.subplot(2,1,1)
plt.ylabel('Quantites de matiere \n de A, B, C et D (mol/L)', fontsize=8)
plt.title('Evolutions des concentrations', fontsize=8)
plt.grid()
plt.axis(xmin=0, xmax=1)
plt.axvline(x = x_f/xmax, label = '$\\tau_f$')
plt.plot(tau, n_A, color = 'red', label='$n_A$')
plt.plot(tau, n_B, color = 'blue', label='$n_B$')
plt.plot(tau, n_C, color = 'green', label='$n_C$')
plt.plot(tau, n_D, color = 'orange', label='$n_D$')
plt.legend()
plt.show()
plt.subplot(2,1,2)
plt.xlabel('Taux d\'avancement $\\tau$', fontsize=8)
plt.ylabel('Constante de reaction $Q_r$ \n et constante d\'equilibre $K$', fontsize=8)
plt.title('Evolution du quotient de reaction \n en fonction de l\'avancement', fontsize=8)
plt.axvline(x = x_f/xmax, label = '$\\tau_f$')
plt.axis(xmin=0, xmax=1)
plt.plot(tau, K*np.ones(len(x)), color = 'blue', label='$K$')
plt.plot(tau, Q_r, color = 'red', label='$Q_r$')
plt.yscale('log')
plt.legend()
plt.show()
print('L\'avancement final correspond a x_f = ' + str(x_f) + ' mol, soit un taux d\'avancement final tau_f = ' + str(x_f/xmax) + '.')


Jusqu'à la question 4 tout marche bien, les graphes s'affichent correctement. Pour la question 5, je déduis de l'énoncé que la boucle doit continuer tant que Qr est inférieur à K. C'est pour cela que je complète la condition par "Qr<K". Mais quand je lance le programme, le message d'erreur s'affiche.
J'espère que c'est plus complet!
0
yg_be Messages postés 22753 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 4 mai 2024 1 477
1 nov. 2021 à 09:55
as-tu visualisé le contenu des deux variables que tu compares?
n'observes-tu pas une anomalie dans les lignes 22 à 27? à quoi sert le test en ligne 23, alors qu'aucune des deux variables n'est modifiée dans la boucle?
0