Difference between revisions of "VectorParametric2"

From WeBWorK_wiki
Jump to navigation Jump to search
(Created page with '<h2>Motion and Velocity with a Parametric Curve</h2> 300px|thumb|right|Click to enlarge <p style="background-color:#f9f9f9;border:black solid 1px;…')
 
m
Line 195: Line 195:
   
 
[[Category:Top]]
 
[[Category:Top]]
[[Category:Authors]]
+
[[Category:Sample Problems]]
  +
[[Category:Subject Area Templates]]

Revision as of 15:52, 3 January 2012

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.

  • Download file: File:VectorParametric2.txt (change the file extension from txt to pg when you save it)
  • File location in NPL: FortLewis/Authoring/Templates/Parametric/VectorParametric2.pg


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
${PAR}SOLUTION:${PAR}
Solution explanation goes here.
END_SOLUTION
Context()->normalStrings;

COMMENT('MathObject version.');

ENDDOCUMENT();

Solution:

Templates by Subject Area