Next: , Previous: Algebra Tutorial, Up: Algebra Tutorial

2.5.1 Basic Algebra

If you enter a formula in Algebraic mode that refers to variables, the formula itself is pushed onto the stack. You can manipulate formulas as regular data objects.

     1:  2 x^2 - 6       1:  6 - 2 x^2       1:  (3 x^2 + y) (6 - 2 x^2)
         .                   .                   .
     
         ' 2x^2-6 <RET>        n                   ' 3x^2+y <RET> *

(•) Exercise 1. Do ' x <RET> Q 2 ^ and ' x <RET> 2 ^ Q both wind up with the same result (‘x’)? Why or why not? See 1. (•)

There are also commands for doing common algebraic operations on formulas. Continuing with the formula from the last example,

     1:  18 x^2 - 6 x^4 + 6 y - 2 y x^2    1:  (18 - 2 y) x^2 - 6 x^4 + 6 y
         .                                     .
     
         a x                                   a c x <RET>

First we “expand” using the distributive law, then we “collect” terms involving like powers of ‘x’.

Let's find the value of this expression when ‘x’ is 2 and ‘y’ is one-half.

     1:  17 x^2 - 6 x^4 + 3      1:  -25
         .                           .
     
         1:2 s l y <RET>               2 s l x <RET>

The s l command means “let”; it takes a number from the top of the stack and temporarily assigns it as the value of the variable you specify. It then evaluates (as if by the = key) the next expression on the stack. After this command, the variable goes back to its original value, if any.

(An earlier exercise in this tutorial involved storing a value in the variable x; if this value is still there, you will have to unstore it with s u x <RET> before the above example will work properly.)

Let's find the maximum value of our original expression when ‘y’ is one-half and ‘x’ ranges over all possible values. We can do this by taking the derivative with respect to ‘x’ and examining values of ‘x’ for which the derivative is zero. If the second derivative of the function at that value of ‘x’ is negative, the function has a local maximum there.

     1:  17 x^2 - 6 x^4 + 3      1:  34 x - 24 x^3
         .                           .
     
         U <DEL>  s 1                  a d x <RET>   s 2

Well, the derivative is clearly zero when ‘x’ is zero. To find the other root(s), let's divide through by ‘x’ and then solve:

     1:  (34 x - 24 x^3) / x    1:  34 - 24 x^2
         .                          .
     
         ' x <RET> /                  a x

     1:  0.70588 x^2 = 1        1:  x = 1.19023
         .                          .
     
         0 a =  s 3                 a S x <RET>

Now we compute the second derivative and plug in our values of ‘x’:

     1:  1.19023        2:  1.19023         2:  1.19023
         .              1:  34 x - 24 x^3   1:  34 - 72 x^2
                            .                   .
     
         a .                r 2                 a d x <RET> s 4

(The a . command extracts just the righthand side of an equation. Another method would have been to use v u to unpack the equation ‘x = 1.19 to ‘x’ and ‘1.19’, then use M-- M-2 <DEL> to delete the ‘x’.)

     2:  34 - 72 x^2   1:  -68.         2:  34 - 72 x^2     1:  34
     1:  1.19023           .            1:  0                   .
         .                                  .
     
         <TAB>               s l x <RET>        U <DEL> 0             s l x <RET>

The first of these second derivatives is negative, so we know the function has a maximum value at ‘x = 1.19023’. (The function also has a local minimum at ‘x = 0’.)

When we solved for ‘x’, we got only one value even though ‘0.70588 x^2 = 1’ is a quadratic equation that ought to have two solutions. The reason is that a S normally returns a single “principal” solution. If it needs to come up with an arbitrary sign (as occurs in the quadratic formula) it picks ‘+’. If it needs an arbitrary integer, it picks zero. We can get a full solution by pressing H (the Hyperbolic flag) before a S.

     1:  0.70588 x^2 = 1    1:  x = 1.19023 s1      1:  x = -1.19023
         .                      .                       .
     
         r 3                    H a S x <RET>  s 5        1 n  s l s1 <RET>

Calc has invented the variable ‘s1’ to represent an unknown sign; it is supposed to be either +1 or -1. Here we have used the “let” command to evaluate the expression when the sign is negative. If we plugged this into our second derivative we would get the same, negative, answer, so ‘x = -1.19023’ is also a maximum.

To find the actual maximum value, we must plug our two values of ‘x’ into the original formula.

     2:  17 x^2 - 6 x^4 + 3    1:  24.08333 s1^2 - 12.04166 s1^4 + 3
     1:  x = 1.19023 s1            .
         .
     
         r 1 r 5                   s l <RET>

(Here we see another way to use s l; if its input is an equation with a variable on the lefthand side, then s l treats the equation like an assignment to that variable if you don't give a variable name.)

It's clear that this will have the same value for either sign of s1, but let's work it out anyway, just for the exercise:

     2:  [-1, 1]              1:  [15.04166, 15.04166]
     1:  24.08333 s1^2 ...        .
         .
     
       [ 1 n , 1 ] <TAB>            V M $ <RET>

Here we have used a vector mapping operation to evaluate the function at several values of ‘s1’ at once. V M $ is like V M ' except that it takes the formula from the top of the stack. The formula is interpreted as a function to apply across the vector at the next-to-top stack level. Since a formula on the stack can't contain ‘$’ signs, Calc assumes the variables in the formula stand for different arguments. It prompts you for an argument list, giving the list of all variables in the formula in alphabetical order as the default list. In this case the default is ‘(s1)’, which is just what we want so we simply press <RET> at the prompt.

If there had been several different values, we could have used V R X to find the global maximum.

Calc has a built-in a P command that solves an equation using H a S and returns a vector of all the solutions. It simply automates the job we just did by hand. Applied to our original cubic polynomial, it would produce the vector of solutions ‘[1.19023, -1.19023, 0]’. (There is also an a X command which finds a local maximum of a function. It uses a numerical search method rather than examining the derivatives, and thus requires you to provide some kind of initial guess to show it where to look.)

(•) Exercise 2. Given a vector of the roots of a polynomial (such as the output of an a P command), what sequence of commands would you use to reconstruct the original polynomial? (The answer will be unique to within a constant multiple; choose the solution where the leading coefficient is one.) See 2. (•)

The m s command enables Symbolic mode, in which formulas like ‘sqrt(5)’ that can't be evaluated exactly are left in symbolic form rather than giving a floating-point approximate answer. Fraction mode (m f) is also useful when doing algebra.

     2:  34 x - 24 x^3        2:  34 x - 24 x^3
     1:  34 x - 24 x^3        1:  [sqrt(51) / 6, sqrt(51) / -6, 0]
         .                        .
     
         r 2  <RET>     m s  m f    a P x <RET>

One more mode that makes reading formulas easier is Big mode.

                    3
     2:  34 x - 24 x
     
           ____   ____
          V 51   V 51
     1:  [-----, -----, 0]
            6     -6
     
         .
     
         d B

Here things like powers, square roots, and quotients and fractions are displayed in a two-dimensional pictorial form. Calc has other language modes as well, such as C mode, FORTRAN mode, TeX mode and LaTeX mode.

     2:  34*x - 24*pow(x, 3)               2:  34*x - 24*x**3
     1:  {sqrt(51) / 6, sqrt(51) / -6, 0}  1:  /sqrt(51) / 6, sqrt(51) / -6, 0/
         .                                     .
     
         d C                                   d F

     3:  34 x - 24 x^3
     2:  [{\sqrt{51} \over 6}, {\sqrt{51} \over -6}, 0]
     1:  {2 \over 3} \sqrt{5}
         .
     
         d T   ' 2 \sqrt{5} \over 3 <RET>

As you can see, language modes affect both entry and display of formulas. They affect such things as the names used for built-in functions, the set of arithmetic operators and their precedences, and notations for vectors and matrices.

Notice that ‘sqrt(51)’ may cause problems with older implementations of C and FORTRAN, which would require something more like ‘sqrt(51.0)’. It is always wise to check over the formulas produced by the various language modes to make sure they are fully correct.

Type m s, m f, and d N to reset these modes. (You may prefer to remain in Big mode, but all the examples in the tutorial are shown in normal mode.)

What is the area under the portion of this curve from ‘x = 1’ to ‘2’? This is simply the integral of the function:

     1:  17 x^2 - 6 x^4 + 3     1:  5.6666 x^3 - 1.2 x^5 + 3 x
         .                          .
     
         r 1                        a i x

We want to evaluate this at our two values for ‘x’ and subtract. One way to do it is again with vector mapping and reduction:

     2:  [2, 1]            1:  [12.93333, 7.46666]    1:  5.46666
     1:  5.6666 x^3 ...        .                          .
     
        [ 2 , 1 ] <TAB>          V M $ <RET>                  V R -

(•) Exercise 3. Find the integral from 1 to ‘y’ of x sin(pi x) (where the sine is calculated in radians). Find the values of the integral for integers ‘y’ from 1 to 5. See 3. (•)

Calc's integrator can do many simple integrals symbolically, but many others are beyond its capabilities. Suppose we wish to find the area under the curve sin(x) ln(x)’ over the same range of ‘x’. If you entered this formula and typed a i x <RET> (don't bother to try this), Calc would work for a long time but would be unable to find a solution. In fact, there is no closed-form solution to this integral. Now what do we do?

One approach would be to do the integral numerically. It is not hard to do this by hand using vector mapping and reduction. It is rather slow, though, since the sine and logarithm functions take a long time. We can save some time by reducing the working precision.

     3:  10                  1:  [1, 1.1, 1.2,  ...  , 1.8, 1.9]
     2:  1                       .
     1:  0.1
         .
     
      10 <RET> 1 <RET> .1 <RET>        C-u v x

(Note that we have used the extended version of v x; we could also have used plain v x as follows: v x 10 <RET> 9 + .1 *.)

     2:  [1, 1.1, ... ]              1:  [0., 0.084941, 0.16993, ... ]
     1:  ln(x) sin(x)                    .
         .
     
         ' sin(x) ln(x) <RET>  s 1    m r  p 5 <RET>   V M $ <RET>

     1:  3.4195     0.34195
         .          .
     
         V R +      0.1 *

(If you got wildly different results, did you remember to switch to Radians mode?)

Here we have divided the curve into ten segments of equal width; approximating these segments as rectangular boxes (i.e., assuming the curve is nearly flat at that resolution), we compute the areas of the boxes (height times width), then sum the areas. (It is faster to sum first, then multiply by the width, since the width is the same for every box.)

The true value of this integral turns out to be about 0.374, so we're not doing too well. Let's try another approach.

     1:  ln(x) sin(x)    1:  0.84147 x + 0.11957 (x - 1)^2 - ...
         .                   .
     
         r 1                 a t x=1 <RET> 4 <RET>

Here we have computed the Taylor series expansion of the function about the point ‘x=1’. We can now integrate this polynomial approximation, since polynomials are easy to integrate.

     1:  0.42074 x^2 + ...    1:  [-0.0446, -0.42073]      1:  0.3761
         .                        .                            .
     
         a i x <RET>            [ 2 , 1 ] <TAB>  V M $ <RET>         V R -

Better! By increasing the precision and/or asking for more terms in the Taylor series, we can get a result as accurate as we like. (Taylor series converge better away from singularities in the function such as the one at ln(0), so it would also help to expand the series about the points ‘x=2’ or ‘x=1.5’ instead of ‘x=1’.)

(•) Exercise 4. Our first method approximated the curve by stairsteps of width 0.1; the total area was then the sum of the areas of the rectangles under these stairsteps. Our second method approximated the function by a polynomial, which turned out to be a better approximation than stairsteps. A third method is Simpson's rule, which is like the stairstep method except that the steps are not required to be flat. Simpson's rule boils down to the formula,

     (h/3) * (f(a) + 4 f(a+h) + 2 f(a+2h) + 4 f(a+3h) + ...
                   + 2 f(a+(n-2)*h) + 4 f(a+(n-1)*h) + f(a+n*h))

where ‘n’ (which must be even) is the number of slices and ‘h’ is the width of each slice. These are 10 and 0.1 in our example. For reference, here is the corresponding formula for the stairstep method:

     h * (f(a) + f(a+h) + f(a+2h) + f(a+3h) + ...
               + f(a+(n-2)*h) + f(a+(n-1)*h))

Compute the integral from 1 to 2 of sin(x) ln(x)’ using Simpson's rule with 10 slices. See 4. (•)

Calc has a built-in a I command for doing numerical integration. It uses Romberg's method, which is a more sophisticated cousin of Simpson's rule. In particular, it knows how to keep refining the result until the current precision is satisfied.

Aside from the commands we've seen so far, Calc also provides a large set of commands for operating on parts of formulas. You indicate the desired sub-formula by placing the cursor on any part of the formula before giving a selection command. Selections won't be covered in the tutorial; see Selecting Subformulas, for details and examples.