|
|
1 | =head1 NAME |
|
|
2 | |
|
|
3 | parserFormulaUpToConstant.pl - implements formulas "plus a constant". |
|
|
4 | |
|
|
5 | =head1 DESCRIPTION |
|
|
6 | |
|
|
7 | This file implements the FormulaUpToConstant object, which is |
|
|
8 | a formula that is only unique up to a constant (i.e., this is |
|
|
9 | an anti-derivative). Students must include the "+C" as part of |
|
|
10 | their answers, but they can use any (single-letter) constant that |
|
|
11 | they want, and it doesn't have to be the one the professor used. |
|
|
12 | |
|
|
13 | To use FormulaWithConstat objects, load this macro file at the |
|
|
14 | top of your problem: |
|
|
15 | |
|
|
16 | loadMacros("parserFormulaUpToConstant.pl"); |
|
|
17 | |
|
|
18 | then create a formula with constant as follows: |
|
|
19 | |
|
|
20 | $f = FormulaUpToConstant("sin(x)+C"); |
|
|
21 | |
|
|
22 | Note that the C should NOT already be a variable in the Context; |
|
|
23 | the FormulaUpToConstant object will handle adding it in for |
|
|
24 | you. If you don't include a constant in your formula (i.e., if |
|
|
25 | all the variables that you used are already in your Context, |
|
|
26 | then the FormulaUpToConstant object will add "+C" for you. |
|
|
27 | |
|
|
28 | The FormulaUpToConstant should work like any normal Formula, |
|
|
29 | and in particular, you use $f->cmp to get its answer checker. |
|
|
30 | |
|
|
31 | ANS($f->cmp); |
|
|
32 | |
|
|
33 | Note that the FormulaUpToConstant object creates its only private |
|
|
34 | copy of the current Context (so that it can add variables without |
|
|
35 | affecting the rest of the problem). You should not notice this |
|
|
36 | in general, but if you need to access that context, use $f->{context}. |
|
|
37 | E.g. |
|
|
38 | |
|
|
39 | Context($f->{context}); |
|
|
40 | |
|
|
41 | would make the current context the one being used by the |
|
|
42 | FormulaUpToConstant, while |
|
|
43 | |
|
|
44 | $f->{context}->variables->names |
|
|
45 | |
|
|
46 | would return a list of the variables in the private context. |
|
|
47 | |
|
|
48 | To get the name of the constant in use in the formula, |
|
|
49 | use |
|
|
50 | |
|
|
51 | $f->constant. |
|
|
52 | |
|
|
53 | If you combine a FormulaUpToConstant with other formulas, |
|
|
54 | the result will be a new FormulaUpToConstant object, with |
|
|
55 | a new Context, and potentially a new + C added to it. This |
|
|
56 | is likely not what you want. Instead, you should convert |
|
|
57 | back to a Formula first, then combine with other objects, |
|
|
58 | then convert back to a FormulaUpToConstant, if necessary. |
|
|
59 | To do this, use the removeConstant() method: |
|
|
60 | |
|
|
61 | $f = FormulaUpToConstant("sin(x)+C"); |
|
|
62 | $g = Formula("cos(x)"); |
|
|
63 | $h = $f->removeConstant + $g; # $h will be "sin(x)+cos(x)" |
|
|
64 | $h = FormulaUpToConstant($h); # $h will be "sin(x)+cos(x)+C" |
|
|
65 | |
|
|
66 | The answer evaluator by default will give "helpful" messages |
|
|
67 | to the student when the "+ C" is left out. You can turn off |
|
|
68 | these messages using the showHints option to the cmp() method: |
|
|
69 | |
|
|
70 | ANS($f->cmp(showHints => 0)); |
|
|
71 | |
|
|
72 | One of the hints is about whether the student's answer is linear |
|
|
73 | in the arbitrary constant. This test requires differentiating |
|
|
74 | the student answer. Since there are times when that could be |
|
|
75 | problematic, you can disable that test via the showLinearityHints |
|
|
76 | flag. (Note: setting showHints to 0 also disables these hints.) |
|
|
77 | |
|
|
78 | ANS($f->cmp(showLinearityHints => 0)); |
|
|
79 | |
|
|
80 | =cut |
|
|
81 | |
1 | loadMacros("MathObjects.pl"); |
82 | loadMacros("MathObjects.pl"); |
2 | |
83 | |
3 | sub _parserFormulaUpToConstant_init {FormulaUpToConstant::Init()} |
84 | sub _parserFormulaUpToConstant_init {FormulaUpToConstant::Init()} |
4 | |
|
|
5 | =head1 FormulaUpToConstant(); |
|
|
6 | |
|
|
7 | ###################################################################### |
|
|
8 | # |
|
|
9 | # This file implements the FormulaUpToConstant object, which is |
|
|
10 | # a formula that is only unique up to a constant (i.e., this is |
|
|
11 | # an anti-derivative). Students must include the "+C" as part of |
|
|
12 | # their answers, but they can use any (single-letter) constant that |
|
|
13 | # they want, and it doesn't have to be the one the professor used. |
|
|
14 | # |
|
|
15 | # To use FormulaWithConstat objects, load this macro file at the |
|
|
16 | # top of your problem: |
|
|
17 | # |
|
|
18 | # loadMacros("parserFormulaUpToConstant.pl"); |
|
|
19 | # |
|
|
20 | # then create a formula with constant as follows: |
|
|
21 | # |
|
|
22 | # $f = FormulaUpToConstant("sin(x)+C"); |
|
|
23 | # |
|
|
24 | # Note that the C should NOT already be a variable in the Context; |
|
|
25 | # the FormulaUpToConstant object will handle adding it in for |
|
|
26 | # you. If you don't include a constant in your formula (i.e., if |
|
|
27 | # all the variables that you used are already in your Context, |
|
|
28 | # then the FormulaUpToConstant object will add "+C" for you. |
|
|
29 | # |
|
|
30 | # The FormulaUpToConstant should work like any normal Formula, |
|
|
31 | # and in particular, you use $f->cmp to get its answer checker. |
|
|
32 | # |
|
|
33 | # ANS($f->cmp); |
|
|
34 | # |
|
|
35 | # Note that the FormulaUpToConstant object creates its only private |
|
|
36 | # copy of the current Context (so that it can add variables without |
|
|
37 | # affecting the rest of the problem). You should not notice this |
|
|
38 | # in general, but if you need to access that context, use $f->{context}. |
|
|
39 | # E.g. |
|
|
40 | # |
|
|
41 | # Context($f->{context}); |
|
|
42 | # |
|
|
43 | # would make the current context the one being used by the |
|
|
44 | # FormulaUpToConstant, while |
|
|
45 | # |
|
|
46 | # $f->{context}->variables->names |
|
|
47 | # |
|
|
48 | # would return a list of the variables in the private context. |
|
|
49 | # |
|
|
50 | # To get the name of the constant in use in the formula, |
|
|
51 | # use |
|
|
52 | # |
|
|
53 | # $f->constant. |
|
|
54 | # |
|
|
55 | # If you combine a FormulaUpToConstant with other formulas, |
|
|
56 | # the result will be a new FormulaUpToConstant object, with |
|
|
57 | # a new Context, and potentially a new + C added to it. This |
|
|
58 | # is likely not what you want. Instead, you should convert |
|
|
59 | # back to a Formula first, then combine with other objects, |
|
|
60 | # then convert back to a FormulaUpToConstant, if necessary. |
|
|
61 | # To do this, use the removeConstant() method: |
|
|
62 | # |
|
|
63 | # $f = FormulaUpToConstant("sin(x)+C"); |
|
|
64 | # $g = Formula("cos(x)"); |
|
|
65 | # $h = $f->removeConstant + $g; # $h will be "sin(x)+cos(x)" |
|
|
66 | # $h = FormulaUpToConstant($h); # $h will be "sin(x)+cos(x)+C" |
|
|
67 | # |
|
|
68 | # The answer evaluator by default will give "helpful" messages |
|
|
69 | # to the student when the "+ C" is left out. You can turn off |
|
|
70 | # these messages using the showHints option to the cmp() method: |
|
|
71 | # |
|
|
72 | # ANS($f->cmp(showHints => 0)); |
|
|
73 | # |
|
|
74 | # One of the hints is about whether the student's answer is linear |
|
|
75 | # in the arbitrary constant. This test requires differentiating |
|
|
76 | # the student answer. Since there are times when that could be |
|
|
77 | # problematic, you can disable that test via the showLinearityHints |
|
|
78 | # flag. (Note: setting showHints to 0 also disables these hints.) |
|
|
79 | # |
|
|
80 | # ANS($f->cmp(showLinearityHints => 0)); |
|
|
81 | # |
|
|
82 | ###################################################################### |
|
|
83 | |
|
|
84 | =cut |
|
|
85 | |
85 | |
86 | package FormulaUpToConstant; |
86 | package FormulaUpToConstant; |
87 | @ISA = ('Value::Formula'); |
87 | @ISA = ('Value::Formula'); |
88 | |
88 | |
89 | sub Init { |
89 | sub Init { |