WeBWorK Problems

Periodic answers with units

Periodic answers with units

by Joseph Lo -
Number of replies: 0
I am trying to make a problem that accepts periodic answers with units. I have attached the code of a sample question at the end.

For example, the solutions of sin(theta) = 0.5 in the first quadrant can be
theta = pi/6 rad,
theta = 13pi/6 rad etc...
I used the following to check the answer and everything works correctly.

$ansc = Real(pi/6)->with(period=>2*pi);
$ans = NumberWithUnits($ansc,"rad");
ANS($ans->cmp());

On the other hand, I also want to accept
theta = 30 deg
theta = 390 deg, etc...
But the answer checker does not accept "390 deg". It instead accepts "(30 + 2*pi) deg".

For another example, the solutions of sin(at) = 0.5 when a = pi/3 rad/min can be
t = 0.5 min,
t = 6.5 min, etc... (just 1st quadrant for at for now)
The following checker works as long as the unit is in min.

$ansc = Real(0.5)->with(period=>Real(6));
$ans = NumberWithUnits($ansc,"min");
ANS($ans->cmp());

But if students enter their answers in seconds, the answer checker accepts t = 30 s but also "t = 36 s". The period is changed to 6 seconds instead of 6 minutes.

Is there a way for the answer check to appropriately accept a periodic answer with unit? If I need to write a custom answer checker, how can I convert the unit of student's answer to the unit provided in the answer key? Thanks very much for any help or insight.



DOCUMENT();
loadMacros(
"PGbasicmacros.pl",
"PGanswermacros.pl",
"MathObjects.pl",
"parserNumberWithUnits.pl",
);

TEXT(beginproblem());

Context()->texStrings;
BEGIN_TEXT
Find one value of \(\theta\) so that \(\sin(\theta) = \dfrac{1}{2}\) and \(\cos(\theta) = \dfrac{\sqrt{3}}{2}\). Include the \{helpLink("unit")\} in your answer.
$BR
\(\theta = \) \{ans_rule(20)\}
$BR $BR
Find one value of \(t\) so that \(\sin(\omega t) = 0.5\) and \(\cos(\omega t) = \dfrac{\sqrt{3}}{2}\) if \(\omega = \dfrac{\pi}{3}\) rad/min. Include the \{helpLink("unit")\} in your answer.
$BR
\(t = \) \{ans_rule(20)\}
END_TEXT
Context()->normalStrings;

$ansc = Real(pi/6)->with(period=>2*pi);
$ans = NumberWithUnits($ansc,"rad");
ANS($ans->cmp());

$ansc = Real(0.5)->with(period=>Real(6));
$ans = NumberWithUnits($ansc,"min");
ANS($ans->cmp());

ENDDOCUMENT();