[Scipy-svn] r6548 - trunk/scipy/special/specfun

scipy-svn at scipy.org scipy-svn at scipy.org
Sun Jun 20 18:41:15 EDT 2010


Author: ptvirtan
Date: 2010-06-20 17:41:14 -0500 (Sun, 20 Jun 2010)
New Revision: 6548

Modified:
   trunk/scipy/special/specfun/specfun.f
Log:
BUG: special: adjust complex erf switchover radius to improve accuracy (addresses #683)

Modified: trunk/scipy/special/specfun/specfun.f
===================================================================
--- trunk/scipy/special/specfun/specfun.f	2010-06-20 22:41:00 UTC (rev 6547)
+++ trunk/scipy/special/specfun/specfun.f	2010-06-20 22:41:14 UTC (rev 6548)
@@ -2453,7 +2453,18 @@
         IF (DBLE(Z).LT.0.0) THEN
            Z1=-Z
         ENDIF
-        IF (A0.LE.5.8D0) THEN    
+C
+C       Cutoff radius R = 4.36; determined by balancing rounding error
+C       and asymptotic expansion error, see below.
+C
+C       The resulting maximum global accuracy expected is around 1e-8
+C
+        IF (A0.LE.4.36D0) THEN
+C
+C          Rounding error in the Taylor expansion is roughly
+C
+C          ~ R*R * EPSILON * R**(2 R**2) / (2 R**2 Gamma(R**2 + 1/2))
+C
            CS=Z1
            CR=Z1
            DO 10 K=1,120
@@ -2465,7 +2476,15 @@
         ELSE                              
            CL=1.0D0/Z1              
            CR=CL
-           DO 20 K=1,13
+C
+C          Asymptotic series; maximum K must be at most ~ R^2.
+C
+C          The maximum accuracy obtainable from this expansion is roughly
+C
+C          ~ Gamma(2R**2 + 2) / (
+C                   (2 R**2)**(R**2 + 1/2) Gamma(R**2 + 3/2) 2**(R**2 + 1/2))
+C
+           DO 20 K=1,20
               CR=-CR*(K-0.5D0)/(Z1*Z1)
               CL=CL+CR
               IF (CDABS(CR/CL).LT.1.0D-15) GO TO 25




More information about the Scipy-svn mailing list