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