version 1.21, 2010/10/31 12:33:02
|
version 1.23, 2010/11/06 14:37:24
|
Line 363 sub end_splinerule {
|
Line 363 sub end_splinerule {
|
|
|
|
|
# |
# |
# <spline label="..." order="1,2,3,4" initx="..." inity="..." scalex="..." scaley="..." /> |
# <spline index="..." order="1,2,3,4" initx="..." inity="..." scalex="..." scaley="..." /> |
# |
# |
# Unfortunately, GeoGebra seems to want all splines after everything else, so we need to store them |
# Unfortunately, GeoGebra seems to want all splines after everything else, so we need to store them |
# |
# |
Line 371 sub start_spline {
|
Line 371 sub start_spline {
|
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
my $result=''; |
my $result=''; |
if ($target eq 'web') { |
if ($target eq 'web') { |
my $label=&Apache::lonxml::get_param('label',$parstack,$safeeval); |
my $label=&Apache::lonxml::get_param('index',$parstack,$safeeval); |
$Apache::functionplotresponse::counter++; |
$Apache::functionplotresponse::counter++; |
if ($label=~/\W/) { |
if ($label=~/\W/) { |
&Apache::lonxml::warning(&mt('Spline labels should only contain alphanumeric characters.')); |
&Apache::lonxml::warning(&mt('Spline indices should only contain alphanumeric characters.')); |
} |
} |
$label=~s/\W//gs; |
$label=~s/\W//gs; |
unless ($label) { $label='S'.$Apache::functionplotresponse::counter; } |
unless ($label) { |
|
$label='S'.$Apache::functionplotresponse::counter; |
|
} else { |
|
$label='S'.$label; |
|
} |
if ($Apache::functionplotresponse::splineorder{$label}) { |
if ($Apache::functionplotresponse::splineorder{$label}) { |
&Apache::lonxml::error(&mt('Spline labels must be unique.')); |
&Apache::lonxml::error(&mt('Spline indices must be unique.')); |
} |
} |
|
|
my $order=&Apache::lonxml::get_param('order',$parstack,$safeeval); |
my $order=&Apache::lonxml::get_param('order',$parstack,$safeeval); |
Line 404 sub start_spline {
|
Line 408 sub start_spline {
|
$Apache::functionplotresponse::splinescaley{$label}=$sy; |
$Apache::functionplotresponse::splinescaley{$label}=$sy; |
} elsif ($target eq 'edit') { |
} elsif ($target eq 'edit') { |
$result=&Apache::edit::tag_start($target,$token,'Spline'). |
$result=&Apache::edit::tag_start($target,$token,'Spline'). |
&Apache::edit::text_arg('Label:','label', |
&Apache::edit::text_arg('Index:','index', |
$token,'4').' '. |
$token,'4').' '. |
&Apache::edit::select_arg('Order:','order', |
&Apache::edit::select_arg('Order:','order', |
['2','3','4','5','6','7','8','9'],$token).' '. |
['2','3','4','5','6','7','8','9'],$token).' '. |
Line 419 sub start_spline {
|
Line 423 sub start_spline {
|
&Apache::edit::end_row(); |
&Apache::edit::end_row(); |
} elsif ($target eq 'modified') { |
} elsif ($target eq 'modified') { |
my $constructtag=&Apache::edit::get_new_args($token,$parstack, |
my $constructtag=&Apache::edit::get_new_args($token,$parstack, |
$safeeval,'label','order','initx','inity', |
$safeeval,'index','order','initx','inity', |
'scalex','scaley'); |
'scalex','scaley'); |
if ($constructtag) { $result=&Apache::edit::rebuild_tag($token); } |
if ($constructtag) { $result=&Apache::edit::rebuild_tag($token); } |
} |
} |
Line 524 sub indices_scale {
|
Line 528 sub indices_scale {
|
my ($xmin,$xmax,$x)=@_; |
my ($xmin,$xmax,$x)=@_; |
my $i=&array_index($xmin,$xmax,$x); |
my $i=&array_index($xmin,$xmax,$x); |
my $xr=&index_x($xmin,$xmax,$i); |
my $xr=&index_x($xmin,$xmax,$i); |
&Apache::lonnet::logthis("x:$x i:$i xr:$xr"); |
|
if ($xr<$x) { |
if ($xr<$x) { |
# Desired x is right of array index |
# Desired x is right of array index |
if ($i>=200) { return (200,200,0); } |
if ($i>=200) { return (200,200,0); } |
Line 553 sub func_val {
|
Line 556 sub func_val {
|
unless (defined($fl) || defined($fh)) { return undef; } |
unless (defined($fl) || defined($fh)) { return undef; } |
unless (defined($fl)) { return $fh; } |
unless (defined($fl)) { return $fh; } |
unless (defined($fh)) { return $fl; } |
unless (defined($fh)) { return $fl; } |
my $func=$fl+$factor*($fh-$fl); |
return $fl+$factor*($fh-$fl); |
&Apache::lonnet::logthis("x:$x func:$func factor:$factor il:$il ih:$ih fil:$fl fih:$fh"); |
} |
return $func; |
|
|
# |
|
# First derivative |
|
# |
|
|
|
sub dfuncdx_val { |
|
my ($xmin,$xmax,$x)=@_; |
|
my ($il,$ih,$factor)=&indices_scale($xmin,$xmax,$x); |
|
my $fl=$Apache::functionplotresponse::dfuncdx[$il]; |
|
my $fh=$Apache::functionplotresponse::dfuncdx[$ih]; |
|
unless (defined($fl) || defined($fh)) { return undef; } |
|
unless (defined($fl)) { return $fh; } |
|
unless (defined($fh)) { return $fl; } |
|
return $fl+$factor*($fh-$fl); |
|
} |
|
|
|
# |
|
# Second derivative |
|
# |
|
|
|
sub d2funcdx2_val { |
|
my ($xmin,$xmax,$x)=@_; |
|
my ($il,$ih,$factor)=&indices_scale($xmin,$xmax,$x); |
|
my $fl=$Apache::functionplotresponse::d2funcdx2[$il]; |
|
my $fh=$Apache::functionplotresponse::d2funcdx2[$ih]; |
|
unless (defined($fl) || defined($fh)) { return undef; } |
|
unless (defined($fl)) { return $fh; } |
|
unless (defined($fh)) { return $fl; } |
|
return $fl+$factor*($fh-$fl); |
} |
} |
|
|
# |
# |
Line 566 sub populate_arrays {
|
Line 597 sub populate_arrays {
|
my ($id,$xmin,$xmax)=@_; |
my ($id,$xmin,$xmax)=@_; |
for (my $i=0; $i<=200; $i++) { |
for (my $i=0; $i<=200; $i++) { |
$Apache::functionplotresponse::func[$i]=undef; |
$Apache::functionplotresponse::func[$i]=undef; |
$Apache::functionplotresponse::dfunddx[$i]=undef; |
$Apache::functionplotresponse::dfuncdx[$i]=undef; |
$Apache::functionplotresponse::d2funcd2x[$i]=undef; |
$Apache::functionplotresponse::d2funcd2x[$i]=undef; |
} |
} |
unless ($xmax>$xmin) { return 'no_func'; } |
unless ($xmax>$xmin) { return 'no_func'; } |
Line 591 sub populate_arrays {
|
Line 622 sub populate_arrays {
|
if (($xi>$xiold) && ($xi>=0) && ($xi<=200)) { |
if (($xi>$xiold) && ($xi>=0) && ($xi<=200)) { |
if (defined($Apache::functionplotresponse::func[$xi])) { return 'no_func'; } |
if (defined($Apache::functionplotresponse::func[$xi])) { return 'no_func'; } |
$xiold=$xi; |
$xiold=$xi; |
|
# Function value |
$Apache::functionplotresponse::func[$xi]=&cubic_hermite($t,@yparms); |
$Apache::functionplotresponse::func[$xi]=&cubic_hermite($t,@yparms); |
|
# dy/dx=dy/dt/(dx/dt) |
|
my $dxdt=&ddt_cubic_hermite($t,@xparms); |
|
if ($dxdt) { |
|
$Apache::functionplotresponse::dfuncdx[$xi]=&ddt_cubic_hermite($t,@yparms)/$dxdt; |
|
} |
|
# d^2y/dx^2 |
|
my $d2xdt2=&d2dt2_cubic_hermite($t,@xparms); |
|
if ($d2xdt2) { |
|
$Apache::functionplotresponse::d2funcd2x[$xi]=&d2dt2_cubic_hermite($t,@yparms)/$d2xdt2; |
|
} |
} |
} |
} |
} |
} |
} |
Line 722 sub end_functionplotresponse {
|
Line 764 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 |