VectorParametric2

From WeBWorK_wiki
Revision as of 17:18, 16 June 2013 by Paultpearson (talk | contribs)
Jump to navigation Jump to search

Motion and Velocity with a Parametric Curve

Click to enlarge

This PG code shows how to construct a custom answer checker that extracts the component functions from the student's answer and makes some derivative calculations with them.


Templates by Subject Area

PG problem file Explanation

Problem tagging data

Problem tagging:

DOCUMENT();

loadMacros(
"PGstandard.pl",
"MathObjects.pl",
"parserVectorUtils.pl",
"AnswerFormatHelp.pl",
);

TEXT(beginproblem());

Initialization: Although not necessary for the code below, we load parserVectorUtils.pl because you may want to use some of its methods when you use this template file.

Context("Vector2D");
#Context("Vector"); # for 3D vectors
Context()->variables->are(t=>"Real");
Context()->variables->set(t=>{limits=>[0,5]});
Context()->flags->set( ijk=>0 );

$answer = Vector("<2t,(2t)^2>");

Setup: We choose not to display the answer using ijk notation.

Context()->texStrings;
BEGIN_TEXT
Find a vector parametric function \( \vec{r}(t) \) 
for a bug that moves along the parabola \( y = x^2 \) 
with velocity \( \vec{v}(t) = \langle 2, 8t \rangle \) 
for all \( t \).
$BR
$BR
\( \vec{r}(t) = \) 
\{ ans_rule(20) \}
\{ AnswerFormatHelp("vectors") \} 
END_TEXT
Context()->normalStrings;

Main Text:

$showPartialCorrectAnswers = 1;

sub components {

  my $V = shift;
  $V = $V->perl;

  if ( $V =~ m/Value/ ) {

    $V =~ s/Value::Vector->new~~(//g;
    $V = substr($V, 0, -1);
    $V =~ s/Value::Real->new//g;
    $V =~ s/~~$//g;
    $V =~ s/ //g;
    return split(',',$V);

  } else {

    $V =~ s/~~* i~~)/~~),/g;
    $V =~ s/~~* j~~)/~~),/g;
    $V =~ s/~~* k~~)/~~),/g;
    $V =~ s/~~$//g;
    $V =~ s/ //g;
    $V = substr($V, 0, -1);
    return split(',',$V);

  }

}


sub mycheck {
  my ($correct, $student, $ansHash) = @_;
  my @r = components($student);
  my $xstu = Formula("$r[0]");
  my $ystu = Formula("$r[1]");
  if ( ($xstu->D('t')==Formula("2")) &&
       ($ystu->D('t')==Formula("8t")) )
  { return 1; } else { return 0; } 
}

ANS( $answer->cmp( checker=>~~&mycheck ) );

Answer Evaluation: The subroutine components components($student) extracts the components of a vector and returns an array of (Perl) strings, which we assign to the array @r inside the custom answer checker mycheck. Each of these (Perl) strings $r[0] and $r[1] is then made into a MathObject formula and assigned a name. Since $xstu and $ystu are MathObjects formulas representing the components of the student's answer, we can differentiate them just like any MathObject formula. Notice that the argument to cmp( checker => ~~&mycheck ) is our subroutine that is a custom answer checker.

Context()->texStrings;
BEGIN_SOLUTION
Solution explanation goes here.
END_SOLUTION
Context()->normalStrings;

COMMENT('MathObject version.');

ENDDOCUMENT();

Solution:

Templates by Subject Area