Math-Numerical
view release on metacpan or search on metacpan
lib/Math/Numerical.pm view on Meta::CPAN
=cut
Readonly my $DEFAULT_INWARD_SPLIT => 3;
Readonly my $DEFAULT_INWARD_FACTOR => 3;
Readonly my $DEFAULT_OUTWARD_FACTOR => 1.6;
sub _create_bracket_inward_state ($x1, $x2, $f1, %params) {
my $s = {ret => undef};
$s->{split} = $params{inward_split} // $DEFAULT_INWARD_SPLIT;
croak 'inward_split must be at least 2' if $s->{split} < 2;
$s->{factor} = $params{inward_factor} // $DEFAULT_INWARD_FACTOR;
croak 'inward_factor must be at least 2' if $s->{factor} < 2;
@{$s}{'x1', 'x2'} = ($x1, $x2);
$s->{f1} = $f1;
lock_keys(%{$s});
return $s;
}
sub _do_bracket_inward ($f, $s) {
my $dx = ($s->{x2} - $s->{x1}) / $s->{split};
t/bracket.t view on Meta::CPAN
like(scalar(eval { bracket(\&CORE::cos, 0, 0, max_iterations => 0)}, $@),
qr/max_iterations must be positive/);
like(scalar(eval { bracket(\&CORE::cos, 0, 0, outward_factor => 1)}, $@),
qr/outward_factor must be larger than 1/);
like(scalar(eval { bracket(\&CORE::cos, 0, 0, inward_factor => 1.9)}, $@),
qr/inward_factor must be at least 2/);
like(scalar(eval { bracket(\&CORE::cos, 0, 0, inward_split => 1.9)}, $@),
qr/inward_split must be at least 2/);
{
sub f { abs($_[0] - 3) - 1 } # zeroes in 2 and 4.
is(bracket(\&f, 0, 1, do_outward => 0), U());
is([bracket(\&f, 0, 1, do_outward => 1)], [float_lt(2), float_gt(2), D(), D()]);
is(bracket(\&f, 1, 5, do_inward => 0), U());
is([bracket(\&f, 1, 5, do_inward => 1)], [float_lt(2), float_gt(2), D(), D()]);
{
my ($a, $b, $fa, $fb) = bracket(\&f, 0, 1);
( run in 2.096 seconds using v1.01-cache-2.11-cpan-71847e10f99 )