2017-04-09 5 views
0

matplotlibでピース単位の関数を描画しようとしています。 (亜美の答えhereに基づいています)私のフィルタリングアプローチは動作しません:Pythonでピース単位の関数をプロットする

ValueError: x and y must have same first dimension

あなたは、問題を解決してくださいもらえますか?

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)) 

更新:

は@Michaelのアドバイスによると、エラーが削除されますが、それがなければなりませんどのような結果ではありません。

enter image description here

実際

formulaformula1範囲[0,5]および[5,10]にそれぞれプロットする必要があります。

これは私が必要なものである:

enter image description here

+0

アップデートのプロットは期待される出力ですか?それで、私は青い曲線に対して 'np.all'と' return 0'を使う理由は分かりません(t> 5ではゼロにはなりません)。エラーメッセージを修正する以外に、あなたが望むものをより詳細に指定してください。 – Michael

+0

@Michael:そうです。私のコードのロジックは、それが想定されているものではありません。私はあなたがそれを親切にチェックするならば、私が必要とするものを説明するためにスケッチを追加しました。 – Roboticist

+1

OK *ワンカーブが必要です。私は今それを得ると思います。私はそれを試してから、私の答えを編集するつもりです。 – Michael

答えて

1

あなたはreturn np.zeros_like(t)my_formulamy_formula1の両方でreturn 0を交換する必要があります。

plt.plotは、同じ形状の配列を必要とします。入力データnp.arange(0,5,0.1)を使用すると、常にそのケースreturn 0int)に届きます。あなたが望むなら、形状(1,)の配列と考えることができます(厳密に言えば、これは当てはまりません。0.shapeを試してみるとエラーになります)。次に、50のx値で1つのy値をプロットしようとします。同じy値を取るのは理にかなっているかもしれませんが、これはplt.plotの仕組みではありません。 np.zeros_like(t)を使用すると、50個のゼロエントリを持つ配列が得られ、plt.plotはプロットするものを知ります。


EDIT

更新によれば、私はこれを思いついた:特定のt値に適用される式は、ブール値のアレイ(t>=0)*(t<5)(t>=5)*(t<=10)と判定され

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)) 

。浮動小数点数列に掛け合わせると、の場合は0に、Trueの場合は1にキャストされるので、常に適用されるt範囲の正しい式です。また、私は5の式で何かを変更しました< = t < = 10:期待される出力に見えるようにするには、指数関数をシフトする必要がありました。np.exp(-t/tauN1))np.exp(-(t-5)/tauN1))に置き換えられました。

+0

ありがとうございます。あなたは私の更新を見ていただけますか?フィルタリング手法はまったく機能しません。 – Roboticist

+0

ご協力いただきありがとうございます。 – Roboticist

関連する問題