--- loncom/homework/functionplotresponse.pm 2010/11/07 11:15:37 1.26 +++ loncom/homework/functionplotresponse.pm 2010/11/07 12:28:28 1.27 @@ -1,7 +1,7 @@ # LearningOnline Network with CAPA # option list style responses # -# $Id: functionplotresponse.pm,v 1.26 2010/11/07 11:15:37 www Exp $ +# $Id: functionplotresponse.pm,v 1.27 2010/11/07 12:28:28 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -557,42 +557,6 @@ sub array_index { } # -# Actual x-value of array index -# - -sub index_x { - my ($xmin,$xmax,$i)=@_; - return $i*($xmax-$xmin)/400.+$xmin; -} - -# -# Function value -# - -sub func_val { - my ($xmin,$xmax,$x)=@_; - return $Apache::functionplotresponse::func[&array_index($xmin,$xmax,$x)]; -} - -# -# First derivative -# - -sub dfuncdx_val { - my ($xmin,$xmax,$x)=@_; - return $Apache::functionplotresponse::dfuncdx[&array_index($xmin,$xmax,$x)]; -} - -# -# Second derivative -# - -sub d2funcdx2_val { - my ($xmin,$xmax,$x)=@_; - return $Apache::functionplotresponse::d2funcdx2[&array_index($xmin,$xmax,$x)]; -} - -# # Populate the arrays # @@ -635,7 +599,7 @@ sub populate_arrays { # d^2y/dx^2 my $d2xdt2=&d2dt2_cubic_hermite($t,@xparms); if ($d2xdt2) { - $Apache::functionplotresponse::d2funcd2x[$xi]=&d2dt2_cubic_hermite($t,@yparms)/$d2xdt2; + $Apache::functionplotresponse::d2funcdx2[$xi]=&d2dt2_cubic_hermite($t,@yparms)/$d2xdt2; } } } @@ -744,6 +708,9 @@ sub start_functionplotresponse { sub compare_rel { my ($relationship,$value,$realval,$tol)=@_; + + + &Apache::lonnet::logthis("Rel $relationship Val $value RV $realval T $tol"); # is the real value defined? unless (defined($realval)) { if ($relationship eq 'eq') { @@ -802,36 +769,39 @@ sub functionplotrulecheck { if ($xinitial eq '') { $xinitial=0; } - if ($xfinal ne '') { - if ($xinitial>$xfinal) { - $xfinal=$xinitial; - } + if ($xfinal eq '') { + $xfinal=$xinitial; + } + if ($xinitial>$xfinal) { + $xfinal=$xinitial; } &Apache::lonnet::logthis("Init $xinitial Final $xfinal"); - if (($xfinal eq '') || ($xinitial==$xfinal)) { -# This is only one point - &Apache::lonnet::logthis("One point $xinitial"); - my $tol; + my $tol=$tolfunc; + if ($derivative==2) { + $tol=$told2fdx2; + } elsif ($derivative==1) { + $tol=$toldfdx; + } + + my $li=&array_index($xmin,$xmax,$xinitial); + my $lh=&array_index($xmin,$xmax,$xfinal); + for (my $i=$li; $i<=$lh; $i++) { my $val; if ($derivative==2) { - $val=&d2funcdx2_val($xmin,$xmax,$xinitial); - $tol=$told2fdx2; + &Apache::lonnet::logthis("Second ". + +$Apache::functionplotresponse::d2funcdx2[$i-1].'__'.$Apache::functionplotresponse::d2funcdx2[$i].'__'.$Apache::functionplotresponse::d2funcdx2[$i+1]); + $val=$Apache::functionplotresponse::d2funcdx2[$i]; } elsif ($derivative==1) { - $val=&dfuncdx_val($xmin,$xmax,$xinitial); - $tol=$toldfdx; + $val=$Apache::functionplotresponse::dfuncdx[$i]; } else { - $val=&func_val($xmin,$xmax,$xinitial); - $tol=$tolfunc; + $val=$Apache::functionplotresponse::func[$i]; } - &Apache::lonnet::logthis("Value $value ActVal $val Tol $tol"); - return &compare_rel($relationship,$value,$val,$tol); - } else { -# This is a range + unless (&compare_rel($relationship,$value,$val,$tol)) { return 0; }; } - return 0; + return 1; } - sub end_functionplotresponse { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; &Apache::response::end_response; @@ -846,7 +816,7 @@ sub end_functionplotresponse { && &Apache::response::submitted() && $Apache::lonhomework::type eq 'exam') { - #&Apache::response::scored_response($partid,$id); + &Apache::response::scored_response($partid,$id); } elsif ($target eq 'grade' && &Apache::response::submitted() @@ -865,7 +835,11 @@ sub end_functionplotresponse { $ymin=(defined($ymin)?$ymin:-10); my $ymax=&Apache::lonxml::get_param('ymax',$parstack,$safeeval); $ymax=(defined($ymax)?$ymax:10); - my $tolfunc=5.*($ymax-$ymin)/100.; + + my $percent=&Apache::lonxml::get_param('percenterror',$parstack,$safeeval); + $percent=(defined($percent)?$percent:5); + + my $tolfunc=$percent*($ymax-$ymin)/100.; my $toldfdx=1; my $told2fdx2=1; if ($xmax>$xmin) {