Diff for /loncom/homework/functionplotresponse.pm between versions 1.21 and 1.22

version 1.21, 2010/10/31 12:33:02 version 1.22, 2010/11/01 00:04:09
Line 524  sub indices_scale { Line 524  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 552  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 593  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 618  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 760  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

Removed from v.1.21  
changed lines
  Added in v.1.22


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>