version 1.19, 2010/10/30 15:32:36
|
version 1.20, 2010/10/30 23:43:29
|
Line 503 sub d2dt2_cubic_hermite {
|
Line 503 sub d2dt2_cubic_hermite {
|
# |
# |
sub array_index { |
sub array_index { |
my ($xmin,$xmax,$x)=@_; |
my ($xmin,$xmax,$x)=@_; |
my $index=int(($x-$xmin)/($xmax-$xmin)*200.+0.5); |
return int(($x-$xmin)/($xmax-$xmin)*200.+0.5); |
return $index; |
} |
|
|
|
# |
|
# Actual x-value of array index |
|
# |
|
|
|
sub index_x { |
|
my ($xmin,$xmax,$i)=@_; |
|
return $i*($xmax-$xmin)/200.+$xmin; |
|
} |
|
|
|
# |
|
# Assume function to be linear between array points |
|
# Return the two indices and the scale factor |
|
# |
|
|
|
sub indices_scale { |
|
my ($xmin,$xmax,$x)=@_; |
|
my $i=&array_index($xmin,$xmax,$x); |
|
my $xr=&index_x($xmin,$xmax,$i); |
|
&Apache::lonnet::logthis("x:$x i:$i xr:$xr"); |
|
if ($xr<$x) { |
|
# Desired x is right of array index |
|
if ($i>=200) { return (200,200,0); } |
|
return($i,$i+1,200.*($x-$xr)/($xmax-$xmin)); |
|
} elsif ($xr>$x) { |
|
# Desired x is left of array index |
|
if ($i<=0) { return (0,0,0); } |
|
return($i-1,$i,1.-200.*($xr-$x)/($xmax-$xmin)); |
|
} else { |
|
# Desired x is at array index (unlikely, but ...) |
|
if ($i>=200) { return (200,200,0); } |
|
if ($i<=0) { return (0,0,0); } |
|
return ($i,$i,0); |
|
} |
|
} |
|
|
|
# |
|
# Function value |
|
# |
|
|
|
sub func_val { |
|
my ($xmin,$xmax,$x)=@_; |
|
my ($il,$ih,$factor)=&indices_scale($xmin,$xmax,$x); |
|
my $fl=$Apache::functionplotresponse::func[$il]; |
|
my $fh=$Apache::functionplotresponse::func[$ih]; |
|
unless (defined($fl) || defined($fh)) { return undef; } |
|
unless (defined($fl)) { return $fh; } |
|
unless (defined($fh)) { return $fl; } |
|
my $func=$fl+$factor*($fh-$fl); |
|
&Apache::lonnet::logthis("x:$x func:$func factor:$factor il:$il ih:$ih fil:$fl fih:$fh"); |
|
return $func; |
} |
} |
|
|
# |
# |
Line 671 sub end_functionplotresponse {
|
Line 722 sub end_functionplotresponse {
|
} else { |
} else { |
$ad='INCORRECT'; |
$ad='INCORRECT'; |
} |
} |
|
&func_val($xmin,$xmax,3.96); |
|
|
|
&func_val($xmin,$xmax,3.965); |
|
|
|
&func_val($xmin,$xmax,3.97); |
|
&func_val($xmin,$xmax,3.975); |
|
&func_val($xmin,$xmax,3.98); |
|
|
|
&func_val($xmin,$xmax,3.985); |
|
&func_val($xmin,$xmax,3.99); |
|
&func_val($xmin,$xmax,3.995); |
|
|
|
&func_val($xmin,$xmax,4); |
|
&func_val($xmin,$xmax,4.05); |
|
&func_val($xmin,$xmax,4.1); |
|
|
|
&func_val($xmin,$xmax,4.15); |
|
&func_val($xmin,$xmax,4.2); |
|
&func_val($xmin,$xmax,4.25); |
|
|
# |
# |
# Store grading info |
# Store grading info |
# |
# |