WeBWorK Main Forum

why "The domain of your function doesn't match that of the correct answer"

why "The domain of your function doesn't match that of the correct answer"

by Joel Trussell -
Number of replies: 3
a student gets the error message " The domain of your function doesn't match that of the correct answer " for her answer. I can't duplicate the problem with my answers or for different versions of the problem. The error occurs only in the first answer, but the next three appear to have the same form - all use s as the variable. The last uses t. I changes the type of s to Complex and that removes the error for the domain, but counts the answer wrong, when it is right. The seed for the student is 2992. (BTW - I tried changing the seed when signed on as me but couldn't get the student's parameters. The parameters do change when I ask for a different version of the problem.)

code follows

# DESCRIPTION
# Problem from 'Mathematics: The Language of Electrical and Computer Engineering', Viniotis and Trussell, 3rd ed.
# WeBWorK problem written by Joel Trussell, <hjt@ncsu.edu>
# ENDDESCRIPTION

## DBsubject(Electrical Engineering)
## DBchapter(Laplace Transforms)
## DBsection(Problems)
## Institution(North Carolina State University)
## Author(H. J. Trussell)
## TitleText1('Mathematics: The Language of Electrical and Computer Engineering')
## AuthorText1('Viniotis and Trussell')
## EditionText1('3')
## Problem1('8.16-21')


##############################
# Initialization

DOCUMENT();

loadMacros(
"PGstandard.pl",
"MathObjects.pl",
"AnswerFormatHelp.pl",
"PGunion.pl",
"unorderedAnswer.pl",
"parserMultiAnswer.pl",
"parserFunction.pl",
"unionLists.pl",
"answerHints.pl",
"PGcomplexmacros.pl",
"PGauxiliaryFunctions.pl",
"PGcourse.pl",
);

TEXT(beginproblem());


#############################
# Setup

Context("Complex");
Context()->variables->are(
s=>"Real",
t=>"Real"
);

# Redefine the Heaviside function so the answer checker will take either 1 or #h(t).
#parserFunction("h(t)" => "1");
# skip above and use step - need to assign it
## required to use step function
Context()->functions->add(
step => {
class => 'Parser::Legacy::Numeric',
perl => 'Parser::Legacy::Numeric::do_step'
},
);
parserFunction("u(t)" => "step(t)");

Context()->flags->set(
tolerance => 0.001,
tolType => "absolute",
);


# create differential equation with roots below
# complex roots for system, real for input
# PFE of c1/(s+r1) + c2/(s-r2) + c3/(s-r3)

$ra = -random(1,9,1); # real part - assure stable r1 < 0
$w = random(1,6,1); # imaginary part - frequency
$r1 = $ra + $w*i;
$r2 = $ra - $w*i; #complex conjugate
$r3 = -random(1,9,1); ; # third root


# c1 and c2 are complex conjugates
$c1r = non_zero_random(-6,6,1); # constant multiplying complex exp.
$c1i = non_zero_random(0,6,1); # constant multiplying complex exp.
$c1 = $c1r + $c1i*i;
$c2 = $c1r - $c1i*i;
$c3 = non_zero_random(-6,6,1); # constant multiplying real exp.

# combine first two roots into quadratic (a*s - b)/(s^2 - d1*s + d0)
$a = $c1 + $c2;
$b = $c1*$r2 + $c2*$r1;
$d1 = ($r1 + $r2);
$d0 = $r1*$r2;

# combine with third root to get form (f2*s^2 -f1*s+f0)/(s^2 - d1*s + d0)/(s-r3)
# this is the form of the Laplace transform of the solution
$f2 = Compute($a + $c3);
$f1 = Compute($b + $a*$r3 + $c3*$d1);
$f0 = Compute($b*$r3 + $c3*$d0);

# constants for DiffEq
$a1 = -($r1 + $r2);
$a0 = $r1*$r2;

# solve for coefficients of diffEq y'' +a1*y'+a0 = A y_s
# where Y_s(s) = A/(s-r3) r3 is real
#we can change this for a 1st order DE and Y_s(s) = (bs+c)/(s-r1)/(s-r2)
# need to solve for A, y(0), y'(0)

$y0 = $c1+$c2+$c3;
$ydot0 = $r3*$y0 - $y0*$d1 -($c1*($r2+$r3)+$c2*($r1+$r3)+$c3*($r1+$r2));
$A = $r3*($ydot0+$y0*(-$r1-$r2)) + $c1*$r2*$r3 + $c2*$r1*$r3 + $c3*$r2*$r1;

# calculate directly: since answer is PFE of c1/(s+r1) + c2/(s-r2) + c3/(s-r3)
# y(t) = c1*e^(r1*t) + c2*e^(r2*t) + c3*e^(r3*t)
$y0 = $c1 + $c2 + $c3;
$ydot0 = $r1*$c1 + $r2*$c2 + $r3*$c3;
$A = $c3*(($r3)**2 + $a1*$r3 + $a0);


$frac = Formula(" ($f2*s^2 - $f1*s + $f0 )/((s-$r3)*(s^2 - $d1*s + $d0)) ")->reduce;

$fac1 = Formula("$c1/(s-$r1)")->reduce;
$fac2 = Formula("$c2/(s-$r2)")->reduce;
$fac3 = Formula("$c3/(s-$r3)")->reduce;

$mag = abs($c1)*2;
# compute phi in range [-pi,pi]
if ($c1r > 0 ) {$phi = atan($c1i/$c1r);}
elsif ($c1i > 0) {$phi = atan($c1i/$c1r) + pi;}
else {$phi = atan($c1i/$c1r) - pi;}

$ft = Compute("($mag*e^($ra * t)*cos($w*t+$phi) + $c3*e^($r3*t))*u(t)");


#############################
# Main text

Context()->texStrings;
BEGIN_TEXT
This problem is related to Problems 8.16-21 in the text.

$PAR
Consider the differential equation \( y''(t) + $a1 y'(t) + $a0 y(t) = $A e^{$r3 t} u(t) \),
$BR with initial conditions \( y(0) = $y0,\) and \(y'(0) = $ydot0. \)

$PAR
Find the Laplace transform of the solution \( Y(s). \) Write the solution as a single fraction in \( s \)
$BR
\( Y(s) = \) \{ ans_rule(60)\} \{ AnswerFormatHelp("formulas") \}
$PAR
Find the partial fraction decomposition of \( Y(s) \). Enter all factors as first order terms in \( s \), that is, all terms should be of the form \( \frac{c}{s-p} \), where \( c \) is a constant and the root \( p \) is a constant. Both \( c \) and \( p \) may be complex.
$BR
$BR
\( \displaystyle Y(s) = \) \{ ans_rule(20)\} \(+\) \{ ans_rule(20)\} \(+\) \{ ans_rule(20)\}

$PAR Find the inverse Laplace transform of \( \displaystyle Y(s) \). The solution must consist of all real terms. (Remember to use \( u(t).\))
$BR
$BR
\( \displaystyle y(t) = {\mathcal L}^{-1} \left\lbrace Y(s) \right\rbrace = \)
\{ ans_rule(50) \}
\{ AnswerFormatHelp("formulas") \}


END_TEXT
Context()->normalStrings;


##############################
# Answer evaluation

$showPartialCorrectAnswers = 1;

# note that ALL answers in a problem must be unordered!!
# in this case, the terms are unordered and checked as such, but it is
# highly unlikely anyone would enter the last answer in the wrong place
# but so what if they did

UNORDERED_ANS( $frac-> cmp(), $fac1->cmp(), $fac2->cmp(), $fac3->cmp(), $ft->cmp() );


ENDDOCUMENT();
In reply to Joel Trussell

Re: why "The domain of your function doesn't match that of the correct answer"

by Arnold Pizer -
Hi Joel,

This isn't an answer to your main question but is a comment on the textbook specific note in your problem ("This problem is related to Problems 8.16-21 in the text.").  This isn't the best way to do this since in a few years you or others may want to use this problem and may be using a different edition of the same text or an entirely different textbook.  See 
http://webwork.maa.org/wiki/TextbookSpecificMessages
for a better way to handle this situation.

Arnie
In reply to Joel Trussell

Re: why "The domain of your function doesn't match that of the correct answer"

by Davide Cervone -
The message about the domain not matching comes when the student answer can't be evaluated at one of the test points where the correct answer can be. We can't reproduce the result without knowing the answer the student gave, since that is what generates the message.

It is not something you are going to be able to get rid of, since it is based on the student answer, and they can always create an answer that is not defined where the correct one is (e.g., sqrt(s-5) would cause this error when the default limits for the variable s are used).

The reason that changing s to being complex "works" is because that causes the random points used to test the function to be different, so the particular point that is causing the problem is no longer being tested. (It is also possible that the student's formula included something that is not defined for reals but is for complex, like square roots of negatives, but this seems less likely given the problem.)

It may also help to change the way you are using UNORDERED_ANS(), since that may test every student answer against every professor's answer. You only need the unordered answers for the middle three fractions, not the other two answers. One way to do that would be to break the text into three parts, and use ANS() after the first, UNORDERED_ANS() after the second, and ANS() for the third. (UNORDERED_ANS() must be used directly after the answer blanks that go with it, with no intervening ANS() or ans_rule() calls.)

Alternatively, you can use UNORDERED_NAMED_ANS() instead. Something like

BEGIN_TEXT
...
\(Y(s) = \) \{ NAMED_ANS_RULE('F1',20)\} \(+\) \{ NAMED_ANS_RULE('F2',20)\} \(+\) \{ NAMED_ANS_RULE('F3',20)\}
...
END_TEXT
...
ANS($frac->cmp());
UNORDERED_NAMED_ANS(F1=>$fac1->cmp(), F2=>$fac2->cmp(), F3=>$fac3->cmp());
ANS($ft->cmp());
should work.
In reply to Davide Cervone

Re: why "The domain of your function doesn't match that of the correct answer"

by Joel Trussell -
Thanks - that got me on the right track
I just discovered what was wrong with the student's answer
he wrote s^s  instead of s^2
it is very hard to see the difference between the 2 and the s in the small type

sorry it took such a high-powered consultant to solve an oversight problem, but I appreciate it greatly