I was wondering if someone could help me program a particular problem. Mike Gage was nice enough to point me to the description of how to deal with multi-answer problems on the wiki, but unfortunately this seems involved to me. (I'd be more comfortable mimicking an existing .pg problem if someone could point one out.)
The problem is a Riemann sum that you have to turn into an integral. The Riemann sum is the sum of:
\frac{\pi}{$a n}
\tan\left(\frac{i \pi}{$p n}\right)
or, in more readable form:
pi/($a*n) tan( (i*pi) / ($p*n) )
(here, $p = $a*$b, where $b is randomly chosen).
The student is supposed to enter the left and right limits of integration and the function.
So if they enter left and right limits P and Q, the answer is:
pi/((Q-P)*$a) tan( pi/((Q-P)$a*$b) (x-P) )
(please correct me if I've screwed this up!)
I'll put the text of the original .pg file below. I am guessing that this would be very easy for someone else. Any help would be greatly appreciated.
Thanks!
Dan
## DESCRIPTION
## Calculus: Areas and Distances
## ENDDESCRIPTION
##KEYWORDS('calculus', 'areas', 'distances')
## Tagged by XW
## DBsubject('Calculus')
## DBchapter('Integrals')
## DBsection('Area and Distance')
## Date('5/30/2005')
## Author('Jeff Holt')
## Institution('UVA')
## TitleText1('Calculus: Early Transcendentals')
## EditionText1('5')
## AuthorText1('Stewart')
## Section1('5.1')
## Problem1('19')
## TitleText2('Calculus: Early Transcendentals')
## EditionText2('6')
## AuthorText2('Stewart')
## Section2('5.1')
## Problem2('')
DOCUMENT();
loadMacros(
"PG.pl",
"PGbasicmacros.pl",
"PGchoicemacros.pl",
"PGanswermacros.pl",
"PGauxiliaryFunctions.pl"
);
TEXT(beginproblem());
$showPartialCorrectAnswers = 1;
$a = random(4,8,2);
$b = random(2,5,1);
$p = $a*$b;
$pi = 3.1415926535898;
TEXT(EV2(<
The value of the limit
\[
\lim_{n\rightarrow\infty}\sum_{i=1}^{n} \frac{\pi}{$a n}
\tan\left(\frac{i \pi}{$p n}\right)
\]
is equal to the area below the graph
of a function \(f(x)\) on an interval \([A,B]\). Find
\(f\), \(A\), and \(B\). (Do not evaluate the limit.)
$BR
$BR
\(f(x)\) = \{ans_rule(20) \}
$BR
$BR
\(A\) = \{ans_rule(20) \}
$BR
$BR
\(B\) = \{ans_rule(20) \}
$BR
EOT
@ans = ( fun_cmp("tan(x/$b)", vars=>"x"), num_cmp(0), num_cmp($pi/$a));
ANS(@ans);
ENDDOCUMENT();
The complete problem didn't come through (because of the << that made Moodle think it was the start of an HTML tag), but I looked it up in the NPL from the tag data.
In any case, the original problem doesn't matter that much. If you are going to make a MultiAnswer problem, it has to be completely rewritten anyway. (Also, that problem uses an older approach to the text output, and should be changed anyway.)
Here is a shell for a problem that accepts P, Q, and a function and checks if the function is of the form given in your message above (depending on P and Q). You will need to write your own text for the problem, and you may want to make additional checks for values of P and Q (like Q > P) if you want those.
loadMacros( "PGstandard.pl", "MathObjects.pl", "parserMultiAnswer.pl", "PGcourse.pl", ); TEXT(beginproblem); $a = random(4,8,2); $b = random(2,5,1); $ma = MultiAnswer(0,1,"(pi/$a) tan((pi/($a*$b))*x)")->with( checker => sub { my ($correct,$student,$ans) = @_; my ($P,$Q,$f) = @$student; $g = Formula("pi/(($Q-$P)*$a) * tan((pi/(($Q-$P)*$a*$b))*(x-$P))"); return $f == $g; } ); BEGIN_TEXT (a = $a, b = $b)$PAR P = \{$ma->ans_rule(5)\}$BR Q = \{$ma->ans_rule(5)\}$BR f = \{$ma->ans_rule(30)\} END_TEXT ANS($ma->cmp); $showPartialCorrectAnswers = 1;
See the parserMultiAnswer.pl file for more details about the options you can set for it. Note that you need to give the MultiAnswer object a correct answer, so it has something to display when students ask for correct answers.
Hope that helps.
Davide
I think I have the problem working the way I want. I'll post the resulting .pg file below. I should be able to use this template in the future for similar problems.
Dan
DOCUMENT();
loadMacros(
"PGstandard.pl",
"MathObjects.pl",
"parserMultiAnswer.pl",
"PGcourse.pl",
);
TEXT(beginproblem);
$a = random(4,8,2);
$b = random(2,5,1);
$ma = MultiAnswer("(pi/$a) tan((pi/($a*$b))*x)",0,1)->with(
checker => sub {
my ($correct,$student,$ans) = @_;
my ($f,$P,$Q) = @$student;
$g = Formula("pi/(($Q-$P)*$a) * tan((pi/(($Q-$P)*$a*$b))*(x-$P))");
return $g == $f;
}
);
$a = random(4,8,2);
$b = random(2,5,1);
$p = $a*$b;
$pi = 3.1415926535898;
BEGIN_TEXT;
The value of the limit
\[
\lim_{n\rightarrow\infty}\sum_{i=1}^{n} \frac{\pi}{$a n}
\tan\left(\frac{i \pi}{$p n}\right)
\]
is equal to the area below the graph
of a function \(f(x)\) on an interval \([A,B]\). Find
\(f\), \(A\), and \(B\). (Do not evaluate the limit.)
$BR
$BR
\(f(x)\) = \{$ma->ans_rule(30) \}
$BR
$BR
\(A\) = \{$ma->ans_rule(5) \}
$BR
$BR
\(B\) = \{$ma->ans_rule(5) \}
$BR
END_TEXT;
ANS($ma->cmp);
$showPartialCorrectAnswers = 1;
ENDDOCUMENT();
Looks good. Note that you don't need to set a value for $pi because you never use it. In any case, there is already a variable $PI that contains the most precise version that perl can store, and there is also a function pi that returns the same value, so there is no need ever to write it out by hand.
Davide