annotate scripts/specfun/erfinv.m @ 3266:3add30d33bd0

[project @ 1999-09-03 17:15:40 by jwe]
author jwe
date Fri, 03 Sep 1999 17:15:41 +0000
parents e330cb788508
children 6923abb04e16
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3266
3add30d33bd0 [project @ 1999-09-03 17:15:40 by jwe]
jwe
parents: 2968
diff changeset
1 ## Copyright (C) 1995, 1996 Kurt Hornik
2537
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
2 ##
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
3 ## This program is free software; you can redistribute it and/or modify
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
4 ## it under the terms of the GNU General Public License as published by
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
5 ## the Free Software Foundation; either version 2, or (at your option)
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
6 ## any later version.
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
7 ##
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
8 ## This program is distributed in the hope that it will be useful, but
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
9 ## WITHOUT ANY WARRANTY; without even the implied warranty of
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
10 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
11 ## General Public License for more details.
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
12 ##
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
13 ## You should have received a copy of the GNU General Public License
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
14 ## along with this file. If not, write to the Free Software Foundation,
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
15 ## 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
16
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
17 ## usage: erfinv (x)
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
18 ##
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
19 ## Computes the inverse of the error function erf.
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
20
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
21 ## Author: KH <Kurt.Hornik@ci.tuwien.ac.at>
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
22 ## Created: 27 September 1994
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
23 ## Adapted-By: jwe
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
24
3266
3add30d33bd0 [project @ 1999-09-03 17:15:40 by jwe]
jwe
parents: 2968
diff changeset
25 function [y, iterations] = erfinv (x)
2537
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
26
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
27 if (nargin != 1)
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
28 usage ("erfinv (x)");
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
29 endif
3266
3add30d33bd0 [project @ 1999-09-03 17:15:40 by jwe]
jwe
parents: 2968
diff changeset
30
3add30d33bd0 [project @ 1999-09-03 17:15:40 by jwe]
jwe
parents: 2968
diff changeset
31 maxit = 100;
3add30d33bd0 [project @ 1999-09-03 17:15:40 by jwe]
jwe
parents: 2968
diff changeset
32 tol = eps;
3add30d33bd0 [project @ 1999-09-03 17:15:40 by jwe]
jwe
parents: 2968
diff changeset
33
3add30d33bd0 [project @ 1999-09-03 17:15:40 by jwe]
jwe
parents: 2968
diff changeset
34 iterations = 0;
3add30d33bd0 [project @ 1999-09-03 17:15:40 by jwe]
jwe
parents: 2968
diff changeset
35
2537
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
36 [m, n] = size (x);
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
37 x = reshape (x, m * n, 1);
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
38 y = zeros (m * n, 1);
3266
3add30d33bd0 [project @ 1999-09-03 17:15:40 by jwe]
jwe
parents: 2968
diff changeset
39
2537
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
40 i = find ((x < -1) | (x > 1));
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
41 if any (i)
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
42 y(i) = NaN * ones (length (i), 1);
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
43 endif
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
44
2621
337a09dd1c06 [project @ 1997-01-24 21:49:41 by jwe]
jwe
parents: 2537
diff changeset
45 t = find (x == -1);
2663
00b2eff19bf5 [project @ 1997-02-08 21:58:49 by jwe]
jwe
parents: 2621
diff changeset
46 y (t) = (-Inf) * ones (size (t));
2621
337a09dd1c06 [project @ 1997-01-24 21:49:41 by jwe]
jwe
parents: 2537
diff changeset
47
337a09dd1c06 [project @ 1997-01-24 21:49:41 by jwe]
jwe
parents: 2537
diff changeset
48 t = find (x == 1);
337a09dd1c06 [project @ 1997-01-24 21:49:41 by jwe]
jwe
parents: 2537
diff changeset
49 y (t) = Inf * ones (size (t));
3266
3add30d33bd0 [project @ 1999-09-03 17:15:40 by jwe]
jwe
parents: 2968
diff changeset
50
2537
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
51 i = find ((x > -1) & (x < 1));
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
52 if any (i)
2968
e330cb788508 [project @ 1997-05-15 17:40:29 by jwe]
jwe
parents: 2813
diff changeset
53 s = sqrt (pi) / 2;
2537
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
54 z_old = ones (length (i), 1);
3266
3add30d33bd0 [project @ 1999-09-03 17:15:40 by jwe]
jwe
parents: 2968
diff changeset
55 z_new = sqrt (-log (1 - abs (x(i)))) .* sign (x(i));
3add30d33bd0 [project @ 1999-09-03 17:15:40 by jwe]
jwe
parents: 2968
diff changeset
56 while (any (abs (erf (z_old) - x(i)) > tol * abs (x(i))))
2537
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
57 z_old = z_new;
2813
d45d48b3dcde [project @ 1997-03-13 22:39:15 by jwe]
jwe
parents: 2663
diff changeset
58 z_new = z_old - (erf (z_old) - x(i)) .* exp (z_old.^2) * s;
3266
3add30d33bd0 [project @ 1999-09-03 17:15:40 by jwe]
jwe
parents: 2968
diff changeset
59 if (++iterations > maxit)
3add30d33bd0 [project @ 1999-09-03 17:15:40 by jwe]
jwe
parents: 2968
diff changeset
60 warning ("erfinv: iteration limit exceeded");
3add30d33bd0 [project @ 1999-09-03 17:15:40 by jwe]
jwe
parents: 2968
diff changeset
61 break;
3add30d33bd0 [project @ 1999-09-03 17:15:40 by jwe]
jwe
parents: 2968
diff changeset
62 endif
2537
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
63 endwhile
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
64 y(i) = z_new;
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
65 endif
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
66
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
67 y = reshape (y, m, n);
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
68
80b982e7f4b1 [project @ 1996-11-19 21:15:06 by jwe]
jwe
parents:
diff changeset
69 endfunction