Difference between revisions of "FactoringAndExpanding"

From WeBWorK_wiki
Jump to navigation Jump to search
Line 74: Line 74:
 
$p[0] = $h**2 - $k;
 
$p[0] = $h**2 - $k;
 
$p[1] = 2*$h;
 
$p[1] = 2*$h;
 
 
$standardform = Compute("x^2 - $p[1] x + $p[0]");
 
$standardform = Compute("x^2 - $p[1] x + $p[0]");
   

Revision as of 00:41, 14 April 2010

Factoring and Expanding in Student Answers


This is the PG code to check answers that require students to factor or expand a polynomial expression.


  • Example 1: (Recommended) Using the LimitedPowers context for factoring and the LimitedPolynomial context for expanding.
  • Example 2: Using adaptive parameters and a MultiAnswer for factoring and the LimitedPolynomial context for expanding.


Example 1: (Recommended) Using the LimitedPowers context for factoring and the LimitedPolynomial context for expanding.

Problem Techniques Index

PG problem file Explanation
DOCUMENT();
loadMacros(
"PGstandard.pl",
"MathObjects.pl",
"contextLimitedPolynomial.pl",
"contextLimitedPowers.pl",
);

TEXT(beginproblem()); 

Initialization: We need all of these macros.

Context("LimitedPolynomial-Strict");
#
#  vertex form of quadratic
#
$n = list_random(4,6);
$a = random(2,4,1);
$b = ($a+$n);
$h = $n/2;
$k = $h**2+$a*$b;
$vertexform = Compute("(x-$h)^2-$k");

#
#  standard form of quadratic
#
$p[0] = $h**2 - $k;
$p[1] = 2*$h;
$standardform = Compute("x^2 - $p[1] x + $p[0]");

#
#  factored form of quadratic
#  
Context("Numeric");
LimitedPowers::OnlyIntegers(
minPower => 0, maxPower => 1,
message => "either 0 or 1",
);
$factoredform = Compute("(x+$a)(x-$b)");

Setup: To construct this quadratic, we choose a nice factored form (x+$a)(x-$b) and from this we construct its vertex form (a(x-h)^2+k) and standard form (ax^2+bx+c). For the expanded form we use the LimitedPolynomial-Strict context, construct the coefficients $p[0] and $p[1] as Perl reals, and then construct $standardform using these pre-computed coefficients. This is because the LimitedPolynomial-Strict context balks at answers that are not already simplified completely. For the factored form we need to change to the Numeric context and restrict the allowed powers to either 0 or 1 using the LimitedPowers::OnlyIntegers block of code.

Context()->texStrings;
BEGIN_TEXT
The quadratic expression \( $vertexform \)
is written in vertex form.
$BR
$BR
(a) Write the expression in standard form 
\( ax^2 + bx + c \).
$BR
\{ ans_rule(30) \}
$BR
$BR
(a) Write the expression in factored form
\( k(ax+b)(cx+d) \).
$BR
\{ ans_rule(30)\}
END_TEXT
Context()->normalStrings;

Main Text: Everything here is as usual.

$showPartialCorrectAnswers = 1;

ANS( $standardform->cmp() );
ANS( $factoredform->cmp() );

ENDDOCUMENT(); 

Answer Evaluation: Everything is as expected.




Example 2: Using adaptive parameters and a MultiAnswer for factoring and the LimitedPolynomial context for expanding.


Problem Techniques Index

PG problem file Explanation
DOCUMENT();

loadMacros(
"PGstandard.pl",
"MathObjects.pl",
"parserMultiAnswer.pl",
);

TEXT(beginproblem());

Initialization: We need to include the parserMultiAnswer.pl answer checker so we can take student answers from multiple answer blanks and check them as a whole.

Context("Numeric");

$fac1 = Compute("(2 x + 3)");
$fac2 = Compute("(8 x + 12)");

$multians = MultiAnswer($fac1,$fac2)->with(
   singleResult => 0,
   allowBlankAnswers => 0,

#  singleResult => 1,  
#  separator => " * ",
#  tex_separator => " \cdot ",

  checker => sub {
    my $correct = shift; my $student = shift; my $ansHash = shift;
    my ($F,$G) = @{$correct};
    my ($f,$g) = @{$student};

    $ansHash->setMessage(1,"Neither factor can be constant") 
    unless $f->isFormula;
    $ansHash->setMessage(2,"Neither factor can be constant") 
    unless $g->isFormula;

    #  use an adaptive parameter 'a'
    my $context = Context()->copy;
    $context->flags->set(no_parameters=>0);
    $context->variables->add('a'=>'Parameter');
    my $a = Formula($context,'a');
    $f = Formula($context,$f);
    $g = Formula($context,$g);
    $F = Formula($context,$F);
    $G = Formula($context,$G);

    if ( (($a*$F == $f) && ($F*$G == $f*$g)) ||
         (($a*$G == $f) && ($F*$G == $f*$g))
       ) 
    {
       return [1,1];
    } elsif (($a*$F == $f) || ($a*$G == $f)) {
       return [1,0];
    } elsif (($a*$F == $g) || ($a*$G == $g)) {
       return [0,1];
    } else {
       return [0,0];
    }

  }

);

Setup: This is a standard factoring problem for a non-monic polynomial (where the leading coefficient is not 1 or -1). Since it is possible to factor 16x^2 + 48 x + 36 as (2x+3)(8x+12) or (8x+12)(2x+3) or (4x+6)(4x+6), we need to allow any of these three factorizations to be marked correct. The MultiAnswer answer checker allows us to collect student answers from several answer blanks and perform answer evaluation on several answer blanks simultaneously, in particular allowing the factors to be entered in answer blanks in either order. The adaptive parameter allows us to effectively deal with passing a constant between the factors.

The MultiAnswer makes sure that neither factor is constant. Then, it creates a copy of the current context as a local context, and creates an adaptive parameter in this local context. The adaptive parameter will allow us to determine whether each factor in the student's answer is equal to a constant multiple of some factor of the correct answer.

For more details on adaptive parameters and MultiAnswer, please see AdaptiveParameters and MultiAnswerProblems.

Context()->texStrings;
BEGIN_TEXT
Factor the following expression.
$BR
$BR
\( 16 t^2 + 48 t + 36 = \big( \) 
\{$multians->ans_rule(10)\}
\( \big) \big( \) 
\{$multians->ans_rule(10)\}
\( \big) \)
END_TEXT
Context()->normalStrings;

Main Text: Each answer blank must be a method of the $multians object, which is why we use $multians->ans_rule(10). The big parentheses will help students understand what the format of the answer should be.

$showPartialCorrectAnswers = 1;

install_problem_grader(~~&std_problem_grader);

ANS( $multians->cmp() );

ENDDOCUMENT(); 

Answer Evaluation: Everything is as expected. We give students feedback on whether their answers are correct by using $showPartialCorrectAnswers = 1;, but withhold credit until both factors are correct by using the standard problem grader.

Problem Techniques Index