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 )