2017-02-22 9 views
0

Ich habe eine Funktion, die einen Wert für eine Kraft abhängig von der z-Position (z_pos) zurückgibt. Ich möchte diese Ergebnisse darstellen (Scherdiagramm für die Ingenieure hier), aber ich bekomme den folgenden Fehler:Wie Funktionsergebnisse mit Matplotlib in Python plotten

ValueError: Der Wahrheitswert eines Arrays mit mehr als einem Element ist mehrdeutig. Verwenden Sie a.any() oder a.All()

ich versucht habe es sowohl mit arange und linspace finden Sie den Code hier:

import matplotlib.pyplot as plt 
import numpy as np 

#values in kN and m 
FyFL = 520 
FyRL = 1246 
L = 40. 
Lf1 = 2. 
Lf2 = 25.5 
g = 9.81 
W = 60000 
q = (3*g*W/L)/1000 #kN/m 
print q 

def int_force_y(FyFL, FyRL, L, Lf1, Lf2, q, z_pos): 

    if z_pos <= Lf1: 
     int_fc_y = -q*z_pos 
    elif z_pos > Lf1 and z_pos < Lf1+Lf2: 
     int_fc_y = -q*Lf1 + FyFL-q*z_pos 
    elif z_pos >= Lf2 and z_pos <= 40.: 
     int_fc_y = -q*Lf1 + FyFL-q*(Lf1+Lf2)-q*z_pos 
    else: 
     return "No valid z_pos" 

    return int_fc_y 

z_pos = np.arange(0,41,1) 
y = int_force_y(FyFL, FyRL, L, Lf1, Lf2, q, z_pos) 
plt.plot(z_pos,y) 
plt.show() 

Hilfe wird sehr geschätzt!

Antwort

1

Der Fehler, den Sie bekommen, hat nichts mit dem Plotten zu tun, sondern entsteht, wenn Sie int_force_y anrufen. Das Argument z_pos ist ein np.ndarray. Wenn Sie dies jetzt mit z. Lf1 in Ihrer Funktion dann dies gibt Ihnen eine boolesche Array, wo jedes Element angibt, ob das entsprechende Element von z_pos ist kleiner oder gleich Lf1 im Falle Ihrer ersten if Aussage. Da einige Elemente kleiner oder gleich sind und andere nicht, kann er nicht entscheiden, ob er dies als True oder False betrachten soll und Sie .any() verwenden, um anzugeben, dass es True sein sollte, wenn ein Element True oder .all() ist, um anzuzeigen, dass es sein sollte True wenn alle Elemente True sind.

Aber beide oder diese Fälle tun nicht, was Sie wollen, dass sie tun. Sie möchten für jedes Element einzeln eine Entscheidung treffen und dann den entsprechenden Wert in int_fc_y entsprechend setzen. Sie können dies durch eine For-Schleife oder eleganter unter Verwendung von boolean indexing und np.logical_and tun. Verwenden Sie einfach diese Funktion Ihr Ergebnis-Array zu erzeugen, anstatt Ihre Version:

def int_force_y(FyFL, FyRL, L, Lf1, Lf2, q, z_pos): 
    if (z_pos>40.).any(): 
     return "No valid z_pos" 
    int_force_y = np.zeros_like(z_pos) 
    int_fc_y[z_pos<=Lf1] = -q*z_pos 
    int_fc_y[np.logical_and(z_pos > Lf1, 
          z_pos < Lf1+Lf2)] = -q*Lf1 + FyFL-q*z_pos 
    int_fc_y[np.logical_and(z_pos >= Lf2, 
          z_pos <= 40.)] = -q*Lf1 + FyFL-q*(Lf1+Lf2)-q*z_pos 
    return int_fc_y 
0

Das Problem tritt auf, weil Sie Python fragen, ob, wenn ein Array größer oder kleiner ist als bestimmter Wert:

if z_pos <= Lf1: 

Dies könnte für einige Werte Wahrheit und für andere falsch sein, mit der Frage, ob diese Aussage wahr oder falsch zweideutig ist.

können Sie versuchen:

if np.array(z_pos <= Lf1).any(): 

oder

if np.array(z_pos <= Lf1).all(): 

je nachdem, was Sie wollen. Gleiches gilt für die folgenden if-Anweisungen.

+0

Das wird ihm nicht das gewünschte Ergebnis geben, da die Funktion dann nur einen Wert und nicht ein Array aller Ergebniswerte zurückgibt. – jotasi

Verwandte Themen