Problem 5.14.
A reversible chemical reaction 2A + B ⇄ C can be characterized by the equilibrium relationship 
where the nomenclature ci represents the concentration of constituent i. Suppose that we define a variable x as representing the number of moles of C that are produced. Conservation of mass can be used to reformulate the equilibrium relationship as 
where subscript 0 designates the initial concentration of each constituent. If K = 0.016, ca,0 = 42, cb,0 = 28, and cc,0 = 4, determine the value of x.
(a) Obtain the solution graphically.
(b) On the basis of (a), solve for the root with initial guesses of xl = 0 and xu = 20 to εs = 0.5%. Choose either bisection or false position to obtain your solution. Justify your choice. 
Solution:
(a) Firstly, substitute the parameters into the Eq.(5.14(b)) to obtain a single function in terms of x:
MATLAB can be used to plot the function:>> x = linspace(0,20);
>> f = 0.016-(4+x)./(((42-2*x).^2).*(28-x));
>> plot(x,f),grid,xlabel('x'),ylabel('f(x)')
A visual inspection of the plot gives a rough estimate of the root, which is about 15.9 moles. The validity of the graphical estimate can be checked by substituting it into f(x) to yield:
>> f = 0.016-(4+15.9)./((42-2*15.9).^2.*(28-15.9))
f =
   1.9235e-04
which is close to zero. 
(b) In this case, I will choose bisection to solve the problem. This is because false-position is not suitable to find root for a function with significant curvature, as it would lead to poor and slow convergence. We can use bisect M-file below to solve for x:
function [root,fx,ea,iter]=bisect(func,xl,xu,es,maxit,varargin)
%bisect:root location zeroes
% [root,fx,ea,iter]=bisect(func,xl,xu,es,maxit,p1,p2,...):
%   uses bisection method to find the root of func
% varargin = variable number of arguments, can input any number of
% arguments in the func
%input:
%  func:name of function
%  xl,xu=lower and upper guesses
%  es=desired relative error(default=0.0001%)
%  maxit=maximum allowable iterations(default=50)
%  p1,p2,...=additional parameters used by func
%output:
%  root=real root
%  fx=function value at root
%  ea=approximate relative error(%)
%  iter=number of iterations 
if nargin<3,error('at least 3 input arguments required'),end
test = func(xl,varargin{:})*func(xu,varargin{:});
if test>0, error('no sign change'),end
if nargin<4||isempty(es),es=0.0001;end
if nargin<5||isempty(maxit),maxit=50;end
iter=0;xr=xl;ea=100;
while(1)
    xrold=xr;
    xr=(xl+xu)/2;
    iter=iter+1;
    if xr~=0,ea=abs((xr-xrold)/xr)*100;end 
    test=func(xl,varargin{:})*func(xr,varargin{:});
    if test<0
        xu=xr;
    elseif test>0
        xl=xr;
    else
        ea=0;
    end
    if ea<=es||iter>=maxit,break,end
end
root=xr;fx=func(xr,varargin{:});
Plug in the given initial guesses and stopping criterion:
>> f = @(x)0.016-(4+x)./((42-2*x).^2.*(28-x));
>> [root,fx,ea,iter]=bisect(f,0,20,0.5)
root =
   15.8594
fx =
   5.2493e-04
ea =
    0.4926
iter =
     8
Thus, after eight iterations, the x is computed as 15.8594 moles with an approximate relative error of 0.4926%. 
**Additional: Or else we can also use the MATLAB fzero function:
>> f = @(x)0.016-(4+x)./((42-2*x).^2.*(28-x));
>> x = fzero(f,[0,20])
x =
   15.9230
which gives the exact value of 15.9230 moles. 




 
 
No comments:
Post a Comment