[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 384 - (download) (as text) (annotate)
Wed Jun 19 01:34:24 2002 UTC (17 years, 4 months ago) by gage
File size: 4886 byte(s)
Added my ($rformat,$theta_format); to the polar subroutine

    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 
   72 =cut
   73 
   74 
   75 
   76 sub polar{
   77   my $z = shift;
   78   my %options = @_;
   79   my ($rformat,$theta_format);
   80   set_default_options(\%options,  r_format  => ':%0.3f',
   81                   theta_format  => ':%0.3f',
   82   );
   83   my $r = rho($z);
   84   my $theta = $z->theta;
   85   my $r_format=":" . $options{r_format};
   86   my $theta_format = ":" . $options{theta_format};
   87   "{$r$r_format} e^{i {$theta$theta_format}}";
   88 }
   89 
   90 sub cplx_cmp {
   91   my $correctAns = shift;
   92   my %options = @_;
   93   $correctAns = cplx($correctAns,0) unless ref($correctAns) =~/Complex/;
   94   assign_option_aliases( \%options,
   95                 'reltol'    =>      'relTol',
   96     );
   97     set_default_options(\%options,
   98           'tolType'   =>  (defined($options{tol}) ) ? 'absolute' : 'relative',
   99           # default mode should be relative, to obtain this tol must not be defined
  100       'tol'     =>  $main::numAbsTolDefault,
  101                   'relTol'    =>  $main::numRelPercentTolDefault,
  102       'zeroLevel'   =>  $main::numZeroLevelDefault,
  103       'zeroLevelTol'    =>  $main::numZeroLevelTolDefault,
  104       'format'    =>  $main::numFormatDefault,
  105       'debug'     =>  0,
  106 
  107     );
  108 
  109 
  110   my $ans_eval = sub {
  111                my $in = shift;
  112       my $rh_ans = new AnswerHash;
  113          $rh_ans->{correct_ans} = $correctAns;
  114          unless (defined($in) and $in =~/\S/ ) { #bail on empty answer
  115             $rh_ans->{student_ans} = "error: empty";
  116           return $rh_ans;
  117          }
  118          my($PG_errors,$PG_errors_long);
  119 
  120                  $rh_ans->input($in);
  121 
  122                  $rh_ans->{student_ans}=math_constants($rh_ans->{student_ans});
  123                  $rh_ans->{student_ans} =~ s/e\^/exp /g;  #try to handle exponents
  124                  $rh_ans=check_syntax($rh_ans);
  125                  $rh_ans->{student_ans} =~ s/\bi\b/(i)/g;  #try to keep -i being recognized as a file reference
  126                                                            # and recognized as a function whose output is an imaginary number
  127 
  128 
  129          warn $rh_ans->pretty_print() if defined($options{debug}) and $options{debug}==1;
  130          ($in,$PG_errors,$PG_errors_long) = PG_restricted_eval($rh_ans->{student_ans});
  131                  $in = $in +0*i;   # force the input to be complex
  132          if ($PG_errors_long) {
  133           $rh_ans->{error}=1;
  134           $rh_ans->{ans_message} = $PG_errors;
  135          } else {
  136            $in->display_format('cartesian') if ref($in) =~/Complex/;
  137            $rh_ans->{student_ans}="$in";
  138            my $permitted_error;
  139           if (defined($options{tolType}) && $options{tolType} eq 'absolute')  {
  140             $permitted_error = $options{tol};
  141           } elsif ( abs($correctAns) <= $options{zeroLevel}) {
  142               $permitted_error = $options{zeroLevelTol};  ## want $tol  to be non zero
  143           } else {
  144               $permitted_error = abs(.01*$options{relTol}*$correctAns); # relative tolerance is given in per cent
  145           }
  146                   $rh_ans->{score} =  (abs($in - $correctAns)<$permitted_error )? 1:0;
  147 
  148                }
  149 
  150                  $rh_ans;
  151                  };
  152     $ans_eval;
  153 }
  154 
  155 1;

aubreyja at gmail dot com
ViewVC Help
Powered by ViewVC 1.0.9