2017-11-21 1 views
1

Ich beginne gerade mit Matplot Lib versuchen, eine 3D-Oberfläche eines Differenzials zu zeichnen. Insbesondere habe ich eine Aufgabe, um meine eigene ArcTan-Funktion zu schreiben, die im Code als ExtArcTan zu sehen ist und deren Wert mit dem von Pythons eigenen verglichen wird, im Code als atan gesehen. Ich tue dies für verschiedene Werte von X und N. N bezieht sich auf die Anzahl von Serienbegriffen in meiner Funktion, da es sich tatsächlich um eine Taylor-Näherung handelt.Python MATPLOT LIB 2D Array

I beginnen, indem x und N Erstellen von Arrays:

N=np.arange(50) 
    X=np.arange(-5,6) 
    N,X=np.meshgrid(N,X) 

Ich muss dann für jeden dieser beiden Variablen die gegebene Differenz berechnen und den folgenden Code ist, was Fehler wirft.

Diff=abs(ExtArcTan(X,N)-atan(X)) 

ohne abschließende Array kann ich die triviale Aufgabe nicht abgeschlossen werden die Arrays in die Handlung des Setzens der Oberfläche zu erzeugen.

ich diesen Fehler auf der Diff Zeile:

ValueError: The truth value of an array with more than one element is 
ambiguous. Use a.any() or a.all() 

nicht sicher, was ich falsch mache:

Zum Vergleich:

def ArcTanComponent(x,i): #calculates the ith component of arctan(x) taylor series 
    return (((-1)**i)/(2*i+1))*(x**(2*i+1)) 

def BaseArcTan(x,N): #calculates all components for given N and sums to give approximation of arctan(x) 
    Components=[] 
    for i in range(N+1): 
     Components.append(ArcTanComponent(x,i)) 
    return np.sum(Components) 

def ExtArcTan(x,N): #extends baseArcTan function to work over entire range 
    if (x>0): 
     return PI/2 - BaseArcTan(1/x,N) 
    elif(x<0): 
     return -PI/2 - BaseArcTan(1/x,N) 
    elif(x==0): 
     return 0 

Antwort

-1

In ExtArcTan(x,N) Sie if x>0: verwenden (und andere Vergleiche), die mehrdeutig ist, wenn x ein Array ist, wie der Fehler sagt. Und Sie senden X von N,X=np.meshgrid(N,X), die ein Array ist. Sie müssen beispielsweise eine elementweise Überprüfung mit np.where verwenden, anstatt das gesamte Array mit x==0 zu überprüfen.

EDIT: Was ist mit etwas entlang dieser (nicht getestet):

def ExtArcTan(x,N): 
    x = np.sum(ArcTanComponent(x,i) for i in range(N+1)) 
    if (x>0): 
     return PI/2 - BaseArcTan(1/x,N) 
    elif(x<0): 
     return -PI/2 - BaseArcTan(1/x,N) 
    elif(x==0): 
     return 0 

EAT = np.array([[ExtArcTan(x,N) for x in row] for row in X]) 
Diff=abs(EAT-atan(X)) 
+0

ich dich sehe danken Ohne meine Funktion vollständig Arrays zu akzeptieren, wieder zu schreiben ist es ein einfacher Weg, um die Differentialanordnung zu erzeugen? –

+0

Ihr Problem besteht nicht darin, 'Diff' zu berechnen, sondern Ihre' ExtArcTan'-Funktion ist fehlerhaft und Sie müssen sie reparieren, oder Sie müssen sie für jedes Element separat aufrufen. – Julien

+0

Das merke ich. Die Sache ist für den Zweck dieser Zuweisung das einzige Bedürfnis der Funktion, Felder zu behandeln, würde für diese spezifische bildgebende Aufgabe sein, also frage ich mich, wie ich ein Diff-Array manuell erstellen könnte, das schneller als das Anpassen der Funktion wäre. Generiere ich einfach ein 2D-Array, dessen Indexwerte mit den Eingaben übereinstimmen. Mir ist nicht bekannt, was Matplotlib als z-Eingabe genau will! –