Math-Cephes

 view release on metacpan or  search on metacpan

lib/Math/Cephes.pm  view on Meta::CPAN

	       ndtr ndtri pdtr pdtrc pdtri stdtr stdtri);
my @gammas = qw(gamma igam igamc igami psi fac rgamma lgam);
my @betas = qw(beta lbeta incbet incbi lbeta);
my @elliptics = qw(ellie ellik ellpe ellpj ellpk);
my @hypergeometrics = qw(onef2 threef0 hyp2f1 hyperg hyp2f0);
my @misc = qw(zeta zetac airy dawsn fresnl sici shichi expn spence ei
              erfc erf struve plancki simpson bernum polylog vecang);
my @fract = qw(radd rsub rmul rdiv euclid);

%EXPORT_TAGS = ('constants' => [@constants],
		'utils' => [@utils],
                'trigs' => [@trigs],
                'hypers' => [@hypers],
                'explog' => [@explog],
                'cmplx' => [@cmplx],
                'bessels' => [@bessels],
                'gammas' => [@gammas],
		'dists' => [@dists],
                'betas' => [@betas],
                'elliptics' => [@elliptics],
		'hypergeometrics' => [@hypergeometrics],
		'fract' => [@fract],
                'misc' => [@misc],
                'all' => [@constants, @utils, @trigs, @hypers,
			  @explog, @bessels, @gammas, @betas, @elliptics,
			  @hypergeometrics, @misc, @dists],
	       );

@EXPORT_OK = (@constants, @utils, @trigs, @hypers,
	      @explog, @bessels, @gammas, @betas, @elliptics,
	      @hypergeometrics, @misc, @dists, @fract, @cmplx);

$VERSION = '0.5308';
#Math::Cephes->bootstrap($VERSION);
#var_Math__Cephes_init();

sub simpson {
  my ($r, $a, $b, $abs, $rel, $nmax) = @_;
  die "Must supply a CODE reference" unless ref($r) eq 'CODE';
  die "Must supply start and end points($a and $b)"
    unless (defined $a and defined $b);
  $abs ||= 1e-06;
  $rel ||= 1e-06;
  $nmax ||= 256;
  $nmax = 2 if $nmax < 2;
  my $sumold = 0;
  for (my $n=2; $n<=$nmax; $n++) {
    my $count = 0;
    my $x = $a;
    my $sum = 0;
    my $h = ($b - $a) / $n / 8;
    my $f = [];
    for($count=0; $count <= 8*$n; $count++, $x+=$h) {
      $f->[$count] = &$r($x);
    }
    $sum = Math::Cephes::simpsn_wrap($f, $count-1, $h);
    my $test = abs($sum - $sumold);
    return $sum if ($test < $abs or abs($test/$sum) < $rel);
    $sumold = $sum;
  }
  warn("Math::Cephes::simpson: Maximum number $nmax of iterations reached");
  return undef;
}

sub bernum {
  my $i = shift;
  die "Cannot exceed i=30" if (defined $i and $i > 30);
  my $num = [split //, 0 x 30 ];
  my $den = [split //, 0 x 30 ];
  Math::Cephes::bernum_wrap($num, $den);
  return defined $i ? (int($num->[$i]), int($den->[$i])) : ($num, $den);
}

sub expxx {
  my $x = shift;
  my $n = shift || 1;
  return Math::Cephes::expx2($x, $n);
}

sub vecang {
  my ($a, $b) = @_;
  die "Must supply array references"
    unless (ref($a) eq 'ARRAY' and ref($b) eq 'ARRAY');
  die "Vectors must be of dimension 3"
    unless (scalar @$a == 3 and scalar @$b == 3);
  return Math::Cephes::arcdot($a, $b);
}

# ---------- BASE METHODS -------------

package Math::Cephes;

sub TIEHASH {
    my ($classname,$obj) = @_;
    return bless $obj, $classname;
}

sub CLEAR { }

sub FIRSTKEY { }

sub NEXTKEY { }

sub FETCH {
    my ($self,$field) = @_;
    my $member_func = "swig_${field}_get";
    $self->$member_func();
}

sub STORE {
    my ($self,$field,$newval) = @_;
    my $member_func = "swig_${field}_set";
    $self->$member_func($newval);
}

sub this {
    my $ptr = shift;
    return tied(%$ptr);
}




( run in 0.559 second using v1.01-cache-2.11-cpan-71847e10f99 )