[LON-CAPA-cvs] cvs: loncom /homework functionplotresponse.pm
www
www@source.lon-capa.org
Sun, 07 Nov 2010 12:28:28 -0000
www Sun Nov 7 12:28:28 2010 EDT
Modified files:
/loncom/homework functionplotresponse.pm
Log:
* Even simpler is even better
* Implemented checking properties over a range
* Left to do:
- colorful editor for functionplotrule
- labels for plots that are not bound to coordinates
- fix second derivative
- remove debug code
Index: loncom/homework/functionplotresponse.pm
diff -u loncom/homework/functionplotresponse.pm:1.26 loncom/homework/functionplotresponse.pm:1.27
--- loncom/homework/functionplotresponse.pm:1.26 Sun Nov 7 11:15:37 2010
+++ loncom/homework/functionplotresponse.pm Sun Nov 7 12:28:28 2010
@@ -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 @@
}
#
-# 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 @@
# 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 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 @@
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 @@
&& &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 @@
$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) {