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);

Result

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) )$

Result

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) )$

Result

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) )$

Result

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) )$

Result

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);

Result

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 )
)$

Result

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 )
)$

Result

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 )
)$

Result

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)
)$

Result

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*%;

Result

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);

Result

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) )$

Result

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) := ''%;

Result

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):= ''%;

Result

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) );

Result

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$

Result

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);

Result

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)
)$

Result

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(%);

Result

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(%);

Result

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);

Result

(%i42) diff(CES(x1, x2, b, rho),x1)/ diff(CES(x1, x2, b, rho),x2) ;

Result

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) );

Result

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(%);

Result

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);

Result

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) );

Result

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) );

Result

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) );

Result
Created with wxMaxima.
Edited with KompoZer.
PDF file produed by wnvhtml2pdf.