Math-Function-Roots
view release on metacpan or search on metacpan
lib/Math/Function/Roots.pm view on Meta::CPAN
converge regardless of the relationship of I<guess> to the actual
answer, just so long as I<guess> is within the range [a,b].
Why go through all this hassle? Well, certain functions lend
themselves to being transformed easily into fixed-point
functions. Also, with a derivative near 0 the convergence is very
fast, regardless of initial guess.
=cut
sub fixed_point(&$;%){
my $g = shift;
my $guess = shift;
my %optional = @_;
my $E = $optional{epsilon} || $E;
my $Max_Iter = $optional{max_iter} || $Max_Iter;
my ($p,$last_p) = (0,$guess);
for (1..$Max_Iter){
$Last_Iter = $_;
lib/Math/Function/Roots.pm view on Meta::CPAN
derivative of the function.
As usual, provide the function, then provide two guesses. Unlike
bisection, these do not need to bracket the solution. Local minimums
or maximums, where the slope is near 0, are unfriendly to this
algorithm. When the two guesses are near the solution however, this
algorithm gives rapid convergence.
=cut
sub secant(&$$;%){
my $f = shift;
my ($p0,$p1) = (shift,shift);
my %optional = @_;
my $E = $optional{epsilon} || $E;
my $Max_Iter = $optional{max_iter} || $Max_Iter;
my ($q0,$q1,) = ( &$f($p0) , &$f($p1) );
my $p;
lib/Math/Function/Roots.pm view on Meta::CPAN
given range. This is useful with higer-order functions where you want
to restrict your search to the area directly around the root.
The only restriction is that the functions derivative must not equal 0
within the range [min,max]. There must also only be one root within
the range, which (as in Bisection) is ensured by requiring that f(min)
and f(max) have opposite signs.
=cut
sub false_position(&$$;%){
my $f = shift;
my ($a,$b) = (shift,shift);
my %optional = @_;
my $E = $optional{epsilon} || $E;
my $Max_Iter = $optional{max_iter} || $Max_Iter;
my ($ay, $by) = ( &$f($a), &$f($b) );
# This algorithm requires that f(a) and f(b)
# always have opposite signs
lib/Math/Function/Roots.pm view on Meta::CPAN
It will most likely return the root nearest your guess, but no
guarantees. Don't provide a range with more than one root in it, you
might find one, you might not. More information will give higher
performance and more control over which root is being found, but if
you don't know anything about the function, give it a try without a
guess. Settings from epsilon and maximum iterations apply as normal.
=cut
sub find(&;$$%){
my $f = shift;
my ($a,$b);
# This is totally wrong, need to not assign to $a and $b when no
# arguments
if( defined $_[0] && $_[0] =~ !/epsilon|max_iter/ ){
$a = shift;
}
if( defined $_[0] && $_[0] =~ !/epsilon|max_iter/ ){
( run in 0.776 second using v1.01-cache-2.11-cpan-49f99fa48dc )