# FormulasToConstants

(Difference between revisions)

## Formulas Up To Constants: PG Code Snippet

This code snippet shows the essential PG code to evaluate antderivative and general antiderivative formulas. Note that these are insertions, not a complete PG file. This code will have to be incorporated into the problem file on which you are working.

There are two types of comparison that we're interested in here: one is "an antiderivative of f(x)", and the other is "the most general antiderivative of f(x)". The former requires that the student answers F(x), F(x)+1, F(x)-sqrt(8), etc., all be marked correct, and the latter, that F(x)+C, F(x)+5-k, etc., all be marked correct. These are both illustrated below.

It is possible to do some of this type of comparison with old-style answer checkers. This is shown in a table below.

PG problem file Explanation
```  loadMacros("parserFormulaUpToConstant.pl");
```

To check the most general antiderivative of a function, that is, a formula up to an arbitrary additive constant, we need to load the `parserFormulaUpToConstant.pl` macros file. To evaluate an antiderivative of a function, that is, a formula that only unique up to a (specified) additive constant, we do not need to load this file.

```  \$func = Formula("sin(x)");
\$gfunc = FormulaUpToConstant("sin(x)+C");
```

In the problem set-up section of the problem file, we define an antiderivative function, `\$func` and the most general antiderivative function, `\$gfunc`. For the latter we are not required to include the `+C`; it would be equivalent to specify `\$gfunc = FormulaUpToConstant("sin(x)")`.

```  BEGIN_TEXT
An antiderivative of \(cos(x)\) is
\{ ans_rule(15) \}
\$BR
The most general antiderivative is
\{ ans_rule(15) \}
END_TEXT
```

In the text section of the file we ask for the answers as usual.

```  ANS( \$func->cmp(upToConstant=>1) );
ANS( \$gfunc->cmp() );
```

And then in the answer and solution section of the file we rely on the MathObjects `cmp()` method. By specifying the `upToConstant=>1` flag for `cmp()`, we allow the student's answer to differ from the correct answer by any specific constant. For the `FormulaUpToConstant` we don't need this, because those MathObjects already know that they are "up to a constant". Which makes pretty good sense, really.

Note that for the formula up to an arbitrary constant the comparison will correctly mark students' answers that have different arbitrary constants: thus, a student answer of `sin(x)+k` to the second question here will be marked correct.

With old-style answer checkers we can check antiderivatives, but checking the most general antiderivative is much less elegant, as we have to require that the student use a specific constant of integration.

PG problem file Explanation
```  \$func = "sin(x)";
\$gfunc = "sin(x)+C";
```

In this case we need no additional macros, and so do not change the description and tagging or initialization sections of the file. In the problem set-up section we specify the function(s) to evaluate.

```  BEGIN_TEXT
An antiderivative of \(cos(x)\) is
\{ ans_rule(15) \}
\$BR
The most general antiderivative is
\{ ans_rule(15) \}
\$BR
\${BITALIC}(Use "C" for any arbitrary
END_TEXT
```

In the text section of the problem we ask for the functions. Because we require that the most general antiderivative use the constant `C`, however, we should probably remind the student of that fact.

```  ANS( fun_cmp( \$func, mode=>"antider" ) );
ANS( fun_cmp( \$gfunc, mode=>"antider",
var=>["x","C"] ) );
```

When checking the answer in the answer and solutions section of the file, we specify `mode=>"antider"` in the call to the old-style answer checker `fun_cmp`. For the most general antiderivative we also indicate that the variables include the "variable" `C`.