Difference between revisions of "Tutorial 2 - 2010"

From Process Model Formulation and Solution: 3E4
Jump to navigation Jump to search
m (Created page with "{{OtherSidebar | due_dates = 22 September 2010 | dates_alt_text = Due date(s) | questions_PDF = Tutorial-2-2010.pdf | questions_text_alt = Tutorial questions | solutions_PDF = |...")
 
m
 
(2 intermediate revisions by the same user not shown)
Line 3: Line 3:
| dates_alt_text = Due date(s)
| dates_alt_text = Due date(s)
| questions_PDF = Tutorial-2-2010.pdf
| questions_PDF = Tutorial-2-2010.pdf
| questions_text_alt = Tutorial questions
| questions_text_alt = Tutorial questions (updated)
| solutions_PDF =  
| solutions_PDF =  
| solutions_text_alt =  
| solutions_text_alt =  
Line 10: Line 10:


<rst>
<rst>
<rst-options = {'toc': False, 'reset-figures': False} />
<rst-options: 'toc' = False/>
<rst-options: 'reset-figures' = False/>


.. |m3| replace:: m\ :sup:`3`
.. |m3| replace:: m\ :sup:`3`
Line 126: Line 127:
[min_error, min_index] = min(errors(:))
[min_error, min_index] = min(errors(:))
[index_n, index_p, index_q] = ind2sub([num, num, num], min_index);
[index_n, index_p, index_q] = ind2sub([num, num, num], min_index);
[n, p, q] = [vector(index_n), vector(index_p), vector(index_q)]
disp(['Solution at ', num2str([vector(index_n), vector(index_p), vector(index_q)])])
print(n, p, q)
 



Latest revision as of 02:52, 12 October 2010

Due date(s): 22 September 2010
Nuvola mimetypes pdf.png (PDF) Tutorial questions (updated)
Other instructions Hand-in at class.

<rst> <rst-options: 'toc' = False/> <rst-options: 'reset-figures' = False/>

.. |m3| replace:: m\ :sup:`3` .. highlight:: python

.. rubric:: Tutorial objectives

- Some questions to help you feel comfortable deriving model equations for actual chemical engineering systems. - Brute force solving of equation systems. The rest of the course will focus on better ways to solve these equations. - Interpreting source code written on paper.

.. rubric:: Recap of tutorial rules

  • Tutorials can be done in groups of two - please take advantage of this to learn with each other.
  • Tutorials must be handed in at the start of class on Wednesday. No electronic submissions - thanks!

Question 1 [2]

===

.. note::

Parts 1 and 2 of this question were from the 2006 final exam (slightly modified). It was worth 10% of the 3 hour exam

Consider a mixing tank with fluid volume :math:`V` where fluids A and B with densities :math:`\rho_A` and :math:`\rho_b`, specific heat capacities :math:`C_{p,A}`, :math:`C_{p,B}` and temperatures :math:`T_A` and :math:`T_B` are the inlet streams at volumetric flow rates :math:`F_A` and :math:`F_B`. The outlet stream is at a flow rate :math:`F_A+F_B`. The specific heat capacity and density of the outlet streams is given by :math:`C_p=(C_{p,A}F_A+C_{p,B}F_B)/F` and :math:`\rho=(\rho_AF_A+\rho_BF_B)/F`. The fluid also looses heat from the tank at a rate :math:`q=k_T(T-T_\text{wall})` where :math:`T_\text{wall}` is the constant tank wall temperature, :math:`k_T` is a constant and :math:`T` denotes the current fluid temperature.

  1. . Using 3-step modelling approach shown in class, derive a dynamical balance describing the time-dependent exit stream temperature.
  2. . Can the steady state exit stream temperature be higher than both :math:`T_A` and :math:`T_B`? Explain.
  3. . Calculate, *by-hand*, the steady-state exit temperature, using that

* :math:`V` = 10 |m3| * :math:`\rho_A` = 1200 kg/\ |m3| and :math:`\rho_b` = 950 kg/\ |m3| * :math:`C_{p,A}` = 2440 J/(kg.K) and :math:`C_{p,B}` = 3950 J/(kg.K) * :math:`T_A` = 320 K and :math:`T_B` = 350 K and :math:`T_\text{wall}` = 300K * :math:`F_A = F_B` = 0.05 |m3|/s * :math:`k_T` = 200 W/(m\ :sup:`2`.K) :math:`\times` 24 m\ :sup:`2` = 4800 W/K

Question 2 [2]

=====

.. note:: You don't need to write any code for this question.

Consider the reaction

.. math:: {\sf P_2I_4} + n\,{\sf P_4} + p\,{\sf H_2O} \longrightarrow 4\,{\sf PH_4I} + q\,{\sf H_3PO_4} where :math:`n`, :math:`p` and :math:`q` denote the stoichiometric coefficients for :math:`\sf P_4`, :math:`\sf H_2O` and :math:`\sf H_3PO_4` respectively.

  1. . Derive the equations necessary to solve for :math:`n, p`, and :math:`q` by equating atoms of :math:`{\sf P}`, :math:`{\sf H}`, and :math:`{\sf O}` on the reactant and product sides.
  2. . In the next section of the course we will use Guass Elimination to solve these equations. For now though, let's describe a brute force approach. First, complete the two lines of this MATLAB function:

.. code-block:: matlab

function total_error = equation_error( n, p, q )

% Given the values of n, p, and q, calculate the error of each balance equation. % Returns the sum of squares of the errors.

error_1 = _______________  % from the P-balance error_2 = 2*p - 3*q - 16;  % from the H-balance error_3 = _______________  % from the O-balance

total_error = (error_1)^2 + (error_2)^2 + (error_3)^2;

end  % end of function

or complete this Python function:

.. code-block:: python

def equation_error(n, p, q ): """ Given the values of n, p, and q, calculate the error of each of the 3 equations. Returns the sum of squares of the errors. """ error_1 = _______________ error_2 = 2*p - 3*q - 16 error_3 = _______________

return error_1**2 + error_2**2 + error_3**2

  1. . Since we known that :math:`n, p`, and :math:`q` must be positive, we can construct a set of 3 nested for-loops, as shown below in MATLAB and Python. Describe in plain English what the code does.

**In MATLAB:**

.. code-block:: matlab

smallest = 0.0; largest = 14.9; step_size = 0.1; vector = smallest : step_size : largest;

% How many elements in each vector? num = length(vector);

errors = zeros(num, num, num);

index_n = 0; index_p = 0; index_q = 0; for n = smallest : step_size : largest index_n = index_n + 1; for p = smallest : step_size : largest index_p = index_p + 1; for q = smallest : step_size : largest index_q = index_q + 1;

 % Calculate the error at this value of n, p and q: errors(index_n, index_p, index_q) = equation_error(n, p, q);

end index_q = 0; end index_p = 0; end [min_error, min_index] = min(errors(:)) [index_n, index_p, index_q] = ind2sub([num, num, num], min_index); disp(['Solution at ', num2str([vector(index_n), vector(index_p), vector(index_q)])])


**In Python:**

.. code-block:: python

import numpy as np

smallest = 0.0 largest = 15.0 step_size = 0.1 vector = np.arange(smallest, largest, step_size)

# How many elements in each vector? num = len(vector)

errors = np.zeros( (num, num, num) )

for index_n, n in enumerate(vector): for index_p, p in enumerate(vector): for index_q, q in enumerate(vector):

# Calculate the error at this value of n, p and q: errors[index_n, index_p, index_q] = equation_error(n, p, q)

# Which combination had the smallest error? min_index = np.argmin(errors) index_n, index_p, index_q = np.unravel_index(min_index, (num, num, num)) n, p, q = vector[index_n], vector[index_p], vector[index_q] print(n, p, q)

4. How many times will the function ``equation_error`` be called? 5. What will this function output be if :math:`(n, p, q) = (1.0, 9.2, 2.5)`?

Bonus question [0.5]

=========

Using the code given in question 2, report what the ``min_index`` variable is and what are the values of :math:`n, p`, and :math:`q` which give minimum error to the set of equations. How long did it take to find the solution of this simple linear equation system?

.. raw:: latex

\vspace{0.25cm} \hrule %\begin{center}END\end{center}

</rst>