Suivi de réaction chimique par spectroscopie RMN Analyse de données de cinétique à l’aide du langage de programmation Python Suivi de réaction chimique par spectroscopie RMN Pierre-Alexandre Turgeon Université de Sherbrooke Pierre-Alexandre Turgeon
Mécanisme de réaction Cinétiques compétitives réversibles
Mécanisme de réaction Cinétiques compétitives réversibles
Mécanisme de réaction Cinétiques compétitives réversibles Habituellement, on intègre les lois de vitesses pour obtenir l’évolution temporelle de chacune des concentrations. Ici, il y a un petit problème… La solution de ce système d’équations différentielles est loin d’être triviale! En fait, même l’utilisation du logiciel Mathematica n’a pas permis d’obtenir la solution à ce système d’équation… Aujourd’hui, nous contournerons donc le problème et trouveront les constantes de vitesse autrement.
Traitement de données import numpy as np Importation des modules Les modules sont des « extensions » de Python qui permettent d’introduire des nouvelles fonctions qui ne sont pas présentes dans le langage de base. Les plus utilisés dans le domaine scientifique sont les suivants: Numpy : Il contient la majorité des fonctions mathématiques et permet de gérer les données sous forme de matrices et de vecteurs. Matplotlib : Permet de tracer les données Au début de votre code, vous devez inclure: import numpy as np import matplotlib.pyplot as plt
Traitement de données Importation des données Aller sur le site web et télécharger les fichiers RMN.txt et temps.txt. Le premier fichier contient tous les spectres RMN et le second contient le temps associé à chacun des spectres. Placez ces fichiers dans le même répertoire que votre script Python. Ajoutez ces lignes à votre code. La variable data va contenir tous les spectres sous forme d’un grand tableau (chaque colonne correspond à un spectre) alors que la variable temps sera un vecteur contenant le temps associé à chaque spectre. Dans la console tapez : data = np.loadtxt('RMN.txt') temps = np.loadtxt('temps.txt') np.shape(data)
Traitement de données ppm = data[:,0] spectres = data[:,1:] Séparation de l’axe x et des spectres La première colonne de la variable data est en réalité l’axe x, soit l’échelle des déplacements chimiques en ppm. Nous allons stocker l’axe x dans une variable qui lui est propre : Les spectres seront stockés dans leur propre variable aussi. On prend tous le reste des colonnes : ppm = data[:,0] spectres = data[:,1:]
Les spectres RMN plt.plot(ppm,spectres[:,0]) Tracer un spectre Il est maintenant possible de visualiser nos spectres RMN. Si on désire tracer le premier spectre de la série, on va dans la console et on tape : plt.plot(ppm,spectres[:,0])
Les spectres RMN plt.plot(ppm,spectres[:,0]) Tracer un spectre Il est maintenant possible de visualiser nos spectres RMN. Si on désire tracer le premier spectre de la série, on va dans la console et on tape : plt.plot(ppm,spectres[:,0])
Les spectres RMN plt.plot(ppm,spectres[:,0]) Tracer un spectre Il est maintenant possible de visualiser nos spectres RMN. Si on désire tracer le premier spectre de la série, on va dans la console et on tape : Si on veut tracer le 100e spectre e la série, on tape : plt.plot(ppm,spectres[:,0]) plt.plot(ppm,spectres[:,100])
Les spectres RMN plt.plot(ppm,spectres[:,0]) Tracer un spectre Il est maintenant possible de visualiser nos spectres RMN. Si on désire tracer le premier spectre de la série, on va dans la console et on tape : Si on veut tracer le 100e spectre e la série, on tape : plt.plot(ppm,spectres[:,0]) plt.plot(ppm,spectres[:,100])
Les spectres RMN furane1 = furane2 = maleic = Assignation des pics RMN Il faut maintenant assigner tous les pics RMN du spectre. Il y a deux pics associés au furane, un pic associé à l’anhydride maléique, 3 pics associés à la forme endo et 3 pics associés à la forme exo. furane1 = furane2 = maleic = endo1 = endo2 = endo3 = exo1 = exo2 = exo3 =
Les spectres RMN def integrale(x,y,x0,sigma): Intégration des pics Nous allons maintenant créé une fonction qui va nous permettre d’intégrer chacun des pics. Généralement, on inclus les fonctions au début du code. Pour créer une nouvelle fonction on écrit: Notre fonction aura besoin de 4 valeurs pour fonctionner. La variable x devra contenir l’axe x de notre spectre. La variable y devra contenir les valeurs d’intensité du spectre La variable x0 devra contenir la position du pic à intégré La variable sigma devra contenir la largeur approximative du pic à intégré (elle servira à déterminer les bornes d’intégration). def integrale(x,y,x0,sigma):
Les spectres RMN Intégration des pics On trouve les bornes inférieures et supérieures. On doit maintenant trouver leur position dans le vecteur de ppm : def integrale(x,y,x0,sigma): borne_inf = x0-sigma borne_sup = x0+sigma mini = np.abs(x-borne_inf).argmin() maxi = np.abs(x-borne_sup).argmin()
Les spectres RMN Intégration des pics On veut intégrer le pic grâce à la méthode des trapèzes, mais avant on doit faire une boucle sur tous les spectres de manière à trouver l’intégrale pour chaque temps de réaction. On trouve le nombre de spectres: On prépare le vecteur e qui va contenir la valeur des intégrales : On fait la boucle sur les « n » spectres : Notre fonction retourne le vecteur qui contient les aires : n = y.shape[1] aire = np.zeros(n) for i in range(n): aire[i] = np.trapz(spectres[mini:maxi,i], x = x[mini:maxi]) return aire
Les spectres RMN Intégration des pics def integrale(x,y,x0,sigma): borne_inf = x0-sigma borne_sup = x0+sigma mini = np.abs(x-borne_inf).argmin() maxi = np.abs(x-borne_sup).argmin() n = y.shape[1] aire = np.zeros(n) for i in range(n): aire[i] = np.trapz(spectres[mini:maxi,i], x = x[mini:maxi]) return aire
Les spectres RMN integrale(ppm,spectres,position,largeur) Intégration des pics On peut maintenant intégrer n’importe quel pic du spectre en utilisant la fonction suivante: Les positions sont déjà stockées dans les variables endo1, endo2, exo1, exo2, etc… Les largeurs devront être déterminées par l’expérimentateur. Pour les réactifs, une largeur de 0.075ppm donne de bons résultats. Pour les produits, une largeur de 0.02ppm donne de bons résultats. integrale(ppm,spectres,position,largeur)
Les spectres RMN Intégration des pics
Les spectres RMN Association entre les intégrales et les concentrations Les intégrales en RMN sont proportionnelles à la concentration de produit. Afin de vous aider à trouver la correspondance entre les intégrales et les concentrations voici les informations pertinentes: Qté d’anhydride maléique : 49mg Volume réactionnel : 500 microlitres
Détermination des constantes de vitesse Constantes kendo et kexo Les constantes kendo et kexo peuvent être déterminées à partir des taux initiaux de formation des produits endos et exos. Au départ, on peut approximer que [EN] et [EX] sont égales à 0. Donc : Vous pouvez faire une régression linéaire sur les quelques premiers points (à vous de déterminer combien) afin d’estimer le taux de réaction initial. Une même relation existe pour la formation du produit exo.
Détermination des constantes de vitesse Constante kendo- La constante kendo- correspond à la réaction inverse, c’est-à-dire le passe du produit endo au réactifs de départ. Il est possible de la déterminer en se plaçant au point maximum sur la courbe de concentration du produit endo. À ce point, son taux de variation est nul et il est permis d’écrire: Donc :
Détermination des constantes de vitesse Constante kexo- La constante kexo- peut être évaluée de façon similaire en prenant un point de référence sur la courbe de concentration du produit exo.