[system] / trunk / webwork / system / courseScripts / PGcomplexmacros.pl Repository:
ViewVC logotype

View of /trunk/webwork/system/courseScripts/PGcomplexmacros.pl

Parent Directory Parent Directory | Revision Log Revision Log


Revision 327 - (download) (as text) (annotate)
Thu May 30 21:52:07 2002 UTC (17 years, 4 months ago) by gage
File size: 4854 byte(s)
Having much trouble with the exportation of functions from Complex1.

Maybe this will do it.

    1 #!/usr/local/bin/webwork-perl
    2 # This file     is PGcomplexmacros.pl
    3 # This includes the subroutines for the ANS macros, that
    4 # is, macros allowing a more flexible answer checking
    5 ####################################################################
    6 # Copyright @ 1995-2001 The WeBWorK Team
    7 # All Rights Reserved
    8 ####################################################################
    9 #$Id$
   10 
   11 
   12 =head1 NAME
   13 
   14   Macros for complex numbers for the PG language
   15 
   16 =head1 SYNPOSIS
   17 
   18 
   19 
   20 =head1 DESCRIPTION
   21 
   22 =cut
   23 
   24 BEGIN{
   25   be_strict();
   26 
   27 }
   28 
   29  sub _PGcomplexmacros_init {
   30 }
   31 
   32 # export functions from Complex1.
   33 
   34   foreach my $f (@Complex1::EXPORT) {
   35 #         #PG_restricted_eval("\*$f = \*Complex1::$f"); # this is too clever --
   36                                 # the original subroutines are destroyed
   37         next if $f eq 'sqrt';  #exporting the square root caused conflicts with the standard version
   38                      # You can still use Complex1::sqrt to take square root of complex numbers
   39         next if $f eq 'log';  #exporting loq caused conflicts with the standard version
   40                     # You can still use Complex1::log to take square root of complex numbers
   41 
   42         my $string = qq{
   43              &Complex1::$f;
   44            };
   45 
   46         PG_restricted_eval($string);
   47   };
   48 
   49 
   50 
   51 
   52 
   53 # You need to add
   54 # sub i();  # to your problem or else to dangerousMacros.pl
   55 # in order to use expressions such as 1 +3*i;
   56 # Without this prototype you would have to write 1+3*i();
   57 # The prototype has to be defined at compile time, but dangerousMacros.pl is complied first.
   58 #Complex1::display_format('cartesian');
   59 
   60 
   61 =head4 polar
   62 
   63 =pod
   64 
   65   Usage polar($complex_number,r_format=>"%0.3f",theta_format=>"%0.3f")
   66 
   67   Output is text displaying the complex number in "e to the i theta" form.  The
   68   formats for the argument theta is determined by the option C<theta_format> and the
   69   format for the modulus is determined by the C<r_format> option.
   70 
   71 =cut
   72 
   73 
   74 
   75 sub polar{
   76   my $z = shift;
   77   my %options = @_;
   78   set_default_options(\%options,  r_format  => ':%0.3f',
   79                   theta_format  => ':%0.3f',
   80   );
   81   my $r = rho($z);
   82   my $theta = $z->theta;
   83   my $r_format=":" . $options{r_format};
   84   my $theta_format = ":" . $options{theta_format};
   85   "{$r$r_format} e^{i {$theta$theta_format}}";
   86 }
   87 
   88 sub cplx_cmp {
   89   my $correctAns = shift;
   90   my %options = @_;
   91   $correctAns = cplx($correctAns,0) unless ref($correctAns) =~/Complex/;
   92   assign_option_aliases( \%options,
   93                 'reltol'    =>      'relTol',
   94     );
   95     set_default_options(\%options,
   96           'tolType'   =>  (defined($options{tol}) ) ? 'absolute' : 'relative',
   97           # default mode should be relative, to obtain this tol must not be defined
   98       'tol'     =>  $main::numAbsTolDefault,
   99                   'relTol'    =>  $main::numRelPercentTolDefault,
  100       'zeroLevel'   =>  $main::numZeroLevelDefault,
  101       'zeroLevelTol'    =>  $main::numZeroLevelTolDefault,
  102       'format'    =>  $main::numFormatDefault,
  103       'debug'     =>  0,
  104 
  105     );
  106 
  107 
  108   my $ans_eval = sub {
  109                my $in = shift;
  110       my $rh_ans = new AnswerHash;
  111          $rh_ans->{correct_ans} = $correctAns;
  112          unless (defined($in) and $in =~/\S/ ) { #bail on empty answer
  113             $rh_ans->{student_ans} = "error: empty";
  114           return $rh_ans;
  115          }
  116          my($PG_errors,$PG_errors_long);
  117 
  118                  $rh_ans->input($in);
  119 
  120                  $rh_ans->{student_ans}=math_constants($rh_ans->{student_ans});
  121                  $rh_ans->{student_ans} =~ s/e\^/exp /g;  #try to handle exponents
  122                  $rh_ans=check_syntax($rh_ans);
  123                  $rh_ans->{student_ans} =~ s/\bi\b/(i)/g;  #try to keep -i being recognized as a file reference
  124                                                            # and recognized as a function whose output is an imaginary number
  125 
  126 
  127          warn $rh_ans->pretty_print() if defined($options{debug}) and $options{debug}==1;
  128          ($in,$PG_errors,$PG_errors_long) = PG_restricted_eval($rh_ans->{student_ans});
  129                  $in = $in +0*i;   # force the input to be complex
  130          if ($PG_errors_long) {
  131           $rh_ans->{error}=1;
  132           $rh_ans->{ans_message} = $PG_errors;
  133          } else {
  134            $in->display_format('cartesian') if ref($in) =~/Complex/;
  135            $rh_ans->{student_ans}="$in";
  136            my $permitted_error;
  137           if (defined($options{tolType}) && $options{tolType} eq 'absolute')  {
  138             $permitted_error = $options{tol};
  139           } elsif ( abs($correctAns) <= $options{zeroLevel}) {
  140               $permitted_error = $options{zeroLevelTol};  ## want $tol  to be non zero
  141           } else {
  142               $permitted_error = abs(.01*$options{relTol}*$correctAns); # relative tolerance is given in per cent
  143           }
  144                   $rh_ans->{score} =  (abs($in - $correctAns)<$permitted_error )? 1:0;
  145 
  146                }
  147 
  148                  $rh_ans;
  149                  };
  150     $ans_eval;
  151 }
  152 
  153 1;

aubreyja at gmail dot com
ViewVC Help
Powered by ViewVC 1.0.9