2017-04-09 14 views
0

Ich versuche, eine stückweise Funktion in Matplotlib zu zeichnen. Mein Filteransatz (die auf Ami Antwort basiert here) nicht funktioniert:Plotten Stückweise Funktionen in Python

ValueError: x and y must have same first dimension

Können Sie das Problem zu beheben, bitte?

import numpy as np 
import matplotlib.pyplot as plt 

gK_inf = 7.06 
gK_0 = 0.09 
tauN = 0.75 

gK_inf1 = 0.09 
gK_01 = 7.06 
tauN1 = 1.1 

def graph(formula, formula1, t_range): 
    t = np.fromiter(t_range, np.float) 
    gK = formula(t) 
    gK1 = formula1(t) 
    plt.plot(t,gK) 
    plt.plot(t,gK1) 
    plt.xlabel(r"$t(msec.)$") 
    plt.ylabel(r"$g_K$") 
    plt.show() 

def my_formula(t): 
    if np.all(t>0) and np.all(t<5): 
     return np.power((np.power(gK_inf,0.25))-((np.power(gK_inf,0.25)-np.power(gK_0,0.25))*np.exp(-t/tauN)),4) 
    else: 
     return 0 

def my_formula1(t): 
    if np.all(t>5) and np.all(t<10): 
     return np.power((np.power(gK_inf1,0.25))-((np.power(gK_inf1,0.25)-np.power(gK_01,0.25))*np.exp(-t/tauN1)),4) 
    else: 
     return 0 

graph(my_formula, my_formula1, np.arange(0,10,0.1)) 

Update:

Nach @ Michael Beratung wird der Fehler beseitigt, aber das Ergebnis ist nicht das, was es sein muss:

enter image description here

Eigentlich formula und formula1 muss in den Bereichen [0,5] bzw. [5,10] geplottet werden. Diese

ist das, was ich brauche:

enter image description here

+0

Ist der Plot im Update eine erwartete Ausgabe? Dann verstehe ich nicht, warum Sie 'np.all' und die' return 0' für die blaue Kurve verwenden (geht nicht für t> 5 auf Null). Bitte geben Sie genauer an, was Sie wollen (neben der Behebung der Fehlermeldung). – Michael

+0

@Michael: Du hast Recht. Die Logik meines Codes ist nicht das, was er sein soll. Ich hatte eine Skizze hinzugefügt, um zu illustrieren, was ich brauche, wenn Sie es bitte überprüfen. – Roboticist

+1

ok, also willst du * eine * Kurve. Ich denke, ich verstehe es jetzt. Ich werde es versuchen und dann meine Antwort bearbeiten. – Michael

Antwort

1

Sie return 0 sowohl my_formula und my_formula1 mit return np.zeros_like(t) ersetzen soll.

plt.plot erwartet Felder gleicher Form. Mit Ihren Eingabedaten np.arange(0,5,0.1) erreichen Sie immer den Fall return 0, der ein int ist. Wenn Sie wollen, können Sie sich das als ein Array mit der Form (1,) vorstellen (streng genommen ist das nicht wahr, wenn Sie versuchen, 0.shape erhalten Sie einen Fehler). Dann versuchen Sie, einen y-Wert mit 50 x-Werten zu plotten. Auch wenn es für Sie logisch erscheint, nur den gleichen y-Wert zu verwenden, funktioniert das nicht plt.plot funktioniert. Wenn Sie np.zeros_like(t) verwenden, erhalten Sie ein Array mit 50 Nulleinträgen und plt.plot weiß was zu plotten.


EDIT

Nach dem Update kam ich mit auf den Punkt:

import numpy as np 
import matplotlib.pyplot as plt 

gK_inf = 7.06 
gK_0 = 0.09 
tauN = 0.75 

gK_inf1 = 0.09 
gK_01 = 7.06 
tauN1 = 1.1 

def graph(formula, t_range): 
    t = np.fromiter(t_range, np.float) 
    gK = formula(t) 
    plt.plot(t,gK) 
    plt.xlabel(r"$t(msec.)$") 
    plt.ylabel(r"$g_K$") 
    plt.show() 

def my_formula(t): 
    result = np.power((np.power(gK_inf,0.25))-((np.power(gK_inf,0.25)-np.power(gK_0,0.25))*np.exp(-t/tauN)),4) *(t>=0)*(t<5) 
    result += np.power((np.power(gK_inf1,0.25))-((np.power(gK_inf1,0.25)-np.power(gK_01,0.25))*np.exp(-(t-5)/tauN1)),4) *(t>=5)*(t<=10) 
    return result 

graph(my_formula, np.arange(0.0,12,0.1)) 

Die Formel für einen bestimmten t-Wert angewendet wird, mit den boolean-Arrays entschieden (t>=0)*(t<5) und (t>=5)*(t<=10) . Wenn sie mit dem Float-Array multipliziert werden, werden sie an 0 für False und 1 für True gegossen, so dass es immer die richtige Formel für die verwendeten t-Bereiche ist. Auch habe ich etwas in der Formel für 5 < geändert = t < = 10: Um es wie Ihre erwartete Ausgabe aussehen, musste ich die Exponentialfunktion verschieben: np.exp(-t/tauN1)) wurde durch np.exp(-(t-5)/tauN1)) ersetzt.

+0

Danke. Könnten Sie sich bitte mein Update ansehen? Der Filteransatz funktioniert überhaupt nicht. – Roboticist

+0

Vielen Dank im Voraus für Ihre Hilfe. – Roboticist