Technology
This notebook is based on "Technology" by Hal Varian, 1992. URL: http://library.wolfram.com/infocenter/MathSource/551/
1 Cobb-Douglas Production Functions
Cobb-Douglas functions are used to illustrate both production and
consumer models. This workbook provides a first look at this function.
The level of production (or utility) is z (lower-case; case matters), a
function of the levels of inputs x1 and x2 and the parameters a and b.
[The ratprint:false and fpprintprec:5 commands affect the appearance of
some output. They can be omitted without affecting the analysis.]
(%i55) |
kill(all)$ ratprint:false$ fpprintprec:5$ z(x1, x2, a, b):= a*x1^b*x2^(1-b); |
The graph below shows output for combinations of x1 and x2 over the range 0 through 10. The x1 (x) label is labeled; other labels are suppressed to reduce clutter. Also, the ztics are limited to increments of 5 to reduce clutter. The view is selected such that the origin is near the viewer.
(%i4) |
wxdraw3d(view = [65,300],xlabel ="x1",ztics = 5, explicit(z(x1,x2,1,0.5),x1,0,10,x2,0,10) )$ |
We can animate the graph to see how the value of b affects the
appearance of the surface. Doing so requires that we add a counter (b
in this case) and a makelist( ) command to create a list of values. The
title is added so that the value of b is easily associated with the
surface's shape as the animation proceeds.
Maxima draws a set of figures and stores them. Once this is done, click
on the graph. A border will highlight it. Then any of three methods can
be used to animate the figure:
The mouse scroll wheel will change b,
Clicking on the right triangle in the tool bar above will cause automated animation, or
The scroll bar on the tool bar can be used to control animation.
(%i5) |
with_slider_draw3d( b, makelist(0.1*i,i,2, 8), title =concat("z, when b = ",b), view = [65,300],xlabel ="x1",ztics = 5, explicit(z(x1,x2,1,b),x1,0,10,x2,0,10) )$ |
The figure is repeated below with contour lines added. These appear on both the surface and the base. The projections on the base are segments of three isoquants.
(%i6) |
wxdraw3d(view = [65,300],xlabel ="x1",ztics = 5, color=gray,contour=both, contour_levels={2, 5, 8}, explicit(z(x1,x2,1,0.5),x1,0,10,x2,0,10) )$ |
We can limit our view to the base, getting a better view of the isoquants.
(%i7) |
wxdraw3d(view = [65,300],xlabel ="x1",ztics = 5, ylabel="x2", contour=map, contour_levels={2, 5, 8}, explicit(z(x1,x2,1,0.5),x1,0,10,x2,0,10) )$ |
2 The Leontieff Production Function
A two-factor Leontieff production function, zL, appears here, along with two output levels given the same input mix but different production coefficients.
(%i8) |
zL(x1, x2, a, b) := min(a*x1, b*x2); zL(5, 5, 1, 2); zL(5, 5, 2, 2); |
The graph below shows isoquants for an output level of 5 units, given two different sets of parameter values. The second production function is more efficient.
(%i11) |
wxdraw2d(xlabel="x1",ylabel ="x2", key = "zL = 5, 1st technology", implicit( zL(x1,x2, 1, 2) - 5, x1, 1, 10, x2, 1, 10 ), color = black, key = "zL = 5, 2nd technology", implicit( zL(x1,x2, 2, 3)- 5, x1, 1, 10, x2, 1, 10 ) )$ |
Again, two isoquants for zL = 5 are shown. In this case, one cannot judge which is the more efficient technology without more information (specifically, information about the relative opportunity costs of the two factors.)
(%i12) |
wxdraw2d(xlabel="x1",ylabel ="x2", key = "zL = 5, 1st technology", implicit( min(x1, 2*x2)- 5, x1, 1, 10, x2, 1, 10 ), color = black, key = "zL = 5, 2nd technology", implicit( min(2*x1, 1.5*x2)- 5, x1, 1, 10, x2, 1, 10 ) )$ |
The next cell shows an isoquant when the two technologies can be combined, with any amount of either factor being combined using either of the two technologies.
(%i13) |
wxdraw2d(xlabel="x1",ylabel ="x2", key = "zL = 5, combined technology", implicit( (min(x1, 2*x2)+ min(2*x1, 1.5*x2)) - 5, x1, 1, 5, x2, 1, 5 ) )$ |
The graph below shows two isoquants when the same two production technologies can be combined.
(%i14) |
wxdraw2d(xlabel="x1",ylabel ="x2", key = "zL = 5, combined technology", implicit( (min(x1, 2*x2)+ min(2*x1, 1.5*x2)) - 5, x1, 1, 8, x2, 1, 8 ), color = black, xlabel="x1",ylabel ="x2", key = "zL = 10, combined technology", implicit( (min(x1, 2*x2)+ min(2*x1, 1.5*x2)) - 10, x1, 1, 8, x2, 1, 8 ), line_type=dots, key="", explicit((4/3)*x,x,0,6), explicit(x/2,x,0,8) )$ |
The graph above suggests that the production function exhibits constant
returns to scale (it does--prove it). We can produce an isoquant (or a
set of them) that corresponds roughly to the Cobb-Douglas isoquant (or
that of any other constant-returns-to-scale production function).
Suppose that z = x1^b*x2^(1-b) (i. e., a = 1). Further, suppose that x1
and x2 can be combined in any of four ratios: x2=0.1*x1, x2 = 0.5*x1,
x2 = 2*x1, and x2 = 9*x1, but in no other combination. Let z = zL = 1.
Let b = 0.6. With these values, x1 = 1/k^(2/5) and x2 = k^(3/5).
[This is a case of the more general result that x1 = 1/( k^(1-b)) and x2 = k^b.]
(%i15) |
solve(z(x1, k*x1, 1, 0.6)=1, x1); k*%; |
The next cell generates a list of the four values for k and then computes values of x1 and x2 that correspond to the k values.
[As a check, the x2 values are created in to equivalent ways.]
(%i17) |
kList : [0.1, 0.5, 2.0, 9.0]; x1List: 1/kList^(2/5); x2List: kList*x1List; /*check*/ kList^(3/5); |
The graph below shows the four points and the line segments that represent the
unit isoquant for this Leontieff production function. The unit isoquant
for the Cobb-Douglas function appears for comparison.
[The vertical section for which additional x2 is superfluous and its horizontal counterpart are omitted.]
(%i21) |
wxdraw2d( xrange=[0,3],yrange=[0,4], xlabel="x1", ylabel="x2", points_joined=true, key = "Leontieff Unit Isoquant", points(x1List, x2List),line_type=dots, key = "Cobb-Douglas Unit Isoquant",color = black, implicit(z(x1,x2,1,0.6)-1, x1,0,4,x2,0,5) )$ |
3 The Rate of Technical Substitution
The marginal rate of technical substitution (mtrs) is the slope of an isoquant at a given point (x1, x2). We can determine that the mtrs for the Cobb-Douglas production function equals (b/(1-b))*(x2/x1).
(%i22) |
z(x1, x2, a, b); D1 : diff(z(x1,x2,a, b),x1); D2 : diff(z(x1,x2,a, b),x2); D1/D2$ mrts(x1,x2,a,b) := ''%; |
We now draw lines with the slopes defined above that pass through ten points on the z = 10 isoquant (any isoquant would serve). Let a = 1 and b = 0.6 as above. The function below solves for x2 as a function of x1.
(%i27) |
solve(z(x1,x2,1,0.6)-10,x2); rhs(%[1])$ x2val(x1):= ''%; |
The function just defined is used to create a list of x2 values, given the list of x1 values. The x1 and X2 values are then entered into the function for the mrts to generate a list of values.
(%i30) |
x1List: makelist(i,i,1,10); x2List: float( x2val(x1List) ); mrtsList: float( mrts(x1List,x2List,1, 0.6) ); |
The output below confirms that z = 10 at each (x1, x2) pair determined above.
(%i33) |
for i:1 thru 10 do display(z(x1List[i],x2List[i],1,0.6)), i: i+1$ |
The next cell generates a functional expression for a line passing through each of the points above, with the slope equal to the mrts.
(%i34) |
line(x1, i) := x2List[i] - mrtsList[i]*(x1 - x1List[i])$ line(x1, 2); |
The graph below shows that a collection of these lines produces a figure that closely resembles the isoquant for z = 10. The z = 11 isoquant is added for comparison.
[Exercise: Run this set of commands again, replacing 11 with 10.]
(%i36) |
wxdraw2d(xlabel="x1",ylabel="y1", yrange=[0, 300], dimensions = [480, 480], explicit(line(x,1),x,0,20), explicit(line(x,2),x,0,20), explicit(line(x,3),x,0,20), explicit(line(x,4),x,0,20), explicit(line(x,5),x,0,20), explicit(line(x,6),x,0,20), explicit(line(x,7),x,0,20), explicit(line(x,8),x,0,20), explicit(line(x,9),x,0,20), explicit(line(x,10),x,0,20), line_type=dots, color = black, key = "z = 11, to compare", ip_grid=[100,100], implicit(z(x1,x2,1,0.6)-11,x1,.0001,25,x2,0.0001, 300) )$ |
4 Homothetic and Homogeneous Functions
The formula for the tangent lines for a
homothetic function, the mrts values, depend only on the ratio x1/x2.
The previous section shows that Cobb-Douglas functions have this
characteristic.
A subset of homothetic functions are homogeneous. We see below that the
Cobb-Douglas function is homogeneous, and that the degree of
homogeneity is 1.
[The rad1can, for radical canonical) command converts the expression to
"a form which is canonical over a large class of expressions..."(from
the Maxima manual)].
(%i37) | z(m*x1,m*x2,a,b)/z(x1,x2,a,b); radcan(%); |
A "generalized" Cobb-Douglas function does not impose unity on the sum of the exponents. As the cell below shows, this function is still homogeneous. The degree of homogeneity equals the sum of the function's exponents.
(%i39) | (a*(m*x1)^b1*(m*x2)^b2) / (a*x1^b1*x2^b2); radcan(%); |
Consider the more general constant-elasticity-of-substitution (CES) function, which the next section addresses more fully.
(%i41) | CES(x1, x2, b, rho) := (b*x1^-rho + (1-b)*x2^-rho)^(-1/rho); |
(%i42) | diff(CES(x1, x2, b, rho),x1)/ diff(CES(x1, x2, b, rho),x2) ; |
This expression is easily restated as (b/(1-b)*(x2/x1)^(1+rho), so the CES function is homothetic. The cell below shows that it is also homogeneous, of degree 1.
(%i43) | radcan( CES(m*x1, m*x2, b, rho)/CES(x1, x2, b, rho) ); |
5 The CES Function
The CES function, introduced above, generalizes the Cobb-Douglas function, for which the elasticity of substitution between inputs is 1. The elasticity of substitution for the CES function is Ep = 1/(1 + rho), so if Ep = 1 implies a value rho = 0. The CES function cannot be evaluated directly when rho = 0, but the limit of this function as rho approaches zero can be determined. The cell below shows that, the limiting case of the CES is Cobb-Douglas.
(%i44) | limit(CES(x1,x2,b,rho),rho,0); radcan(%); |
The elasticity of substitution in the CES function, which we label Esub here, is related to rho as follows: Esub = 1/(1+rho). We are more likely to be interested in (or have some knowledge regarding) Esub, so we rephrase rho as a function of Esub for use below.
(%i46) | solve(Esub=1/(1+rho),rho); |
The table below shows a representative set of Esub values and the implied rho values. We avoid the case in which Esub = 1. Why?
(%i47) |
EsubList: makelist(.1*i,i,1,41,5)$ rhoList: (1 - EsubList)/EsubList$ matrix(cons("Esub",EsubList),cons("rho",rhoList) ); |
The cell below produces an animation. The initial value of Esub is 0.1.
The CES isoquant looks much like its Leontieff counterpart when Esub is
this small. Animate this graph and confirm that the isoquant intersects
both axes when Esub > 1. What does this imply?
[Using squares to generate Esub values reduces the number of steps to
get a range of values, thereby accelerating the computation process.]
(%i50) |
b0: 0.5$ with_slider_draw( Esub, makelist(.1*i^2,i,1,5), title = concat("b =", string(b0)," and Esub =", string(Esub)), implicit( CES(x1,x2,b0,(1-Esub)/Esub)- 5,x1,.01,30,x2,0.01,30) ); |
Now we fix Esub and explore the effect of changing b.
(%i52) |
Esub0: 0.75$ with_slider_draw( b, makelist(.15*i,i,1,6), title = concat("Esub =", string(Esub0)," and b =", string(b)), implicit( CES(x1,x2,b,(1-Esub0)/Esub0)- 5,x1,.01,30,x2,0.01,30) ); |