Leser: 1
![]() |
![]() |
2 Einträge, 1 Seite |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
sub erfinv {
my $y = @_ ? $_[0] : $_;
return 0 if $y == 0;
return erfcinv(1-$y) if $y > 0.5;
return -erfcinv(1+$y) if $y < -0.5;
#
# Halley's rational 3rd order method:
# u <- f(x)/f'(x)
# v <- f''(x)/f'(x)
# x <- x - u/(1-u*v/2)
#
# Here:
# f(x) = erf(x) - y
# f'(x) = 2/sqrt(pi)*exp(-x*x)
# f''(x) = -4/sqrt(pi)*x*exp(-x*x)
#
my $x = 0;
my $dx;
my $c = .88622692545275801364908374167055; # sqrt(pi)/2
my $eps = 5e-20;
do {
my $f = erf($x) - $y;
my $u = $c*$f*exp($x*$x);
print "u: $u";
# print "u: $u";
$dx = -$u/(1+$u*$x);
$x += $dx;
} until abs($dx/$x) <= $eps;
return $x;
}![]() |
![]() |
2 Einträge, 1 Seite |