2016-06-30 16 views
0

Ich versuche eine Funktion f (x) zu definieren, die 1.0 für x = 0 und 1.0/(2j pi x) ergibt. Hier ist ein ‚Test‘ Skript Ich verwende:Eine komplexwertige, stückweise Funktion definieren

import numpy as np 

def f(x): 
    return np.piecewise(x,[x==0],[1.0, lambda x: 1.0/(2j*np.pi*x)]) 

x = np.linspace(-1,1,21) 

print(x) 
print(f(x)) 

Wenn die Lambda-Funktion nicht komplexwertigen ist, das funktioniert, wie ich erwarten würde. Doch mit dem „2j“ Begriff erhalte ich die folgende Warnung und Ausgang:

/usr/local/lib/python2.7/dist-packages/numpy/lib/function_base.py:1144: ComplexWarning: Casting complex values to real discards the imaginary part 
    y[condlist[k]] = item(vals, *args, **kw) 
[-1. -0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1 0. 0.1 0.2 0.3 0.4 
    0.5 0.6 0.7 0.8 0.9 1. ] 
[-0. -0. -0. -0. -0. -0. -0. -0. -0. -0. 1. 0. 0. 0. 0. 0. 0. 0. 
    0. 0. 0.] 

Offenbar numpy ist piecewise nimmt automatisch den Realteil. Ist das nicht eine Einschränkung von piecewise? Gibt es eine andere Möglichkeit, stückweise komplexwertige Funktionen zu definieren (ohne den Real- und den Imaginärteil getrennt definieren zu müssen)?

Antwort

1

Vom piecewise docstring:

The output is the same shape and type as x... 

Für komplexen Ausgang in einer komplexen Matrix übergeben.

Continuing Ihr Beispiel mit f und x definiert:

In [91]: y = x + 0j 

In [92]: f(y) 
Out[92]: 
array([-0.+0.15915494j, -0.+0.17683883j, -0.+0.19894368j, -0.+0.2273642j , 
     -0.+0.26525824j, -0.+0.31830989j, -0.+0.39788736j, -0.+0.53051648j, 
     -0.+0.79577472j, -0.+1.59154943j, 1.+0.j  , 0.-1.59154943j, 
     0.-0.79577472j, 0.-0.53051648j, 0.-0.39788736j, 0.-0.31830989j, 
     0.-0.26525824j, 0.-0.2273642j , 0.-0.19894368j, 0.-0.17683883j, 
     0.-0.15915494j]) 
+0

das funktioniert, danke! (Ich habe schließlich 'x = x + 0j' als erste Zeile der Funktionsdefinition eingefügt). –

Verwandte Themen