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 )