# contextPiecewiseFunction.pl - Allow usage of piecewise functions.

### From WeBWorK

# NAME

contextPiecewiseFunction.pl - Allow usage of piecewise functions.

# DESCRIPTION

This file implements a context in which piecewise-defined functions can be specified by students and problem authors. To use it, add

loadMacros("contextPiecewiseFunction.pl");

and then use

Context("PiecewiseFunction");

to select the context for piecewise functions. There are several ways to produce a piecewise function. For example:

$f = Compute("x if x >= 0 else -x"); $f = Compute("x if x >= 0 else -x if x < 0"); $f = Formula("x+1 if x > 2 else 4 if x = 2 else 1-x"); $f = PiecewiseFunction("x^2 if 1 < x <= 2 else 2x+1"); $f = PiecewiseFunction("1 < x <= 2" => "x^2", "2x+1"); $f = PiecewiseFunction("(1,2]" => "x^2", "2x+1"); $f = PiecewiseFunction(Interval("(1,2]") => "x^2", "2x+1");

You can use either `Compute()`

or `Formula()`

interchangeably to
convert a string containing "if" and "else" to the corresponding
PiecewiseFunction. The `PiecewiseFunction()`

constructor can
also do this, or you can pass it a list of interval=>formula
pairs that specify the various branches. If there is an
unpaired final formula, it represents the "otherwise" portion
of the function (the formula to use of the input is not in
any of the given intervals).

Note that you can use Inveral, Set, or Union objects in place of the intervals in the specification of a piecewise function.

The PiecewiseFunction object TeXifies using a LaTeX "cases" environment, so you can use these objects to produce nice output even if you are not asking a student to enter one. For example:

Context("PiecewiseFunction"); $f = Formula("1-x if x > 0 else 4 if x = 0 else 1+x if x < 0"); $a = random(-2,2,.1); Context()->texStrings; BEGIN_TEXT If \[f(x)=$f\] then \(f($a)\) = \{ans_rule(20)\}. END_TEXT Context()->normalStrings; ANS($f->eval(x=>$a)->cmp);

Normally when you use a piecewise function at the end of a sentence, the period is placed at the end of the last case. Since

\[ f(x) = $f \].

would put the period centered at the right-hand side of the function, this is not what is desired. To get a period at the end of the last case, use

\[ f(x) = \{$f->with(final_period=>1)\} \]

instead.