66 lines
1.0 KiB
Perl
66 lines
1.0 KiB
Perl
|
|
|
|
###
|
|
### Newton.pm
|
|
###
|
|
|
|
## Chapter 6 section 6
|
|
|
|
sub sqrt2 {
|
|
my $g = 2; # Initial guess
|
|
until (close_enough($g*$g, 2)) {
|
|
$g = ($g*$g + 2) / (2*$g);
|
|
}
|
|
$g;
|
|
}
|
|
|
|
sub close_enough {
|
|
my ($a, $b) = @_;
|
|
return abs($a - $b) < 1e-12;
|
|
}
|
|
sub sqrtn {
|
|
my $n = shift;
|
|
my $g = $n; # Initial guess
|
|
until (close_enough($g*$g, $n)) {
|
|
$g = ($g*$g + $n) / (2*$g);
|
|
}
|
|
$g;
|
|
}
|
|
|
|
|
|
## Chapter 6 section 6.1
|
|
|
|
use Stream 'iterate_function';
|
|
|
|
sub sqrt_stream {
|
|
my $n = shift;
|
|
iterate_function (sub { my $g = shift;
|
|
($g*$g + $n) / (2*$g);
|
|
},
|
|
$n);
|
|
}
|
|
|
|
1;
|
|
|
|
|
|
## Chapter 6 section 6.2
|
|
|
|
sub slope {
|
|
my ($f, $x) = @_;
|
|
my $e = 0.00000095367431640625;
|
|
($f->($x+$e) - $f->($x-$e)) / (2*$e);
|
|
}
|
|
|
|
|
|
## Chapter 6 section 6.2
|
|
|
|
# Return a stream of numbers $x that make $f->($x) close to 0
|
|
sub solve {
|
|
my $f = shift;
|
|
my $guess = shift || 1;
|
|
iterate_function(sub { my $g = shift;
|
|
$g - $f->($g)/slope($f, $g);
|
|
},
|
|
$guess);
|
|
}
|