| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section covers the Calc features that help you work with algebraic formulas. First, the general sub-formula selection mechanism is described; this works in conjunction with any Calc commands. Then, commands for specific algebraic operations are described. Finally, the flexible rewrite rule mechanism is discussed.
The algebraic commands use the a key prefix; selection commands use the j (for "just a letter that wasn't used for anything else") prefix.
See section 7.2 Editing Stack Entries, to see how to manipulate formulas using regular Emacs editing commands.
When doing algebraic work, you may find several of the Calculator's modes to be helpful, including algebraic-simplification mode (m A) or no-simplification mode (m O), algebraic-entry mode (m a), fraction mode (m f), and symbolic mode (m s). See section 8. Mode Settings, for discussions of these modes. You may also wish to select "big" display mode (d B). See section 8.8.1 Normal Language Modes.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When working with an algebraic formula it is often necessary to manipulate a portion of the formula rather than the formula as a whole. Calc allows you to "select" a portion of any formula on the stack. Commands which would normally operate on that stack entry will now operate only on the sub-formula, leaving the surrounding part of the stack entry alone.
One common non-algebraic use for selection involves vectors. To work on one element of a vector in-place, simply select that element as a "sub-formula" of the vector.
| 12.1.1 Making Selections | ||
| 12.1.2 Changing Selections | ||
| 12.1.3 Displaying Selections | ||
| 12.1.4 Operating on Selections | ||
| 12.1.5 Rearranging Formulas using Selections |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
To select a sub-formula, move the Emacs cursor to any character in that
sub-formula, and press j s (calc-select-here). Calc will
highlight the smallest portion of the formula that contains that
character. By default the sub-formula is highlighted by blanking out
all of the rest of the formula with dots. Selection works in any
display mode but is perhaps easiest in "big" (d B) mode.
Suppose you enter the following formula:
3 ___
(a + b) + V c
1: ---------------
2 x + 1
|
(by typing ' ((a+b)^3 + sqrt(c)) / (2x+1)). If you move the cursor to the letter `b' and press j s, the display changes to
. ...
.. . b. . . .
1* ...............
. . . .
|
Every character not part of the sub-formula `b' has been changed to a dot. The `*' next to the line number is to remind you that the formula has a portion of it selected. (In this case, it's very obvious, but it might not always be. If Embedded Mode is enabled, the word `Sel' also appears in the mode line because the stack may not be visible. see section 18. Embedded Mode.)
If you had instead placed the cursor on the parenthesis immediately to the right of the `b', the selection would have been:
. ...
(a + b) . . .
1* ...............
. . . .
|
The portion selected is always large enough to be considered a complete formula all by itself, so selecting the parenthesis selects the whole formula that it encloses. Putting the cursor on the `+' sign would have had the same effect.
(Strictly speaking, the Emacs cursor is really the manifestation of the Emacs "point," which is a position between two characters in the buffer. So purists would say that Calc selects the smallest sub-formula which contains the character to the right of "point.")
If you supply a numeric prefix argument n, the selection is expanded to the nth enclosing sub-formula. Thus, positioning the cursor on the `b' and typing C-u 1 j s will select `a + b'; typing C-u 2 j s will select `(a + b)^3', and so on.
If the cursor is not on any part of the formula, or if you give a numeric prefix that is too large, the entire formula is selected.
If the cursor is on the `.' line that marks the top of the stack (i.e., its normal "rest position"), this command selects the entire formula at stack level 1. Most selection commands similarly operate on the formula at the top of the stack if you haven't positioned the cursor on any stack entry.
The j a (calc-select-additional) command enlarges the
current selection to encompass the cursor. To select the smallest
sub-formula defined by two different points, move to the first and
press j s, then move to the other and press j a. This
is roughly analogous to using C-@ (set-mark-command) to
select the two ends of a region of text during normal Emacs editing.
The j o (calc-select-once) command selects a formula in
exactly the same way as j s, except that the selection will
last only as long as the next command that uses it. For example,
j o 1 + is a handy way to add one to the sub-formula indicated
by the cursor.
(A somewhat more precise definition: The j o command sets a flag such that the next command involving selected stack entries will clear the selections on those stack entries afterwards. All other selection commands except j a and j O clear this flag.)
The j S (calc-select-here-maybe) and j O
(calc-select-once-maybe) commands are equivalent to j s
and j o, respectively, except that if the formula already
has a selection they have no effect. This is analogous to the
behavior of some commands such as j r (calc-rewrite-selection;
see section 12.11.9 Selections with Rewrite Rules) and is mainly intended to be
used in keyboard macros that implement your own selection-oriented
commands.
Selection of sub-formulas normally treats associative terms like `a + b - c + d' and `x * y * z' as single levels of the formula. If you place the cursor anywhere inside `a + b - c + d' except on one of the variable names and use j s, you will select the entire four-term sum.
The j b (calc-break-selections) command controls a mode
in which the "deep structure" of these associative formulas shows
through. Calc actually stores the above formulas as `((a + b) - c) + d'
and `x * (y * z)'. (Note that for certain obscure reasons, Calc
treats multiplication as right-associative.) Once you have enabled
j b mode, selecting with the cursor on the `-' sign would
only select the `a + b - c' portion, which makes sense when the
deep structure of the sum is considered. There is no way to select
the `b - c + d' portion; although this might initially look
like just as legitimate a sub-formula as `a + b - c', the deep
structure shows that it isn't. The d U command can be used
to view the deep structure of any formula (see section 8.8.1 Normal Language Modes).
When j b mode has not been enabled, the deep structure is generally hidden by the selection commands--what you see is what you get.
The j u (calc-unselect) command unselects the formula
that the cursor is on. If there was no selection in the formula,
this command has no effect. With a numeric prefix argument, it
unselects the nth stack element rather than using the cursor
position.
The j c (calc-clear-selections) command unselects all
stack elements.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Once you have selected a sub-formula, you can expand it using the
j m (calc-select-more) command. If `a + b' is
selected, pressing j m repeatedly works as follows:
3 ... 3 ___ 3 ___
(a + b) . . . (a + b) + V c (a + b) + V c
1* ............... 1* ............... 1* ---------------
. . . . . . . . 2 x + 1
|
In the last example, the entire formula is selected. This is roughly the same as having no selection at all, but because there are subtle differences the `*' character is still there on the line number.
With a numeric prefix argument n, j m expands n times (or until the entire formula is selected). Note that j s with argument n is equivalent to plain j s followed by j m with argument n. If j m is used when there is no current selection, it is equivalent to j s.
Even though j m does not explicitly use the location of the cursor within the formula, it nevertheless uses the cursor to determine which stack element to operate on. As usual, j m when the cursor is not on any stack element operates on the top stack element.
The j l (calc-select-less) command reduces the current
selection around the cursor position. That is, it selects the
immediate sub-formula of the current selection which contains the
cursor, the opposite of j m. If the cursor is not inside the
current selection, the command de-selects the formula.
The j 1 through j 9 (calc-select-part) commands
select the nth sub-formula of the current selection. They are
like j l (calc-select-less) except they use counting
rather than the cursor position to decide which sub-formula to select.
For example, if the current selection is a + b + c or
f(a, b, c) or [a, b, c], then j 1 selects `a',
j 2 selects `b', and j 3 selects `c'; in each of
these cases, j 4 through j 9 would be errors.
If there is no current selection, j 1 through j 9 select the nth top-level sub-formula. (In other words, they act as if the entire stack entry were selected first.) To select the nth sub-formula where n is greater than nine, you must instead invoke j 1 with n as a numeric prefix argument.
The j n (calc-select-next) and j p
(calc-select-previous) commands change the current selection
to the next or previous sub-formula at the same level. For example,
if `b' is selected in `2 + a*b*c + x', then j n
selects `c'. Further j n commands would be in error because,
even though there is something to the right of `c' (namely, `x'),
it is not at the same level; in this case, it is not a term of the
same product as `b' and `c'. However, j m (to select
the whole product `a*b*c' as a term of the sum) followed by
j n would successfully select the `x'.
Similarly, j p moves the selection from the `b' in this sample formula to the `a'. Both commands accept numeric prefix arguments to move several steps at a time.
It is interesting to compare Calc's selection commands with the
Emacs Info system's commands for navigating through hierarchically
organized documentation. Calc's j n command is completely
analogous to Info's n command. Likewise, j p maps to
p, j 2 maps to 2, and Info's u is like j m.
(Note that j u stands for calc-unselect, not "up".)
The Info m command is somewhat similar to Calc's j s and
j l; in each case, you can jump directly to a sub-component
of the hierarchy simply by pointing to it with the cursor.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The j d (calc-show-selections) command controls how
selected sub-formulas are displayed. One of the alternatives is
illustrated in the above examples; if we press j d we switch
to the other style in which the selected portion itself is obscured
by `#' signs:
3 ... # ___
(a + b) . . . ## # ## + V c
1* ............... 1* ---------------
. . . . 2 x + 1
|
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Once a selection is made, all Calc commands that manipulate items on the stack will operate on the selected portions of the items instead. (Note that several stack elements may have selections at once, though there can be only one selection at a time in any given stack element.)
The j e (calc-enable-selections) command disables the
effect that selections have on Calc commands. The current selections
still exist, but Calc commands operate on whole stack elements anyway.
This mode can be identified by the fact that the `*' markers on
the line numbers are gone, even though selections are visible. To
reactivate the selections, press j e again.
To extract a sub-formula as a new formula, simply select the sub-formula and press RET. This normally duplicates the top stack element; here it duplicates only the selected portion of that element.
To replace a sub-formula with something different, you can enter the new value onto the stack and press TAB. This normally exchanges the top two stack elements; here it swaps the value you entered into the selected portion of the formula, returning the old selected portion to the top of the stack.
3 ... ... ___
(a + b) . . . 17 x y . . . 17 x y + V c
2* ............... 2* ............. 2: -------------
. . . . . . . . 2 x + 1
3 3
1: 17 x y 1: (a + b) 1: (a + b)
|
In this example we select a sub-formula of our original example, enter a new formula, TAB it into place, then deselect to see the complete, edited formula.
If you want to swap whole formulas around even though they contain selections, just use j e before and after.
The j ' (calc-enter-selection) command is another way
to replace a selected sub-formula. This command does an algebraic
entry just like the regular ' key. When you press RET,
the formula you type replaces the original selection. You can use
the `$' symbol in the formula to refer to the original
selection. If there is no selection in the formula under the cursor,
the cursor is used to make a temporary selection for the purposes of
the command. Thus, to change a term of a formula, all you have to
do is move the Emacs cursor to that term and press j '.
The j ` (calc-edit-selection) command is a similar
analogue of the ` (calc-edit) command. It edits the
selected sub-formula in a separate buffer. If there is no
selection, it edits the sub-formula indicated by the cursor.
To delete a sub-formula, press DEL. This generally replaces the sub-formula with the constant zero, but in a few suitable contexts it uses the constant one instead. The DEL key automatically deselects and re-simplifies the entire formula afterwards. Thus:
###
17 x y + # # 17 x y 17 # y 17 y
1* ------------- 1: ------- 1* ------- 1: -------
2 x + 1 2 x + 1 2 x + 1 2 x + 1
|
In this example, we first delete the `sqrt(c)' term; Calc accomplishes this by replacing `sqrt(c)' with zero and resimplifying. We then delete the x in the numerator; since this is part of a product, Calc replaces it with `1' and resimplifies.
If you select an element of a vector and press DEL, that element is deleted from the vector. If you delete one side of an equation or inequality, only the opposite side remains.
The j DEL (calc-del-selection) command is like
DEL but with the auto-selecting behavior of j ' and
j `. It deletes the selected portion of the formula
indicated by the cursor, or, in the absence of a selection, it
deletes the sub-formula indicated by the cursor position.
(There is also an auto-selecting j RET (calc-copy-selection)
command.)
Normal arithmetic operations also apply to sub-formulas. Here we select the denominator, press 5 - to subtract five from the denominator, press n to negate the denominator, then press Q to take the square root.
.. . .. . .. . .. .
1* ....... 1* ....... 1* ....... 1* ..........
2 x + 1 2 x - 4 4 - 2 x _________
V 4 - 2 x
|
Certain types of operations on selections are not allowed. For example, for an arithmetic function like - no more than one of the arguments may be a selected sub-formula. (As the above example shows, the result of the subtraction is spliced back into the argument which had the selection; if there were more than one selection involved, this would not be well-defined.) If you try to subtract two selections, the command will abort with an error message.
Operations on sub-formulas sometimes leave the formula as a whole
in an "un-natural" state. Consider negating the `2 x' term
of our sample formula by selecting it and pressing n
(calc-change-sign).
.. . .. .
1* .......... 1* ...........
......... ..........
. . . 2 x . . . -2 x
|
Unselecting the sub-formula reveals that the minus sign, which would
normally have cancelled out with the subtraction automatically, has
not been able to do so because the subtraction was not part of the
selected portion. Pressing = (calc-evaluate) or doing
any other mathematical operation on the whole formula will cause it
to be simplified.
17 y 17 y
1: ----------- 1: ----------
__________ _________
V 4 - -2 x V 4 + 2 x
|
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The j R (calc-commute-right) command moves the selected
sub-formula to the right in its surrounding formula. Generally the
selection is one term of a sum or product; the sum or product is
rearranged according to the commutative laws of algebra.
As with j ' and j DEL, the term under the cursor is used if there is no selection in the current formula. All commands described in this section share this property. In this example, we place the cursor on the `a' and type j R, then repeat.
1: a + b - c 1: b + a - c 1: b - c + a |
Note that in the final step above, the `a' is switched with the `c' but the signs are adjusted accordingly. When moving terms of sums and products, j R will never change the mathematical meaning of the formula.
The selected term may also be an element of a vector or an argument of a function. The term is exchanged with the one to its right. In this case, the "meaning" of the vector or function may of course be drastically changed.
1: [a, b, c] 1: [b, a, c] 1: [b, c, a] 1: f(a, b, c) 1: f(b, a, c) 1: f(b, c, a) |
The j L (calc-commute-left) command is like j R
except that it swaps the selected term with the one to its left.
With numeric prefix arguments, these commands move the selected term several steps at a time. It is an error to try to move a term left or right past the end of its enclosing formula. With numeric prefix arguments of zero, these commands move the selected term as far as possible in the given direction.
The j D (calc-sel-distribute) command mixes the selected
sum or product into the surrounding formula using the distributive
law. For example, in `a * (b - c)' with the `b - c'
selected, the result is `a b - a c'. This also distributes
products or quotients into surrounding powers, and can also do
transformations like `exp(a + b)' to `exp(a) exp(b)',
where `a + b' is the selected term, and `ln(a ^ b)'
to `ln(a) b', where `a ^ b' is the selected term.
For multiple-term sums or products, j D takes off one term at a time: `a * (b + c - d)' goes to `a * (c - d) + a b' with the `c - d' selected so that you can type j D repeatedly to expand completely. The j D command allows a numeric prefix argument which specifies the maximum number of times to expand at once; the default is one time only.
The j D command is implemented using rewrite rules.
See section 12.11.9 Selections with Rewrite Rules. The rules are stored in
the Calc variable DistribRules. A convenient way to view
these rules is to use s e (calc-edit-variable) which
displays and edits the stored value of a variable. Press M-# M-#
to return from editing mode; be careful not to make any actual changes
or else you will affect the behavior of future j D commands!
To extend j D to handle new cases, just edit DistribRules
as described above. You can then use the s p command to save
this variable's value permanently for future Calc sessions.
See section 14.3 Other Operations on Variables.
The j M (calc-sel-merge) command is the complement
of j D; given `a b - a c' with either `a b' or
`a c' selected, the result is `a * (b - c)'. Once
again, j M can also merge calls to functions like exp
and ln; examine the variable MergeRules to see all
the relevant rules.
The j C (calc-sel-commute) command swaps the arguments
of the selected sum, product, or equation. It always behaves as
if j b mode were in effect, i.e., the sum `a + b + c' is
treated as the nested sums `(a + b) + c' by this command.
If you put the cursor on the first `+', the result is
`(b + a) + c'; if you put the cursor on the second `+', the
result is `c + (a + b)' (which the default simplifications
will rearrange to `(c + a) + b'). The relevant rules are stored
in the variable CommuteRules.
You may need to turn default simplifications off (with the m O command) in order to get the full benefit of j C. For example, commuting `a - b' produces `-b + a', but the default simplifications will "simplify" this right back to `a - b' if you don't turn them off. The same is true of some of the other manipulations described in this section.
The j N (calc-sel-negate) command replaces the selected
term with the negative of that term, then adjusts the surrounding
formula in order to preserve the meaning. For example, given
`exp(a - b)' where `a - b' is selected, the result is
`1 / exp(b - a)'. By contrast, selecting a term and using the
regular n (calc-change-sign) command negates the
term without adjusting the surroundings, thus changing the meaning
of the formula as a whole. The rules variable is NegateRules.
The j & (calc-sel-invert) command is similar to j N
except it takes the reciprocal of the selected term. For example,
given `a - ln(b)' with `b' selected, the result is
`a + ln(1/b)'. The rules variable is InvertRules.
The j E (calc-sel-jump-equals) command moves the
selected term from one side of an equation to the other. Given
`a + b = c + d' with `c' selected, the result is
`a + b - c = d'. This command also works if the selected
term is part of a `*', `/', or `^' formula. The
relevant rules variable is JumpRules.
The j I (calc-sel-isolate) command isolates the
selected term on its side of an equation. It uses the a S
(calc-solve-for) command to solve the equation, and the
Hyperbolic flag affects it in the same way. See section 12.6 Solving Equations.
When it applies, j I is often easier to use than j E.
It understands more rules of algebra, and works for inequalities
as well as equations.
The j * (calc-sel-mult-both-sides) command prompts for a
formula using algebraic entry, then multiplies both sides of the
selected quotient or equation by that formula. It simplifies each
side with a s (calc-simplify) before re-forming the
quotient or equation. You can suppress this simplification by
providing any numeric prefix argument. There is also a j /
(calc-sel-div-both-sides) which is similar to j * but
dividing instead of multiplying by the factor you enter.
As a special feature, if the numerator of the quotient is 1, then the denominator is expanded at the top level using the distributive law (i.e., using the C-u -1 a x command). Suppose the formula on the stack is `1 / (sqrt(a) + 1)', and you wish to eliminate the square root in the denominator by multiplying both sides by `sqrt(a) - 1'. Calc's default simplifications would change the result `(sqrt(a) - 1) / (sqrt(a) - 1) (sqrt(a) + 1)' right back to the original form by cancellation; Calc expands the denominator to `sqrt(a) (sqrt(a) - 1) + sqrt(a) - 1' to prevent this. (You would now want to use an a x command to expand the rest of the way, whereupon the denominator would cancel out to the desired form, `a - 1'.) When the numerator is not 1, this initial expansion is not necessary because Calc's default simplifications will not notice the potential cancellation.
If the selection is an inequality, j * and j / will accept any factor, but will warn unless they can prove the factor is either positive or negative. (In the latter case the direction of the inequality will be switched appropriately.) See section 8.6 Declarations, for ways to inform Calc that a given variable is positive or negative. If Calc can't tell for sure what the sign of the factor will be, it will assume it is positive and display a warning message.
For selections that are not quotients, equations, or inequalities, these commands pull out a multiplicative factor: They divide (or multiply) by the entered formula, simplify, then multiply (or divide) back by the formula.
The j + (calc-sel-add-both-sides) and j -
(calc-sel-sub-both-sides) commands analogously add to or
subtract from both sides of an equation or inequality. For other
types of selections, they extract an additive factor. A numeric
prefix argument suppresses simplification of the intermediate
results.
The j U (calc-sel-unpack) command replaces the
selected function call with its argument. For example, given
`a + sin(x^2)' with `sin(x^2)' selected, the result
is `a + x^2'. (The `x^2' will remain selected; if you
wanted to change the sin to cos, just press C
now to take the cosine of the selected part.)
The j v (calc-sel-evaluate) command performs the
normal default simplifications on the selected sub-formula.
These are the simplifications that are normally done automatically
on all results, but which may have been partially inhibited by
previous selection-related operations, or turned off altogether
by the m O command. This command is just an auto-selecting
version of the a v command (see section 12.2 Algebraic Manipulation).
With a numeric prefix argument of 2, C-u 2 j v applies
the a s (calc-simplify) command to the selected
sub-formula. With a prefix argument of 3 or more, e.g., C-u j v
applies the a e (calc-simplify-extended) command.
See section 12.3 Simplifying Formulas. With a negative prefix argument
it simplifies at the top level only, just as with a v.
Here the "top" level refers to the top level of the selected
sub-formula.
The j " (calc-sel-expand-formula) command is to a "
(see section 12.2 Algebraic Manipulation) what j v is to a v.
You can use the j r (calc-rewrite-selection) command
to define other algebraic operations on sub-formulas. See section 12.11 Rewrite Rules.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The commands in this section perform general-purpose algebraic manipulations. They work on the whole formula at the top of the stack (unless, of course, you have made a selection in that formula).
Many algebra commands prompt for a variable name or formula. If you answer the prompt with a blank line, the variable or formula is taken from top-of-stack, and the normal argument for the command is taken from the second-to-top stack level.
The a v (calc-alg-evaluate) command performs the normal
default simplifications on a formula; for example, `a - -b' is
changed to `a + b'. These simplifications are normally done
automatically on all Calc results, so this command is useful only if
you have turned default simplifications off with an m O
command. See section 8.5 Simplification Modes.
It is often more convenient to type =, which is like a v but which also substitutes stored values for variables in the formula. Use a v if you want the variables to ignore their stored values.
If you give a numeric prefix argument of 2 to a v, it simplifies as if in algebraic simplification mode. This is equivalent to typing a s; see section 12.3 Simplifying Formulas. If you give a numeric prefix of 3 or more, it uses extended simplification mode (a e).
If you give a negative prefix argument -1, -2, or -3, it simplifies in the corresponding mode but only works on the top-level function call of the formula. For example, `(2 + 3) * (2 + 3)' will simplify to `(2 + 3)^2', without simplifying the sub-formulas `2 + 3'. As another example, typing V R + to sum the vector `[1, 2, 3, 4]' produces the formula `reduce(add, [1, 2, 3, 4])' in no-simplify mode. Using a v will evaluate this all the way to 10; using C-u - a v will evaluate it only to `1 + 2 + 3 + 4'. (See section 11.8 Reducing and Mapping Vectors.)
The = command corresponds to the evalv function, and
the related N command, which is like = but temporarily
disables symbolic (m s) mode during the evaluation, corresponds
to the evalvn function. (These commands interpret their prefix
arguments differently than a v; = treats the prefix as
the number of stack elements to evaluate at once, and N treats
it as a temporary different working precision.)
The evalvn function can take an alternate working precision
as an optional second argument. This argument can be either an
integer, to set the precision absolutely, or a vector containing
a single integer, to adjust the precision relative to the current
precision. Note that evalvn with a larger than current
precision will do the calculation at this higher precision, but the
result will as usual be rounded back down to the current precision
afterward. For example, `evalvn(pi - 3.1415)' at a precision
of 12 will return `9.265359e-5'; `evalvn(pi - 3.1415, 30)'
will return `9.26535897932e-5' (computing a 25-digit result which
is then rounded down to 12); and `evalvn(pi - 3.1415, [-2])'
will return `9.2654e-5'.
The a " (calc-expand-formula) command expands functions
into their defining formulas wherever possible. For example,
`deg(x^2)' is changed to `180 x^2 / pi'. Most functions,
like sin and gcd, are not defined by simple formulas
and so are unaffected by this command. One important class of
functions which can be expanded is the user-defined functions
created by the Z F command. See section 19.4 Programming with Formulas.
Other functions which a " can expand include the probability
distribution functions, most of the financial functions, and the
hyperbolic and inverse hyperbolic functions. A numeric prefix argument
affects a " in the same way as it does a v: A positive
argument expands all functions in the formula and then simplifies in
various ways; a negative argument expands and simplifies only the
top-level function call.
The a M (calc-map-equation) [mapeq] command applies
a given function or operator to one or more equations. It is analogous
to V M, which operates on vectors instead of equations.
see section 11.8 Reducing and Mapping Vectors. For example, a M S changes
`x = y+1' to `sin(x) = sin(y+1)', and a M + with
`x = y+1' and 6 on the stack produces `x+6 = y+7'.
With two equations on the stack, a M + would add the lefthand
sides together and the righthand sides together to get the two
respective sides of a new equation.
Mapping also works on inequalities. Mapping two similar inequalities produces another inequality of the same type. Mapping an inequality with an equation produces an inequality of the same type. Mapping a `<=' with a `<' or `!=' (not-equal) produces a `<'. If inequalities with opposite direction (e.g., `<' and `>') are mapped, the direction of the second inequality is reversed to match the first: Using a M + on `a < b' and `a > 2' reverses the latter to get `2 < a', which then allows the combination `a + 2 < b + a', which the a s command can then simplify to get `2 < b'.
Using a M *, a M /, a M n, or a M & to negate or invert an inequality will reverse the direction of the inequality. Other adjustments to inequalities are not done automatically; a M S will change `x < y' to `sin(x) < sin(y)' even though this is not true for all values of the variables.
With the Hyperbolic flag, H a M [mapeqp] does a plain
mapping operation without reversing the direction of any inequalities.
Thus, H a M & would change x > 2 to 1/x > 0.5.
(This change is mathematically incorrect, but perhaps you were
fixing an inequality which was already incorrect.)
With the Inverse flag, I a M [mapeqr] always reverses
the direction of the inequality. You might use I a M C to
change `x < y' to `cos(x) > cos(y)' if you know you are
working with small positive angles.
The a b (calc-substitute) [subst] command substitutes
all occurrences
of some variable or sub-expression of an expression with a new
sub-expression. For example, substituting `sin(x)' with `cos(y)'
in `2 sin(x)^2 + x sin(x) + sin(2 x)' produces
`2 cos(y)^2 + x cos(y) + sin(2 x)'.
Note that this is a purely structural substitution; the lone `x' and
the `sin(2 x)' stayed the same because they did not look like
`sin(x)'. See section 12.11 Rewrite Rules, for a more general method for
doing substitutions.
The a b command normally prompts for two formulas, the old one and the new one. If you enter a blank line for the first prompt, all three arguments are taken from the stack (new, then old, then target expression). If you type an old formula but then enter a blank line for the new one, the new formula is taken from top-of-stack and the target from second-to-top. If you answer both prompts, the target is taken from top-of-stack as usual.
Note that a b has no understanding of commutativity or
associativity. The pattern `x+y' will not match the formula
`y+x'. Also, `y+z' will not match inside the formula `x+y+z'
because the `+' operator is left-associative, so the "deep
structure" of that formula is `(x+y) + z'. Use d U
(calc-unformatted-language) mode to see the true structure of
a formula. The rewrite rule mechanism, discussed later, does not have
these limitations.
As an algebraic function, subst takes three arguments:
Target expression, old, new. Note that subst is always
evaluated immediately, even if its arguments are variables, so if
you wish to put a call to subst onto the stack you must
turn the default simplifications off first (with m O).
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The a s (calc-simplify) [simplify] command applies
various algebraic rules to simplify a formula. This includes rules which
are not part of the default simplifications because they may be too slow
to apply all the time, or may not be desirable all of the time. For
example, non-adjacent terms of sums are combined, as in `a + b + 2 a'
to `b + 3 a', and some formulas like `sin(arcsin(x))' are
simplified to `x'.
The sections below describe all the various kinds of algebraic simplifications Calc provides in full detail. None of Calc's simplification commands are designed to pull rabbits out of hats; they simply apply certain specific rules to put formulas into less redundant or more pleasing forms. Serious algebra in Calc must be done manually, usually with a combination of selections and rewrite rules. See section 12.1.5 Rearranging Formulas using Selections. See section 12.11 Rewrite Rules.
See section 8.5 Simplification Modes, for commands to control what level of simplification occurs automatically. Normally only the "default simplifications" occur.
| 12.3.1 Default Simplifications | ||
| 12.3.2 Algebraic Simplifications | ||
| 12.3.3 "Unsafe" Simplifications | ||
| 12.3.4 Simplification of Units |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes the "default simplifications," those which are normally applied to all results. For example, if you enter the variable x on the stack twice and push +, Calc's default simplifications automatically change x + x to 2 x.
The m O command turns off the default simplifications, so that x + x will remain in this form unless you give an explicit "simplify" command like = or a v. See section 12.2 Algebraic Manipulation. The m D command turns the default simplifications back on.
The most basic default simplification is the evaluation of functions. For example, 2 + 3 is evaluated to 5, and sqrt(9) is evaluated to 3. Evaluation does not occur if the arguments to a function are somehow of the wrong type (tan([2,3,4]), range (tan(90)), or number (tan(3,5)), or if the function name is not recognized (f(5)), or if "symbolic" mode (see section 8.4.5 Symbolic Mode) prevents evaluation (sqrt(2)).
Calc simplifies (evaluates) the arguments to a function before it
simplifies the function itself. Thus sqrt(5+4) is
simplified to sqrt(9) before the sqrt function
itself is applied. There are very few exceptions to this rule:
quote, lambda, and condition (the ::
operator) do not evaluate their arguments, if (the ? :
operator) does not evaluate all of its arguments, and evalto
does not evaluate its lefthand argument.
Most commands apply the default simplifications to all arguments they
take from the stack, perform a particular operation, then simplify
the result before pushing it back on the stack. In the common special
case of regular arithmetic commands like + and Q [sqrt],
the arguments are simply popped from the stack and collected into a
suitable function call, which is then simplified (the arguments being
simplified first as part of the process, as described above).
The default simplifications are too numerous to describe completely here, but this section will describe the ones that apply to the major arithmetic operators. This list will be rather technical in nature, and will probably be interesting to you only if you are a serious user of Calc's algebra facilities.
As well as the simplifications described here, if you have stored
any rewrite rules in the variable EvalRules then these rules
will also be applied before any built-in default simplifications.
See section 12.11.11 Automatic Rewrites, for details.
And now, on with the default simplifications:
Arithmetic operators like + and * always take two arguments in Calc's internal form. Sums and products of three or more terms are arranged by the associative law of algebra into a left-associative form for sums, ((a + b) + c) + d, and a right-associative form for products, a * (b * (c * d)). Formulas like (a + b) + (c + d) are rearranged to left-associative form, though this rarely matters since Calc's algebra commands are designed to hide the inner structure of sums and products as much as possible. Sums and products in their proper associative form will be written without parentheses in the examples below.
Sums and products are not rearranged according to the commutative law (a + b to b + a) except in a few special cases described below. Some algebra programs always rearrange terms into a canonical order, which enables them to see that a b + b a can be simplified to 2 a b. Calc assumes you have put the terms into the order you want and generally leaves that order alone, with the consequence that formulas like the above will only be simplified if you explicitly give the a s command. See section 12.3.2 Algebraic Simplifications.
Differences a - b are treated like sums a + (-b) for purposes of simplification; one of the default simplifications is to rewrite a + (-b) or (-b) + a, where -b represents a "negative-looking" term, into a - b form. "Negative-looking" means negative numbers, negated formulas like -x, and products or quotients in which either term is negative-looking.
Other simplifications involving negation are -(-x) to x; -(a b) or -(a/b) where either a or b is negative-looking, simplified by negating that term, or else where a or b is any number, by negating that number; -(a + b) to -a - b, and -(b - a) to a - b. (This, and rewriting (-b) + a to a - b, are the only cases where the order of terms in a sum is changed by the default simplifications.)
The distributive law is used to simplify sums in some cases: a x + b x to (a + b) x, where a represents a number or an implicit 1 or -1 (as in x or -x) and similarly for b. Use the a c, a f, or j M commands to merge sums with non-numeric coefficients using the distributive law.
The distributive law is only used for sums of two terms, or for adjacent terms in a larger sum. Thus a + b + b + c is simplified to a + 2 b + c, but a + b + c + b is not simplified. The reason is that comparing all terms of a sum with one another would require time proportional to the square of the number of terms; Calc relegates potentially slow operations like this to commands that have to be invoked explicitly, like a s.
Finally, a + 0 and 0 + a are simplified to a. A consequence of the above rules is that 0 - a is simplified to -a.
The products 1 a and a 1 are simplified to a; (-1) a and a (-1) are simplified to -a; 0 a and a 0 are simplified to 0, except that in matrix mode where a is not provably scalar the result is the generic zero matrix `idn(0)', and that if a is infinite the result is `nan'.
Also, (-a) b and a (-b) are simplified to -(a b), where this occurs for negated formulas but not for regular negative numbers.
Products are commuted only to move numbers to the front: a b 2 is commuted to 2 a b.
The product a (b + c) is distributed over the sum only if a and at least one of b and c are numbers: 2 (x + 3) goes to 2 x + 6. The formula (-a) (b - c), where -a is a negative number, is rewritten to a (c - b).
The distributive law of products and powers is used for adjacent terms of the product: x^a x^b goes to x^(a+b) where a is a number, or an implicit 1 (as in x), or the implicit one-half of sqrt(x), and similarly for b. The result is written using `sqrt' or `1/sqrt' if the sum of the powers is 1/2 or -1/2, respectively. If the sum of the powers is zero, the product is simplified to 1 or to `idn(1)' if matrix mode is enabled.
The product of a negative power times anything but another negative power is changed to use division: x^(-2) y goes to y / x^2 unless matrix mode is in effect and neither x nor y are scalar (in which case it is considered unsafe to rearrange the order of the terms).
Finally, a (b/c) is rewritten to (a b)/c, and also (a/b) c is changed to (a c)/b unless in matrix mode.
Simplifications for quotients are analogous to those for products. The quotient 0 / x is simplified to 0, with the same exceptions that were noted for 0 x. Likewise, x / 1 and x / (-1) are simplified to x and -x, respectively.
The quotient x / 0 is left unsimplified or changed to an infinite quantity, as directed by the current infinite mode. See section 8.4.4 Infinite Mode.
The expression a / b^(-c) is changed to a b^c, where -c is any negative-looking power. Also, 1 / b^c is changed to b^(-c) for any power c.
Also, (-a) / b and a / (-b) go to -(a/b); (a/b) / c goes to a / (b c); and a / (b/c) goes to (a c) / b unless matrix mode prevents this rearrangement. Similarly, a / (b:c) is simplified to (c:b) a for any fraction b:c.
The distributive law is applied to (a + b) / c only if c and at least one of a and b are numbers. Quotients of powers and square roots are distributed just as described for multiplication.
Quotients of products cancel only in the leading terms of the numerator and denominator. In other words, a x b / a y b is cancelled to x b / y b but not to x / y. Once again this is because full cancellation can be slow; use a s to cancel all terms of the quotient.
Quotients of negative-looking values are simplified according to (-a) / (-b) to a / b, (-a) / (b - c) to a / (c - b), and (a - b) / (-c) to (b - a) / c.
The formula x^0 is simplified to 1, or to `idn(1)' in matrix mode. The formula 0^x is simplified to 0 unless x is a negative number or complex number, in which case the result is an infinity or an unsimplified formula according to the current infinite mode. Note that 0^0 is an indeterminate form, as evidenced by the fact that the simplifications for x^0 and 0^x conflict when x=0.
Powers of products or quotients (a b)^c, (a/b)^c are distributed to a^c b^c, a^c / b^c only if c is an integer, or if either a or b are nonnegative real numbers. Powers of powers (a^b)^c are simplified to a^(b c) only when c is an integer and b c also evaluates to an integer. Without these restrictions these simplifications would not be safe because of problems with principal values. (In other words, ((-3)^1:2)^2 is safe to simplify, but ((-3)^2)^1:2 is not.) See section 8.6 Declarations, for ways to inform Calc that your variables satisfy these requirements.
As a special case of this rule, sqrt(x)^n is simplified to x^(n/2) only for even integers n.
If a is known to be real, b is an even integer, and c is a half- or quarter-integer, then (a^b)^c is simplified to abs(a^(b c)).
Also, (-a)^b is simplified to a^b if b is an even integer, or to -(a^b) if b is an odd integer, for any negative-looking expression -a.
Square roots sqrt(x) generally act like one-half powers x^1:2 for the purposes of the above-listed simplifications.
Also, note that 1 / x^1:2 is changed to x^(-1:2), but 1 / sqrt(x) is left alone.
Generic identity matrices (see section 8.4.6 Matrix and Scalar Modes) are simplified by the
following rules: idn(a) + b to a + b if b
is provably scalar, or expanded out if b is a matrix;
idn(a) + idn(b) to idn(a + b);
-idn(a) to idn(-a); a idn(b) to
idn(a b) if a is provably scalar, or to a b
if a is provably non-scalar; idn(a) idn(b)
to idn(a b); analogous simplifications for quotients
involving idn; and idn(a)^n to idn(a^n)
where n is an integer.
The floor function and other integer truncation functions
vanish if the argument is provably integer-valued, so that
floor(round(x)) simplifies to round(x).
Also, combinations of float, floor and its friends,
and ffloor and its friends, are simplified in appropriate
ways. See section 9.2 Integer Truncation.
The expression abs(-x) changes to abs(x). The expression abs(abs(x)) changes to abs(x); in fact, abs(x) changes to x or -x if x is provably nonnegative or nonpositive (see section 8.6 Declarations).
While most functions do not recognize the variable i as an
imaginary number, the arg function does handle the two cases
arg(i) and arg(-i) just for convenience.
The expression conj(conj(x)) simplifies to x.
Various other expressions involving conj, re, and
im are simplified, especially if some of the arguments are
provably real or involve the constant i. For example,
conj(a + b i) is changed to conj(a) - conj(b) i,
or to a - b i if a and b are known to be real.
Functions like sin and arctan generally don't have
any default simplifications beyond simply evaluating the functions
for suitable numeric arguments and infinity. The a s command
described in the next section does provide some simplifications for
these functions, though.
One important simplification that does occur is that ln(e) is simplified to 1, and ln(e^x) is simplified to x for any x. This occurs even if you have stored a different value in the Calc variable `e'; but this would be a bad idea in any case if you were also using natural logarithms!
Among the logical functions, !(a <= b) changes to a > b and so on. Equations and inequalities where both sides are either negative-looking or zero are simplified by negating both sides and reversing the inequality. While it might seem reasonable to simplify !!x to x, this would not be valid in general because !!2 is 1, not 2.
Most other Calc functions have few if any default simplifications defined, aside of course from evaluation when the arguments are suitable numbers.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The a s command makes simplifications that may be too slow to do all the time, or that may not be desirable all of the time. If you find these simplifications are worthwhile, you can type m A to have Calc apply them automatically.
This section describes all simplifications that are performed by the a s command. Note that these occur in addition to the default simplifications; even if the default simplifications have been turned off by an m O command, a s will turn them back on temporarily while it simplifies the formula.
There is a variable, AlgSimpRules, in which you can put rewrites
to be applied by a s. Its use is analogous to EvalRules,
but without the special restrictions. Basically, the simplifier does
`a r AlgSimpRules' with an infinite repeat count on the whole
expression being simplified, then it traverses the expression applying
the built-in rules described below. If the result is different from
the original expression, the process repeats with the default
simplifications (including EvalRules), then AlgSimpRules,
then the built-in simplifications, and so on.
Sums are simplified in two ways. Constant terms are commuted to the end of the sum, so that a + 2 + b changes to a + b + 2. The only exception is that a constant will not be commuted away from the first position of a difference, i.e., 2 - x is not commuted to -x + 2.
Also, terms of sums are combined by the distributive law, as in x + y + 2 x to y + 3 x. This always occurs for adjacent terms, but a s compares all pairs of terms including non-adjacent ones.
Products are sorted into a canonical order using the commutative law. For example, b c a is commuted to a b c. This allows easier comparison of products; for example, the default simplifications will not change x y + y x to 2 x y, but a s will; it first rewrites the sum to x y + x y, and then the default simplifications are able to recognize a sum of identical terms.
The canonical ordering used to sort terms of products has the property that real-valued numbers, interval forms and infinities come first, and are sorted into increasing order. The V S command uses the same ordering when sorting a vector.
Sorting of terms of products is inhibited when matrix mode is turned on; in this case, Calc will never exchange the order of two terms unless it knows at least one of the terms is a scalar.
Products of powers are distributed by comparing all pairs of terms, using the same method that the default simplifications use for adjacent terms of products.
Even though sums are not sorted, the commutative law is still taken into account when terms of a product are being compared. Thus (x + y) (y + x) will be simplified to (x + y)^2. A subtle point is that (x - y) (y - x) will not be simplified to -(x - y)^2; Calc does not notice that one term can be written as a constant times the other, even if that constant is -1.
A fraction times any expression, (a:b) x, is changed to a quotient involving integers: a x / b. This is not done for floating-point numbers like 0.5, however. This is one reason why you may find it convenient to turn Fraction mode on while doing algebra; see section 8.4.3 Fraction Mode.
Quotients are simplified by comparing all terms in the numerator with all terms in the denominator for possible cancellation using the distributive law. For example, a x^2 b / c x^3 d will cancel x^2 from both sides to get a b / c x d. (The terms in the denominator will then be rearranged to c d x as described above.) If there is any common integer or fractional factor in the numerator and denominator, it is cancelled out; for example, (4 x + 6) / 8 x simplifies to (2 x + 3) / 4 x.
Non-constant common factors are not found even by a s. To cancel the factor a in (a x + a) / a^2 you could first use j M on the product a x to Merge the numerator to a (1+x), which can then be simplified successfully.
Integer powers of the variable i are simplified according
to the identity i^2 = -1. If you store a new value other
than the complex number (0,1) in i, this simplification
will no longer occur. This is done by a s instead of by default
in case someone (unwisely) uses the name i for a variable
unrelated to complex numbers; it would be unfortunate if Calc
quietly and automatically changed this formula for reasons the
user might not have been thinking of.
Square roots of integer or rational arguments are simplified in several ways. (Note that these will be left unevaluated only in Symbolic mode.) First, square integer or rational factors are pulled out so that sqrt(8) is rewritten as 2 sqrt(2). Conceptually speaking this implies factoring the argument into primes and moving pairs of primes out of the square root, but for reasons of efficiency Calc only looks for primes up to 29.
Square roots in the denominator of a quotient are moved to the numerator: 1 / sqrt(3) changes to sqrt(3) / 3. The same effect occurs for the square root of a fraction: sqrt(2:3) changes to sqrt(6) / 3.
The % (modulo) operator is simplified in several ways
when the modulus M is a positive real number. First, if
the argument is of the form x + n for some real number
n, then n is itself reduced modulo M. For
example, `(x - 23) % 10' is simplified to `(x + 7) % 10'.
If the argument is multiplied by a constant, and this constant has a common integer divisor with the modulus, then this factor is cancelled out. For example, `12 x % 15' is changed to `3 (4 x % 5)' by factoring out 3. Also, `(12 x + 1) % 15' is changed to `3 ((4 x + 1:3) % 5)'. While these forms may not seem "simpler," they allow Calc to discover useful information about modulo forms in the presence of declarations.
If the modulus is 1, then Calc can use int declarations to
evaluate the expression. For example, the idiom `x % 2' is
often used to check whether a number is odd or even. As described
above, `2 n % 2' and `(2 n + 1) % 2' are simplified to
`2 (n % 1)' and `2 ((n + 1:2) % 1)', respectively; Calc
can simplify these to 0 and 1 (respectively) if n has been
declared to be an integer.
Trigonometric functions are simplified in several ways. First,
sin(arcsin(x)) is simplified to x, and
similarly for cos and tan. If the argument to
sin is negative-looking, it is simplified to -sin(x),
and similarly for cos and tan. Finally, certain
special values of the argument are recognized;
see section 10.2 Trigonometric/Hyperbolic Functions.
Trigonometric functions of inverses of different trigonometric functions can also be simplified, as in sin(arccos(x)) to sqrt(1 - x^2).
Hyperbolic functions of their inverses and of negative-looking arguments are also handled, as are exponentials of inverse hyperbolic functions.
No simplifications for inverse trigonometric and hyperbolic
functions are known, except for negative arguments of arcsin,
arctan, arcsinh, and arctanh. Note that
arcsin(sin(x)) can not safely change to
x, since this only correct within an integer multiple
of
2 pi radians or 360 degrees. However,
arcsinh(sinh(x)) is simplified to x if
x is known to be real.
Several simplifications that apply to logarithms and exponentials
are that exp(ln(x)),
e^ln(x), and
10^log10(x) all reduce to x.
Also, ln(exp(x)), etc., can reduce to x if
x is provably real. The form exp(x)^y is simplified
to exp(x y). If x is a suitable multiple of
pi i
(as described above for the trigonometric functions), then exp(x)
or e^x will be expanded. Finally, ln(x) is simplified
to a form involving pi and i where x is provably
negative, positive imaginary, or negative imaginary.
The error functions erf and erfc are simplified when
their arguments are negative-looking or are calls to the conj
function.
Equations and inequalities are simplified by cancelling factors of products, quotients, or sums on both sides. Inequalities change sign if a negative multiplicative factor is cancelled. Non-constant multiplicative factors as in a b = a c are cancelled from equations only if they are provably nonzero (generally because they were declared so; see section 8.6 Declarations). Factors are cancelled from inequalities only if they are nonzero and their sign is known.
Simplification also replaces an equation or inequality with 1 or 0 ("true" or "false") if it can through the use of declarations. If x is declared to be an integer greater than 5, then x < 3, x = 3, and x = 7.5 are all simplified to 0, but x > 3 is simplified to 1. By a similar analysis, abs(x) >= 0 is simplified to 1, as is x^2 >= 0 if x is known to be real.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The a e (calc-simplify-extended) [esimplify] command
is like a s
except that it applies some additional simplifications which are not
"safe" in all cases. Use this only if you know the values in your
formula lie in the restricted ranges for which these simplifications
are valid. The symbolic integrator uses a e;
one effect of this is that the integrator's results must be used with
caution. Where an integral table will often attach conditions like
"for positive a only," Calc (like most other symbolic
integration programs) will simply produce an unqualified result.
Because a e's simplifications are unsafe, it is sometimes better to type C-u -3 a v, which does extended simplification only on the top level of the formula without affecting the sub-formulas. In fact, C-u -3 j v allows you to target extended simplification to any specific part of a formula.
The variable ExtSimpRules contains rewrites to be applied by
the a e command. These are applied in addition to
EvalRules and AlgSimpRules. (The a r AlgSimpRules
step described above is simply followed by an a r ExtSimpRules step.)
Following is a complete list of "unsafe" simplifications performed by a e.
Inverse trigonometric or hyperbolic functions, called with their corresponding non-inverse functions as arguments, are simplified by a e. For example, arcsin(sin(x)) changes to x. Also, arcsin(cos(x)) and arccos(sin(x)) both change to pi/2 - x. These simplifications are unsafe because they are valid only for values of x in a certain range; outside that range, values are folded down to the 360-degree range that the inverse trigonometric functions always produce.
Powers of powers (x^a)^b are simplified to x^(a b) for all a and b. These results will be valid only in a restricted range of x; for example, in (x^2)^1:2 the powers cancel to get x, which is valid for positive values of x but not for negative or complex values.
Similarly, sqrt(x^a) and sqrt(x)^a are both simplified (possibly unsafely) to x^(a/2).
Forms like sqrt(1 - sin(x)^2) are simplified to, e.g.,
cos(x). Calc has identities of this sort for sin,
cos, tan, sinh, and cosh.
Arguments of square roots are partially factored to look for squared terms that can be extracted. For example, sqrt(a^2 b^3 + a^3 b^2) simplifies to a b sqrt(a+b).
The simplifications of ln(exp(x)), ln(e^x), and log10(10^x) to x are also unsafe because of problems with principal values (although these simplifications are safe if x is known to be real).
Common factors are cancelled from products on both sides of an equation, even if those factors may be zero: a x / b x to a / b. Such factors are never cancelled from inequalities: Even a e is not bold enough to reduce a x < b x to a < b (or a > b, depending on whether you believe x is positive or negative). The a M / command can be used to divide a factor out of both sides of an inequality.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The simplifications described in this section are applied by the
u s (calc-simplify-units) command. These are in addition
to the regular a s (but not a e) simplifications described
earlier. See section 13.1 Basic Operations on Units.
The variable UnitSimpRules contains rewrites to be applied by
the u s command. These are applied in addition to EvalRules
and AlgSimpRules.
Scalar mode is automatically put into effect when simplifying units. See section 8.4.6 Matrix and Scalar Modes.
Sums a + b involving units are simplified by extracting the units of a as if by the u x command (call the result u_a), then simplifying the expression b / u_a using u b and u s. If the result has units then the sum is inconsistent and is left alone. Otherwise, it is rewritten in terms of the units u_a.
If units auto-ranging mode is enabled, products or quotients in which the first argument is a number which is out of range for the leading unit are modified accordingly.
When cancelling and combining units in products and quotients,
Calc accounts for unit names that differ only in the prefix letter.
For example, `2 km m' is simplified to `2000 m^2'.
However, compatible but different units like ft and in
are not combined in this way.
Quotients a / b are simplified in three additional ways. First, if b is a number or a product beginning with a number, Calc computes the reciprocal of this number and moves it to the numerator.
Second, for each pair of unit names from the numerator and denominator of a quotient, if the units are compatible (e.g., they are both units of area) then they are replaced by the ratio between those units. For example, in `3 s in N / kg cm' the units `in / cm' will be replaced by 2.54.
Third, if the units in the quotient exactly cancel out, so that a u b command on the quotient would produce a dimensionless number for an answer, then the quotient simplifies to that number.
For powers and square roots, the "unsafe" simplifications (a b)^c to a^c b^c, (a/b)^c to a^c / b^c, and (a^b)^c to a^(b c) are done if the powers are real numbers. (These are safe in the context of units because all numbers involved can reasonably be assumed to be real.)
Also, if a unit name is raised to a fractional power, and the
base units in that unit name all occur to powers which are a
multiple of the denominator of the power, then the unit name
is expanded out into its base units, which can then be simplified
according to the previous paragraph. For example, `acre^1.5'
is simplified by noting that 1.5 = 3:2, that `acre'
is defined in terms of `m^2', and that the 2 in the power of
m is a multiple of 2 in 3:2. Thus, acre^1.5 is
replaced by approximately
(4046 m^2)^1.5, which is then
changed to
4046^1.5 (m^2)^1.5, then to 257440 m^3.
The functions float, frac, clean, abs,
as well as floor and the other integer truncation functions,
applied to unit names or products or quotients involving units, are
simplified. For example, `round(1.6 in)' is changed to
`round(1.6) round(in)'; the lefthand term evaluates to 2,
and the righthand term simplifies to in.
The functions sin, cos, and tan with arguments
that have angular units like rad or arcmin are
simplified by converting to base units (radians), then evaluating
with the angular mode temporarily set to radians.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A polynomial is a sum of terms which are coefficients times various powers of a "base" variable. For example, 2 x^2 + 3 x - 4 is a polynomial in x. Some formulas can be considered polynomials in several different variables: 1 + 2 x + 3 y + 4 x y^2 is a polynomial in both x and y. Polynomial coefficients are often numbers, but they may in general be any formulas not involving the base variable.
The a f (calc-factor) [factor] command factors a
polynomial into a product of terms. For example, the polynomial
x^3 + 2 x^2 + x is factored into `x*(x+1)^2'. As another
example, a c + b d + b c + a d is factored into the product
(a + b) (c + d).
Calc currently has three algorithms for factoring. Formulas which are linear in several variables, such as the second example above, are merged according to the distributive law. Formulas which are polynomials in a single variable, with constant integer or fractional coefficients, are factored into irreducible linear and/or quadratic terms. The first example above factors into three linear terms (x, x+1, and x+1 again). Finally, formulas which do not fit the above criteria are handled by the algebraic rewrite mechanism.
Calc's polynomial factorization algorithm works by using the general root-finding command (a P) to solve for the roots of the polynomial. It then looks for roots which are rational numbers or complex-conjugate pairs, and converts these into linear and quadratic terms, respectively. Because it uses floating-point arithmetic, it may be unable to find terms that involve large integers (whose number of digits approaches the current precision). Also, irreducible factors of degree higher than quadratic are not found, and polynomials in more than one variable are not treated. (A more robust factorization algorithm may be included in a future version of Calc.)
The rewrite-based factorization method uses rules stored in the variable
FactorRules. See section 12.11 Rewrite Rules, for a discussion of the
operation of rewrite rules. The default FactorRules are able
to factor quadratic forms symbolically into two linear terms,
(a x + b) (c x + d). You can edit these rules to include other
cases if you wish. To use the rules, Calc builds the formula
`thecoefs(x, [a, b, c, ...])' where x is the polynomial
base variable and a, b, etc., are polynomial coefficients
(which may be numbers or formulas). The constant term is written first,
i.e., in the a position. When the rules complete, they should have
changed the formula into the form `thefactors(x, [f1, f2, f3, ...])'
where each fi should be a factored term, e.g., `x - ai'.
Calc then multiplies these terms together to get the complete
factored form of the polynomial. If the rules do not change the
thecoefs call to a thefactors call, a f leaves the
polynomial alone on the assumption that it is unfactorable. (Note that
the function names thecoefs and thefactors are used only
as placeholders; there are no actual Calc functions by those names.)
The H a f [factors] command also factors a polynomial,
but it returns a list of factors instead of an expression which is the
product of the factors. Each factor is represented by a sub-vector
of the factor, and the power with which it appears. For example,
x^5 + x^4 - 33 x^3 + 63 x^2 factors to (x + 7) x^2 (x - 3)^2
in a f, or to [ [x, 2], [x+7, 1], [x-3, 2] ] in H a f.
If there is an overall numeric factor, it always comes first in the list.
The functions factor and factors allow a second argument
when written in algebraic form; `factor(x,v)' factors x with
respect to the specific variable v. The default is to factor with
respect to all the variables that appear in x.
The a c (calc-collect) [collect] command rearranges a
formula as a
polynomial in a given variable, ordered in decreasing powers of that
variable. For example, given 1 + 2 x + 3 y + 4 x y^2 on
the stack, a c x would produce (2 + 4 y^2) x + (1 + 3 y),
and a c y would produce (4 x) y^2 + 3 y + (1 + 2 x).
The polynomial will be expanded out using the distributive law as
necessary: Collecting x in (x - 1)^3 produces
x^3 - 3 x^2 + 3 x - 1. Terms not involving x will
not be expanded.
The "variable" you specify at the prompt can actually be any expression: a c ln(x+1) will collect together all terms multiplied by `ln(x+1)' or integer powers thereof. If `x' also appears in the formula in a context other than `ln(x+1)', a c will treat those occurrences as unrelated to `ln(x+1)', i.e., as constants.
The a x (calc-expand) [expand] command expands an
expression by applying the distributive law everywhere. It applies to
products, quotients, and powers involving sums. By default, it fully
distributes all parts of the expression. With a numeric prefix argument,
the distributive law is applied only the specified number of times, then
the partially expanded expression is left on the stack.
The a x and j D commands are somewhat redundant. Use a x if you want to expand all products of sums in your formula. Use j D if you want to expand a particular specified term of the formula. There is an exactly analogous correspondence between a f and j M. (The j D and j M commands also know many other kinds of expansions, such as `exp(a + b) = exp(a) exp(b)', which a x and a f do not do.)
Calc's automatic simplifications will sometimes reverse a partial expansion. For example, the first step in expanding (x+1)^3 is to write (x+1) (x+1)^2. If a x stops there and tries to put this formula onto the stack, though, Calc will automatically simplify it back to (x+1)^3 form. The solution is to turn simplification off first (see section 8.5 Simplification Modes), or to run a x without a numeric prefix argument so that it expands all the way in one step.
The a a (calc-apart) [apart] command expands a
rational function by partial fractions. A rational function is the
quotient of two polynomials; apart pulls this apart into a
sum of rational functions with simple denominators. In algebraic
notation, the apart function allows a second argument that
specifies which variable to use as the "base"; by default, Calc
chooses the base variable automatically.
The a n (calc-normalize-rat) [nrat] command
attempts to arrange a formula into a quotient of two polynomials.
For example, given 1 + (a + b/c) / d, the result would be
(b + a c + c d) / c d. The quotient is reduced, so that
a n will simplify (x^2 + 2x + 1) / (x^2 - 1) by dividing
out the common factor x + 1, yielding (x + 1) / (x - 1).
The a \ (calc-poly-div) [pdiv] command divides
two polynomials u and v, yielding a new polynomial
q. If several variables occur in the inputs, the inputs are
considered multivariate polynomials. (Calc divides by the variable
with the largest power in u first, or, in the case of equal
powers, chooses the variables in alphabetical order.) For example,
dividing x^2 + 3 x + 2 by x + 2 yields x + 1.
The remainder from the division, if any, is reported at the bottom
of the screen and is also placed in the Trail along with the quotient.
Using pdiv in algebraic notation, you can specify the particular
variable to be used as the base: `pdiv(a,b,x)'.
If pdiv is given only two arguments (as is always the case with
the a \ command), then it does a multivariate division as outlined
above.
The a % (calc-poly-rem) [prem] command divides
two polynomials and keeps the remainder r. The quotient
q is discarded. For any formulas a and b, the
results of a \ and a % satisfy a = q b + r.
(This is analogous to plain \ and %, which compute the
integer quotient and remainder from dividing two numbers.)
The a / (calc-poly-div-rem) [pdivrem] command
divides two polynomials and reports both the quotient and the
remainder as a vector [q, r]. The H a / [pdivide]
command divides two polynomials and constructs the formula
q + r/b on the stack. (Naturally if the remainder is zero,
this will immediately simplify to q.)
The a g (calc-poly-gcd) [pgcd] command computes
the greatest common divisor of two polynomials. (The GCD actually
is unique only to within a constant multiplier; Calc attempts to
choose a GCD which will be unsurprising.) For example, the a n
command uses a g to take the GCD of the numerator and denominator
of a quotient, then divides each by the result using a \. (The
definition of GCD ensures that this division can take place without
leaving a remainder.)
While the polynomials used in operations like a / and a g often have integer coefficients, this is not required. Calc can also deal with polynomials over the rationals or floating-point reals. Polynomials with modulo-form coefficients are also useful in many applications; if you enter `(x^2 + 3 x - 1) mod 5', Calc automatically transforms this into a polynomial over the field of integers mod 5: `(1 mod 5) x^2 + (3 mod 5) x + (4 mod 5)'.
Congratulations and thanks go to Ove Ewerlid
(ewerlid@mizar.DoCS.UU.SE), who contributed many of the
polynomial routines used in the above commands.
See section 12.6.3 Decomposing Polynomials, for several useful functions for extracting the individual coefficients of a polynomial.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The following calculus commands do not automatically simplify their
inputs or outputs using calc-simplify. You may find it helps
to do this by hand by typing a s or a e. It may also help
to use a x and/or a c to arrange a result in the most
readable way.
| 12.5.1 Differentiation | ||
| 12.5.2 Integration | ||
| 12.5.3 Customizing the Integrator | ||
| 12.5.4 Numerical Integration | ||
| 12.5.5 Taylor Series |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The a d (calc-derivative) [deriv] command computes
the derivative of the expression on the top of the stack with respect to
some variable, which it will prompt you to enter. Normally, variables
in the formula other than the specified differentiation variable are
considered constant, i.e., `deriv(y,x)' is reduced to zero. With
the Hyperbolic flag, the tderiv (total derivative) operation is used
instead, in which derivatives of variables are not reduced to zero
unless those variables are known to be "constant," i.e., independent
of any other variables. (The built-in special variables like pi
are considered constant, as are variables that have been declared
const; see section 8.6 Declarations.)
With a numeric prefix argument n, this command computes the nth derivative.
When working with trigonometric functions, it is best to switch to radians mode first (with m r). The derivative of `sin(x)' in degrees is `(pi/180) cos(x)', probably not the expected answer!
If you use the deriv function directly in an algebraic formula,
you can write `deriv(f,x,x0)' which represents the derivative
of f with respect to x, evaluated at the point
x=x0.
If the formula being differentiated contains functions which Calc does
not know, the derivatives of those functions are produced by adding
primes (apostrophe characters). For example, `deriv(f(2x), x)'
produces `2 f'(2 x)', where the function f' represents the
derivative of f.
For functions you have defined with the Z F command, Calc expands
the functions according to their defining formulas unless you have
also defined f' suitably. For example, suppose we define
`sinc(x) = sin(x)/x' using Z F. If we then differentiate
the formula `sinc(2 x)', the formula will be expanded to
`sin(2 x) / (2 x)' and differentiated. However, if we also
define `sinc'(x) = dsinc(x)', say, then Calc will write the
result as `2 dsinc(2 x)'. See section 19.4 Programming with Formulas.
For multi-argument functions `f(x,y,z)', the derivative with respect
to the first argument is written `f'(x,y,z)'; derivatives with
respect to the other arguments are `f'2(x,y,z)' and `f'3(x,y,z)'.
Various higher-order derivatives can be formed in the obvious way, e.g.,
`f'''(x) (the second derivative of f) or
`f'''2'3(x,y,z) (f differentiated with respect to each
argument once).
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The a i (calc-integral) [integ] command computes the
indefinite integral of the expression on the top of the stack with
respect to a variable. The integrator is not guaranteed to work for
all integrable functions, but it is able to integrate several large
classes of formulas. In particular, any polynomial or rational function
(a polynomial divided by a polynomial) is acceptable. (Rational functions
don't have to be in explicit quotient form, however;
x/(1+x^-2)
is not strictly a quotient of polynomials, but it is equivalent to
x^3/(x^2+1), which is.) Also, square roots of terms involving
x and x^2 may appear in rational functions being
integrated. Finally, rational functions involving trigonometric or
hyperbolic functions can be integrated.
If you use the integ function directly in an algebraic formula,
you can also write `integ(f,x,v)' which expresses the resulting
indefinite integral in terms of variable v instead of x.
With four arguments, `integ(f(x),x,a,b)' represents a definite
integral from a to b.
Please note that the current implementation of Calc's integrator sometimes produces results that are significantly more complex than they need to be. For example, the integral Calc finds for 1/(x+sqrt(x^2+1)) is several times more complicated than the answer Mathematica returns for the same input, although the two forms are numerically equivalent. Also, any indefinite integral should be considered to have an arbitrary constant of integration added to it, although Calc does not write an explicit constant of integration in its result. For example, Calc's solution for 1/(1+tan(x)) differs from the solution given in the CRC Math Tables by a constant factor of pi i / 2, due to a different choice of constant of integration.
The Calculator remembers all the integrals it has done. If conditions
change in a way that would invalidate the old integrals, say, a switch
from degrees to radians mode, then they will be thrown out. If you
suspect this is not happening when it should, use the
calc-flush-caches command; see section 5.11.3 Caches.
Calc normally will pursue integration by substitution or integration by
parts up to 3 nested times before abandoning an approach as fruitless.
If the integrator is taking too long, you can lower this limit by storing
a number (like 2) in the variable IntegLimit. (The s I
command is a convenient way to edit IntegLimit.) If this variable
has no stored value or does not contain a nonnegative integer, a limit
of 3 is used. The lower this limit is, the greater the chance that Calc
will be unable to integrate a function it could otherwise handle. Raising
this limit allows the Calculator to solve more integrals, though the time
it takes may grow exponentially. You can monitor the integrator's actions
by creating an Emacs buffer called *Trace*. If such a buffer
exists, the a i command will write a log of its actions there.
If you want to manipulate integrals in a purely symbolic way, you can set the integration nesting limit to 0 to prevent all but fast table-lookup solutions of integrals. You might then wish to define rewrite rules for integration by parts, various kinds of substitutions, and so on. See section 12.11 Rewrite Rules.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Calc has two built-in rewrite rules called IntegRules and
IntegAfterRules which you can edit to define new integration
methods. See section 12.11 Rewrite Rules. At each step of the integration process,
Calc wraps the current integrand in a call to the fictitious function
`integtry(expr,var)', where expr is the
integrand and var is the integration variable. If your rules
rewrite this to be a plain formula (not a call to integtry), then
Calc will use this formula as the integral of expr. For example,
the rule `integtry(mysin(x),x) := -mycos(x)' would define a rule to
integrate a function mysin that acts like the sine function.
Then, putting `4 mysin(2y+1)' on the stack and typing a i y
will produce the integral `-2 mycos(2y+1)'. Note that Calc has
automatically made various transformations on the integral to allow it
to use your rule; integral tables generally give rules for
`mysin(a x + b)', but you don't need to use this much generality
in your IntegRules.
As a more serious example, the expression `exp(x)/x' cannot be
integrated in terms of the standard functions, so the "exponential
integral" function
Ei(x) was invented to describe it.
We can get Calc to do this integral in terms of a made-up Ei
function by adding the rule `[integtry(exp(x)/x, x) := Ei(x)]'
to IntegRules. Now entering `exp(2x)/x' on the stack
and typing a i x yields `Ei(2 x)'. This new rule will
work with Calc's various built-in integration methods (such as
integration by substitution) to solve a variety of other problems
involving Ei: For example, now Calc will also be able to
integrate `exp(exp(x))' and `ln(ln(x))' (to get `Ei(exp(x))'
and `x ln(ln(x)) - Ei(ln(x))', respectively).
Your rule may do further integration by calling integ. For
example, `integtry(twice(u),x) := twice(integ(u))' allows Calc
to integrate `twice(sin(x))' to get `twice(-cos(x))'.
Note that integ was called with only one argument. This notation
is allowed only within IntegRules; it means "integrate this
with respect to the same integration variable." If Calc is unable
to integrate u, the integration that invoked IntegRules
also fails. Thus integrating `twice(f(x))' fails, returning the
unevaluated integral `integ(twice(f(x)), x)'. It is still legal
to call integ with two or more arguments, however; in this case,
if u is not integrable, twice itself will still be
integrated: If the above rule is changed to `... := twice(integ(u,x))',
then integrating `twice(f(x))' will yield `twice(integ(f(x),x))'.
If a rule instead produces the formula `integsubst(sexpr,
svar)', either replacing the top-level integtry call or
nested anywhere inside the expression, then Calc will apply the
substitution `u = sexpr(svar)' to try to
integrate the original expr. For example, the rule
`sqrt(a) := integsubst(sqrt(x),x)' says that if Calc ever finds
a square root in the integrand, it should attempt the substitution
`u = sqrt(x)'. (This particular rule is unnecessary because
Calc always tries "obvious" substitutions where sexpr actually
appears in the integrand.) The variable svar may be the same
as the var that appeared in the call to integtry, but
it need not be.
When integrating according to an integsubst, Calc uses the
equation solver to find the inverse of sexpr (if the integrand
refers to var anywhere except in subexpressions that exactly
match sexpr). It uses the differentiator to find the derivative
of sexpr and/or its inverse (it has two methods that use one
derivative or the other). You can also specify these items by adding
extra arguments to the integsubst your rules construct; the
general form is `integsubst(sexpr, svar, sinv,
sprime)', where sinv is the inverse of sexpr (still
written as a function of svar), and sprime is the
derivative of sexpr with respect to svar. If you don't
specify these things, and Calc is not able to work them out on its
own with the information it knows, then your substitution rule will
work only in very specific, simple cases.
Calc applies IntegRules as if by C-u 1 a r IntegRules;
in other words, Calc stops rewriting as soon as any rule in your rule
set succeeds. (If it weren't for this, the `integsubst(sqrt(x),x)'
example above would keep on adding layers of integsubst calls
forever!)
Another set of rules, stored in IntegSimpRules, are applied
every time the integrator uses a s to simplify an intermediate
result. For example, putting the rule `twice(x) := 2 x' into
IntegSimpRules would tell Calc to convert the twice
function into a form it knows whenever integration is attempted.
One more way to influence the integrator is to define a function with the Z F command (see