[SciPy-User] SciPy-User Digest, Vol 110, Issue 21

"Claas H. Köhler" claas.koehler at dlr.de
Fri Oct 12 12:39:03 EDT 2012



On 12/10/12 12:48, The Helmbolds wrote:
>> On 09/10/12 19:12, Pauli Virtanen wrote:
>>>   09.10.2012 19:28, "Claas H. K?hler" kirjoitti:
>>>>   I have a question regarding the error function scipy.special.erf:
>>>>
>>>>   Is it intended, that the erf of an imaginary argument yields a 
>> non-vanishing real-part?
>>>>
>>>>   I get e.g.
>>>>   erf(1j)= 1.6504257587975431j
>>>>   erf(5j)= (1+8298273879.8992386j)
>>>>
>>>>   The first result is what I would expect in accordance with Wolfram 
>> alpha. The second result, however,
>>>>   has a real part of unity. As far as I know, the real part of erf should 
>> always vanish for purely
>>>>   imaginary numbers.
>>>>
>>>>   Any support would be appreciated.
>>>
>>>   The reason here is that the ye olde complex erf Fortran implementation
>>>   that Scipy has uses the asymptotic expansion (Abramowitz & Stegun
>>>   7.1.23) to compute large-argument values. The asymptotic series is for
>>>   erfc, and one always gets Re erf = 1 along the imaginary axis.
>>>
>>>   Of course, this is somewhat naive. While it does produce reasonable
>>>   relative accuracy as a complex number, the accuracy of the real and
>>>   imaginary parts separately is not necessarily OK near the imaginary axis.
>>>
>>>   The issue with Scipy here is twofold -- first, there are no better
>>>   existing special function libraries we could use, or at least I'm not
>>>   aware of them. Second, writing these from scratch takes time and
>>>   expertise and nobody has so far volunteered to do any work in this
>>>   direction.
>>>
>> Thanks for the quick response!
>>
>> The bottom line is that erf is actually not (correctly) implemented for complex 
>> arguments, if I
>> understand you correctly.
>>
>> I suspect there are good reasons to provide a function which is known to yield 
>> incorrect results, so
>> that throwing a type error is not an option? (This is what erfc does on my 
>> machine)
>>
>> However, adding a warning when called with complex arguments could be helpful to 
>> prevent naiive use
>> as in my case. Adding this important piece of information to the docs would not 
>> harm either, from my
>> point of view.
>>
>> In any case, thanks for the quick support.
>>
>> Regards
>> Claas
> 
> On my system, I get the correct answers if I'm careful about the call to erf. 
> If I call erf with a single real value, I get the ordinary (not the complex) error function value. 
> If I call erf with a NumPy array or a Python sequence, I get the complex er
ror function returned.
> I do not think SciPy's erf is supposed to be called with a complex number. 
According to the docs it is. Otherwise I would expect to see a domain error, similar to erfc.

Regards
Claas


> 
> For example:
>>>> special.erf(1j)
> 1.6504257587975431j                  # Wrong answer!
>>>> special.erf((0,1))
> array([ 0.        ,  0.84270079])        # Right answer.
> 
> Two more examples:
>>>> for y in range(-10, 11):
>  temp = special.erf((0,y))
>  print y, temp                                 # Calling with a sequence, returns a NumPy array
> 
> -10 [ 0.         -1.]
> -9 [ 0.           -1.]
> -8 [ 0.           -1.]
> -7 [ 0.           -1.]
> -6 [ 0.           -1.]
> -5 [ 0.           -1.]
> -4 [ 0.         -0.99999998]
> -3 [ 0.         -0.99997791]
> -2 [ 0.         -0.99532227]
> -1 [ 0.         -0.84270079]
> 0 [ 0.           0.]
> 1 [ 0.          0.84270079]
> 2 [ 0.          0.99532227]
> 3 [ 0.          0.99997791]
> 4 [ 0.          0.99999998]
> 5 [ 0.          1.]
> 6 [ 0.          1.]
> 7 [ 0.          1.]
> 8 [ 0.          1.]
> 9 [ 0.          1.]
> 10 [ 0.         1.]
> 
> 
> OTOH--------------------------------------------------------------------------------------------
>>>> for y in range(-10, 11):
>  temp = special.erf(y)
>  print y, temp                            # Calling with a (scalar)  real value returns a (scalar) real value.
> 
> -10    -1.0
> -9     -1.0
> -8     -1.0
> -7     -1.0
> -6     -1.0
> -5     -0.999999999998
> -4     -0.999999984583
> -3     -0.999977909503
> -2     -0.995322265019
> -1     -0.84270079295
> 0      0.0
> 1     0.84270079295
> 2     0.995322265019
> 3     0.999977909503
> 4     0.999999984583
> 5     0.999999999998
> 6     1.0
> 7     1.0
> 8     1.0
> 9     1.0
> 10   1.0
> 
> Bob and Paula H        
> _______________________________________________
> SciPy-User mailing list
> SciPy-User at scipy.org
> http://mail.scipy.org/mailman/listinfo/scipy-user
> 

-- 
Deutsches Zentrum für Luft- und Raumfahrt e.V. (DLR)
Institut für Methodik der Fernerkundung | Experimentelle Verfahren | Münchner Str | 82234 Weßling

Claas H. Köhler
Telefon 08153 28-1274 | Telefax 08153 28-1337 | claas.koehler at dlr.de

www.DLR.de/EOC



More information about the SciPy-User mailing list