[Go to previous section: 1.5| Go
to next Chapter: 2.0]
[ Go to CENG301 Homepage
| CENG301 Notes Table of
Contents]
Page 2
The drive program can be used to simulate multi-unit systems. The
listing of it is quite long but most of the operations are simple and
help shows us:
>> help drive drive - Provides an interactive mass balance analysis of a plant function drive DRIVE provides an interactive analysis of a plant Before running DRIVE you must run start301. DRIVE lets the user execute any of the four basic modules: sep, split, mix, and react The user may also choose to use SSEC2 (trial and error option) or to evaluate a given Matlab function. The drive menu lists: Option Reply for some additional help see: set rates in a feed stream sf ns, start301, cnms set stoichiometric coef ss setstc, stoic mixer mx mix, picmix splitter sp split, picsplit separator se sep, picsep reactor re react, picreact trial and error te tecon1, tecon2, ssec2 evaluate Matlab expression ev tecon1, tecon2, ssec2 stop st OKB, additions by JWD, revised help by TYLC
The flow matrix ns (with known flow rates in it), the
compound name arrays cnms, and the stoichiometric array
stoic (if there are reactions) must be defined before using
the drive program. After these three arrays have
been set, start the drive program in motion by
typing its name. The program will then ask for any balances you wish
to perform using the modular programs. Needed data such as reaction
rates, split ratios, and separator fraction must be given in reply to
prompts from the computer.
We will demonstrate the use of drive to solve
Problem 3.12 in the text.
|
You will find it much easier to see what must be done by using the program in an interactive session than you will in just reading these notes. We set the compound names and define stoic for the one reaction in Problem 3.12. After executing start301 to name the eight compounds and specify the one reaction, using Mass Balances Only gives:
Input the name of your new file: chroms The output file name is: chroms Input the number of compounds: 7 The number of compounds is: 7 Enter the name of compound # 1: ethanol Enter the name of compound # 2: sodium chromate Enter the name of compound # 3: sulfuric acid Enter the name of compound # 4: acetic acid Enter the name of compound # 5: Cr2(SO4)3 Enter the name of compound # 6: Na2SO4 Enter the name of compound # 7: water Enter the number of reactions: 1 Enter the coefficients for each compound in the same order that the compounds are listed. Coefficients for reactants should be Negative, and coefficients for products should be positive Enter the coefficients for each compound in reaction # 1 C2H5OH Na2Cr2O7 H2SO4 CH3COOH Cr2(SO4)3 Na2SO4 H2O -3 -2 -8 3 2 2 11 Here are your reactions: 3 C2H5OH + 2 Na2Cr2O7 + 8 H2SO4 --> 3 CH3COOH + 2 Cr2(SO4)3 + 2 Na2SO4 + 11 H2O Enter the number of streams: 8
The single separator in Figure 3.12 must be replaced by a sequence of
two separators since our sep function handles only
two product streams. In the first separator we will split off the
acetic acid product and in the second one we will separate into a
waste stream and the recycle stream. The streams are numbered so
that:
Stream Connects From To 1 Ethanol Feed Mixer 2 Acid and Chromate Feed Mixer 3 Mixer Reactor 4 Reactor Separator 1 5 Separator 1 Acid Product 6 Separator 1 Separator 2 7 Separator 2 Waste Product 8 Separator 2 Recycle
|
Using 3 mols of ethanol as a basis in stream 1 with the
information given for the feed rates in stream 2 and the recycle
stream 8, we can use drive to set the flows in these
streams by:
>> drive Give the space for printing flows: 9 Give the number of decimals to print them: 3 Flow Matrix row/col 1 2 3 4 5 6 7 1 0.000 0.000 0.000 0.000 0.000 0.000 0.000 2 0.000 0.000 0.000 0.000 0.000 0.000 0.000 3 0.000 0.000 0.000 0.000 0.000 0.000 0.000 4 0.000 0.000 0.000 0.000 0.000 0.000 0.000 5 0.000 0.000 0.000 0.000 0.000 0.000 0.000 6 0.000 0.000 0.000 0.000 0.000 0.000 0.000 7 0.000 0.000 0.000 0.000 0.000 0.000 0.000 8 0.000 0.000 0.000 0.000 0.000 0.000 0.000 Option Reply set rates in a feed stream sf set stoichiometric coef ss mixer mx splitter sp separator se reactor re trial and error te evaluate Matlab expression ev stop st Enter your choice sf <-- to set a feed stream Which stream do you want to set? 1 Enter the flow rate for each compound [3,zeros(1,6)] If you want to see all the flows in ns, reply: y Option Lists Enter your choice sf <-- Set feed stream Which stream do you want to set? 2 Enter the flow rate for each compound [0 2.2 9.6 zeros(1,4)] If you want to see all the flows in ns, reply: y Option Lists Enter your choice sf <-- Set feed stream Which stream do you want to set? 8 Enter the flow rate for each compound [0.18 0 2.82 zeros(1,4)] If you want to see all the flows in ns, reply: y y Flow Matrix row/col 1 2 3 4 5 6 7 1 3.000 0.000 0.000 0.000 0.000 0.000 0.000 2 0.000 2.200 9.600 0.000 0.000 0.000 0.000 3 0.000 0.000 0.000 0.000 0.000 0.000 0.000 4 0.000 0.000 0.000 0.000 0.000 0.000 0.000 5 0.000 0.000 0.000 0.000 0.000 0.000 0.000 6 0.000 0.000 0.000 0.000 0.000 0.000 0.000 7 0.000 0.000 0.000 0.000 0.000 0.000 0.000 8 0.180 0.000 2.820 0.000 0.000 0.000 0.000 Option Lists Enter your choice mx <-- Our response to get a mixer Give the indices of the feed streams 1 2 8 <-- We want to mix streams Give the indices of the exit streams 3 <-- 1,2 and 8 to get 3 If you want to redo these indices, reply y n They were entered correctly so mix and display are executed and we see: Compound Inlet | Outlet Stream 1 2 8 Total | 5 ethanol 3.000 0.000 0.180 3.180 | 3.180 sodium chromate 0.000 2.200 0.000 2.200 | 2.200 sulfuric acid 0.000 9.600 2.820 12.420 | 12.420 Total 3.000 11.800 3.000 17.800 | 17.800 If you want to see all the flows in ns, reply y y <-- We do this time. Flow Matrix row/col 1 2 3 4 5 6 7 1 3.000 0.000 0.000 0.000 0.000 0.000 0.000 2 0.000 2.200 9.600 0.000 0.000 0.000 0.000 3 3.180 2.200 12.420 0.000 0.000 0.000 0.000 4 0.000 0.000 0.000 0.000 0.000 0.000 0.000 5 0.000 0.000 0.000 0.000 0.000 0.000 0.000 6 0.000 0.000 0.000 0.000 0.000 0.000 0.000 7 0.000 0.000 0.000 0.000 0.000 0.000 0.000 8 0.180 0.000 2.820 0.000 0.000 0.000 0.000 Option Lists Enter your choice re <-- Next is our reactor. Give the indices of the feed streams 3 <-- Stream 3 is its feed. Give the indices of the exit streams 4 <-- Stream 4 is produced. If you want to redo these indices, reply y n give the reaction rates 0.9 <-- with one reaction at rate 0.9. Compound Inlet | Outlet Stream 3 | 4 ethanol 3.180 | 0.480 sodium chromate 2.200 | 0.400 sulfuric acid 12.420 | 5.220 acetic acid 0.000 | 2.700 Cr2(SO4)3 0.000 | 1.800 Na2SO4 0.000 | 1.800 water 0.000 | 9.900 Total 17.800 | 22.300 If you want to see all the flows in ns, reply: y n Option Lists Enter your choice se <-- Using a separator Give the indices of the feed streams 4 Give the indices of the exit streams 5 6 If you want to redo these indices, reply y n Give the fraction of each species that goes to stream: 5 0 0 0 1 0 0 0 <-- Only Acetic acid goes to stream 5. Compound Inlet | Outlet Stream 4 | 5 6 Total ethanol 0.480 | 0.000 0.480 0.480 sodium chromate 0.400 | 0.000 0.400 0.400 sulfuric acid 5.220 | 0.000 5.220 5.220 acetic acid 2.700 | 2.700 0.000 2.700 Cr2(SO4)3 1.800 | 0.000 1.800 1.800 Na2SO4 1.800 | 0.000 1.800 1.800 water 9.900 | 0.000 9.900 9.900 Total 22.300 | 2.700 19.600 22.300 If you want to see all the flows in ns, reply: y n Option Lists Enter your choice se <-- Another separator Give the indices of the feed streams 6 Give the indices of the exit streams 7 8 If you want to redo these indices, reply y n Give the fraction of each species that goes to stream: 7 0.625 1 0.45977011 1 1 1 1 <-- These are the fractions that meet the specs for the recycle. Compound Inlet | Outlet Stream 6 | 7 8 Total ethanol 0.480 | 0.300 0.180 0.480 sodium chromate 0.400 | 0.400 0.000 0.400 sulfuric acid 5.220 | 2.400 2.820 5.220 Cr2(SO4)3 1.800 | 1.800 0.000 1.800 Na2SO4 1.800 | 1.800 0.000 1.800 water 9.900 | 9.900 0.000 9.900 Total 19.600 | 16.600 3.000 19.600 If you want to see all the flows in ns, reply: y Option Lists Enter your choice st <-- We are finished! >>
Suppose we had a more common variation in the problem described in
the last section in which we are given the separation ratios in both
separators but do not know the recycle flows. Then we have no place
to start our analysis in which we know all flow rates. If we assume
values for the rates in the recycle stream, we can proceed as before
around the loop. When we get back through the second separator, we
will find a new set of flow rates in the recycle stream. These of
course will not match our assumed values, but may be better values
for starting a second time around. We could use the drive program to
do this, but you will find this to be tedious. A special purpose
program used just to simulate this one combination of units will be
much easier to use for the trial and error solution.
The function p312 simply does the operations we
showed:
After the loop is complete, the function returns a listing of the
rates of sulfuric acid and ethanol in the recycle stream. Here is a
session using p312 that followed the last
session:
>> ns(3:8,:)=zeros(6,7); <-- Assuming no flow in the recycle. >> p312 C2H5OH H2SO4 in Stream 8 0.1125 1.2966 <-- We see the result after one loop. >> p312 C2H5OH H2SO4 in Stream 8 0.1547 1.9970 <-- Changing some more. >> p312 C2H5OH H2SO4 in Stream 8 0.1705 2.3754 <-- and more. >> ns(8,[1 3])=[.18 2.82]; >> p312 <-- If we had guessed right, C2H5OH H2SO4 in Stream 8 0.1800 2.8200 <-- there would be no change.
A problem that requires more analysis before it can be solved with
the module functions is Problem 5.33 in the text.
|
The number of streams in the problem must be increased to 17 to
accommodate our modular restrictions of single inputs to reactors and
separators. The function iter was developed in APL
by Mr. Matthys, modified to shorten it and then rewritten in MATLAB.
The streams are numbered so that:
Stream Connects From To 1 Hydrogen Feed Mixer 1 2 Separator (recycle) Mixer 1 3 Mixer 1 Mixer 2 4 Splitter Mixer 2 5 Mixer 2 Reactor 6 Reactor Condenser 7 Condenser Splitter 8 Splitter Purge 9 Condenser Mixer 3 10 Mixer 3 Burner 11 Burner Mixer 4 12 Mixer 4 Absorber 13 Absorber HNO3 Product 14 Absorber Separator 15 Separator Waste Gas 16 Air Feed Mixer 3 17 Water Feed Mixer 4
|
The function iter lists all the flows in a table
using prntmx. The function iter has
an argument that sets the number of times that the function loops
through the calculation of all the balances.
We must first set the compound names and reactions, using (1) New
Session, with Mass Balances Only.
Give the name of your data file:nitric Here are your compounds' names: oxygen nitrogen hydrogen ammonia nitric oxide nitric acid water Here are your reactions: N2 + 3 H2 --> 2 NH3 2 O2 + NH3 --> HNO3 + H2O 2.5 O2 + 2 NH3 --> 2 NO + 3 H2O Enter the number of streams: 17
Next we set the feed streams:
>> ns(1,3)=220; >> ns(16,1:2)=[357 1343]; >> ns(17,7)=110;
Here is the flow matrix that we start with:
>> prntmx('Flow matrix',ns,6,0) Flow matrix row/col 1 2 3 4 5 6 7 1 0 0 220 0 0 0 0 2 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 11 0 0 0 0 0 0 0 12 0 0 0 0 0 0 0 13 0 0 0 0 0 0 0 14 0 0 0 0 0 0 0 15 0 0 0 0 0 0 0 16 357 1343 0 0 0 0 0 17 0 0 0 0 0 0 110
If we iterate once around the loop, we find:
>> iter(1) Flow matrix row/col 1 2 3 4 5 6 7 1 0.00 0.00 220.00 0.00 0.00 0.00 0.00 2 0.00 94.01 0.00 0.00 0.00 0.00 0.00 3 0.00 94.01 220.00 0.00 0.00 0.00 0.00 4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 5 0.00 94.01 220.00 0.00 0.00 0.00 0.00 6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 7 0.00 0.00 0.00 0.00 0.00 0.00 0.00 8 0.00 0.00 0.00 0.00 0.00 0.00 0.00 9 0.00 0.00 0.00 0.00 0.00 0.00 0.00 10 357.00 1343.00 0.00 0.00 0.00 0.00 0.00 11 357.00 1343.00 0.00 0.00 0.00 0.00 0.00 12 357.00 1343.00 0.00 0.00 0.00 0.00 110.00 13 0.00 0.00 0.00 0.00 0.00 0.00 110.00 14 357.00 1343.00 0.00 0.00 0.00 0.00 0.00 15 357.00 1248.99 0.00 0.00 0.00 0.00 0.00 16 357.00 1343.00 0.00 0.00 0.00 0.00 0.00 17 0.00 0.00 0.00 0.00 0.00 0.00 110.00
Ten more iterations and:
>> iter(10) Flow matrix row/col 1 2 3 4 5 6 7 1 0.00 0.00 220.00 0.00 0.00 0.00 0.00 2 0.00 94.01 0.00 0.00 0.00 0.00 0.00 3 0.00 94.01 220.00 0.00 0.00 0.00 0.00 4 0.00 333.25 526.83 0.00 0.00 0.00 0.00 5 0.00 427.26 746.83 0.00 0.00 0.00 0.00 6 0.00 350.79 554.56 123.24 0.00 0.00 0.00 7 0.00 350.79 554.56 0.00 0.00 0.00 0.00 8 0.00 17.54 27.73 0.00 0.00 0.00 0.00 9 0.00 0.00 0.00 123.24 0.00 0.00 0.00 10 357.00 1343.00 0.00 123.24 0.00 0.00 0.00 11 122.54 1343.00 0.00 0.00 16.02 107.22 131.25 12 122.54 1343.00 0.00 0.00 16.02 107.22 241.25 13 0.00 0.00 0.00 0.00 0.00 107.22 241.25 14 122.54 1343.00 0.00 0.00 16.02 0.00 0.00 15 122.54 1248.99 0.00 0.00 16.02 0.00 0.00 16 357.00 1343.00 0.00 0.00 0.00 0.00 0.00 17 0.00 0.00 0.00 0.00 0.00 0.00 110.00
Twenty more iterations show just how slowly the process
converges:
>> iter(20) Flow matrix row/col 1 2 3 4 5 6 7 1 0.00 0.00 220.00 0.00 0.00 0.00 0.00 2 0.00 94.01 0.00 0.00 0.00 0.00 0.00 3 0.00 94.01 220.00 0.00 0.00 0.00 0.00 4 0.00 490.27 545.20 0.00 0.00 0.00 0.00 5 0.00 584.28 765.20 0.00 0.00 0.00 0.00 6 0.00 516.07 573.89 127.53 0.00 0.00 0.00 7 0.00 516.07 573.89 0.00 0.00 0.00 0.00 8 0.00 25.80 28.69 0.00 0.00 0.00 0.00 9 0.00 0.00 0.00 127.53 0.00 0.00 0.00 10 357.00 1343.00 0.00 127.53 0.00 0.00 0.00 11 114.37 1343.00 0.00 0.00 16.58 110.95 135.82 12 114.37 1343.00 0.00 0.00 16.58 110.95 245.82 13 0.00 0.00 0.00 0.00 0.00 110.95 245.82 14 114.37 1343.00 0.00 0.00 16.58 0.00 0.00 15 114.37 1248.99 0.00 0.00 16.58 0.00 0.00 16 357.00 1343.00 0.00 0.00 0.00 0.00 0.00 17 0.00 0.00 0.00 0.00 0.00 0.00 110.00
The procedure described in the section on individual modules for
finding a scalar root of one equation is not easily generalized to
multiple equations and vector roots. One way that does work in many
problems is based on Wegstein's method described in the text starting
on page 280. Two functions similar to ssec1 and
ssec2 are named vweg1 and
vweg2. A more general procedure for "solving"
multiple simultaneous nonlinear equations may be found in MATLAB
using the fsolve function. A comparison of the using the two
approaches are:
We will illustrate vweg2 with two examples. The
inside function vweg1 makes a single "Wegstein"
step. The function vweg2 gives the following
information with help:
>> help vweg2 vweg2: vector solution of n equations in n unknowns using Wegstein's method function x=vweg2(v1,g,tmin,tmax,nmax,erc) Vector solution of n equations in n unknowns using the Wegstein method of finding roots Use VWEG1 to do each Wegstein step Argument Gives g a character vector naming a function that tells how to find a better value for the unknown vector x given an approximate set: v1. The vector must be called x in g. v1 the initial guess for x. tmin min allowed change in a step. tmax max allowed change in a step. nmax max iterations allowed. erc desired error. Typical (default) values are: nmax=10, erc=.001, tmax=5 and tmin=-10 You may give the function 2, 4 or 6 arguments. If you give it only two, the default values are used for the rest. If you give it 4, the default values for nmax and erc will be used. Example: >> vweg2(zeros(1,7),'g312(x)',-10,5,10,0.001) revised help by TYLC
Each Wegstein function is used with a character argument that tells
how to compute a better estimate for a vector x given an initial
value for that vector. Thus in using this method we must express the
function we want in the form:
x = g(x)
One example of this is Example Problem 5.16 in the text where we want
to determine the values for x1 and x2
satisfying:
x1 = 0.2x12 + 0.1x2 + 0.7 x2 = 0.5 + 2/(x1+3x2)
Our g(x) is readily recognized as the vector found for the two lines
of this pair of equations. In MATLAB this is given by:
function g=ex516(x) g=(.2*x(1)^2)+.1*x(2)+.7; g=[g,.5+2/(x(1)+3*x(2))];
The function vweg2 requires that we give an initial guess for the
vector unknown in its left argument. Guessing .5 for both elements we
find:
>> vweg2([.5 .5],'ex516(x)') ans = 0.9998 1.0000
If we want a higher accuracy, we can specify it by:
>> vweg2([.5 .5],'ex516(x)',-10,5,10,.0001) ans = 1.0000 1.0000
Now we will see that this works very well in the case of some
chemical system computations. The solution of Problem 3.12 that was
solved by iteration is readily done with vweg2. We
saved workspace ex312 for that purpose and just need to load
it and zero out the recycle stream:
>> load ex312 >> prntmx('Flow matrix',ns,6,2) Flow matrix row/col 1 2 3 4 5 6 7 1 3.00 0.00 0.00 0.00 0.00 0.00 0.00 2 0.00 2.20 9.60 0.00 0.00 0.00 0.00 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 7 0.00 0.00 0.00 0.00 0.00 0.00 0.00 8 0.18 0.00 2.82 0.00 0.00 0.00 0.00 >> ns(8,:)=zeros(1,7);
The function g312 performs a single loop around the
modules:
Note that in making the loop we start with a guessed vector of the
flows of all compounds in stream 8. At the end of the loop we hope we
have a better estimate for the flows in that stream. If we use 0 for
all flow rates in the stream we get:
>> g312(zeros(1,7)) ans = 0.1125 0 1.2966 0 0 0 0
exactly as we did before. A second iteration may also be done by hand
with the function g312:
>> g312(ns(8,:)) ans = 0.1547 0 1.9970 0 0 0 0
The function vweg2 may also be invoked to get the
result we found before after many iterations.
>> vweg2(zeros(1,7),'g312(x)',-10,5,10,.001) Warning: Divide by zero Warning: Divide by zero ans = 0.1800 0 2.8200 0 0 0 0
We see a couple of warnings about dividing by zero, but the desired
solution is found within the 10 iterations. Thus many fewer
iterations are required than by direct substitution.