Calculating a bubble point pressure of a mixture
Posted February 18, 2013 at 09:00 AM | categories: nonlinear algebra | tags: thermodynamics
Updated March 06, 2013 at 04:32 PM
Adapted from http://terpconnect.umd.edu/~nsw/ench250/bubpnt.htm (dead link)
We previously learned to read a datafile containing lots of Antoine coefficients into a database, and use the coefficients to estimate vapor pressure of a single compound. Here we use those coefficents to compute a bubble point pressure of a mixture.
The bubble point is the temperature at which the sum of the component vapor pressures is equal to the the total pressure. This is where a bubble of vapor will first start forming, and the mixture starts to boil.
Consider an equimolar mixture of benzene, toluene, chloroform, acetone and methanol. Compute the bubble point at 760 mmHg, and the gas phase composition. The gas phase composition is given by: \(y_i = x_i*P_i/P_T\).
import numpy as np from scipy.optimize import fsolve # load our thermodynamic data data = np.loadtxt('data/antoine_data.dat', dtype=[('id', np.int), ('formula', 'S8'), ('name', 'S28'), ('A', np.float), ('B', np.float), ('C', np.float), ('Tmin', np.float), ('Tmax', np.float), ('??', 'S4'), ('?', 'S4')], skiprows=7) compounds = ['benzene', 'toluene', 'chloroform', 'acetone', 'methanol'] # extract the data we want A = np.array([data[data['name'] == x]['A'][0] for x in compounds]) B = np.array([data[data['name'] == x]['B'][0] for x in compounds]) C = np.array([data[data['name'] == x]['C'][0] for x in compounds]) Tmin = np.array([data[data['name'] == x]['Tmin'][0] for x in compounds]) Tmax = np.array([data[data['name'] == x]['Tmax'][0] for x in compounds]) # we have an equimolar mixture x = np.array([0.2, 0.2, 0.2, 0.2, 0.2]) # Given a T, we can compute the pressure of each species like this: T = 67 # degC P = 10**(A - B / (T + C)) print P print np.dot(x, P) # total mole-fraction weighted pressure Tguess = 67 Ptotal = 760 def func(T): P = 10**(A - B / (T + C)) return Ptotal - np.dot(x, P) Tbubble, = fsolve(func, Tguess) print 'The bubble point is {0:1.2f} degC'.format(Tbubble) # double check answer is in a valid T range if np.any(Tbubble < Tmin) or np.any(Tbubble > Tmax): print 'T_bubble is out of range!' # print gas phase composition y = x * 10**(A - B / (Tbubble + C))/Ptotal for cmpd, yi in zip(compounds, y): print 'y_{0:<10s} = {1:1.3f}'.format(cmpd, yi)
[ 498.4320267 182.16010994 898.31061294 1081.48181768 837.88860027] 699.654633507 The bubble point is 69.46 degC y_benzene = 0.142 y_toluene = 0.053 y_chloroform = 0.255 y_acetone = 0.308 y_methanol = 0.242
Copyright (C) 2013 by John Kitchin. See the License for information about copying.