2017-03-24 2 views
0

私は2列の数値データを含むファイルを読み込んでいます。最初の列を「x」とし、2番目の列を「y」とします。Python離散微分

'x'のデータの間隔が均一ではありません。データが明らかに有限である...

2.4 2.6 2.7 3.0 3.2 3.5

:それはそれは、このような何かを行く、です。初期値と最終値を持ちます。

このデータには「不連続性」があります。私は私の差別化データこれをしたい:私は、検索を行ってきたが、すべての分化の答えは、私は、分析機能を、関与した/ DX

DYなY = X ** 2 + 1

として私のデータは離散的であり、分析機能には合致しません。私は、このデータの上で「x」の各値で導関数を見つける必要があります。「x」は等間隔ではありません。

私は自分のデータファイルからデータを読み込み、それらを変数 'x'と 'y'に格納したとします。

今、私はdy/dxを望んでおり、dy/dxとxをプロットしたいと思います。

この派生語を行う "インポート"できるものは何ですか?あるいは、自分でアルゴリズムを書く必要がありますか?

+0

まず、あなたが今まで試みたことは?あなたのコードを投稿してください。これは本当にあなたが不連続を意味するかによって異なります。どのようにそれを定義していますか?微分のジャンプがプロットから存在するかどうかを目で判定したいだけですか? – James

+0

私はSciPyや他のパッケージで見つけたすべての微分ルーチンが一様なステップサイズ= hを必要としたので、何も試していません。 私の踏み台のサイズは、私が最初に述べたように、一様ではありません。 私はちょうど日付の差別化を行うために何かが必要です。 「なぜ」は重要ではない。 – Mannix

+0

不連続を定義する必要があります。そうすれば、チェックを行う方法を考えることができます。ほとんどの場合、手書きで書かれたコードではありません。 –

答えて

0

私はthe algorithmと書いています。これを行うビルトインインポートはありません。ここでは出発点として使用するためのいくつかのコードです:

>>> xarr = [2.4, 2.6, 2.7, 3.0, 3.2, 3.5, 3.8, 4.1, 5.3] 
>>> yarr = [10, 12, 18, 20, 22, 27, 30, 32, 36] 
>>> [(y2-y0)/(x2-x0) for x2, x0, y2, y0 in zip(xarr[2:], xarr, yarr[2:], yarr)] 
[26.666666666666643, 20.000000000000004, 8.0, 
14.0, 13.333333333333341, 8.333333333333337, 4.0] 

あなたは3点の中心からの距離に応じて、各辺を重み付けすることによって近似を絞り込むことができますが、すべてあなたがやっている場合、これはおそらく必要ありません不連続を探しています。

+0

最後の行を変数に割り当てることはできますか? (xarr [2:]、xarr、yarr [2:]、yarr)]のx2、x0、y2、y0のdy = [(y2-y0)/(x2-x0)] – Mannix

+0

。値は、 '' xarr [1:-1] ''の派生的推定値に対応します。 –

+0

'zip(xarr [1:]、xarr、yarr [1:]、yarr)'ではないはずですか?今は、2つの指標を1つではなく2つの指標で比較しています。 – Junuxx

0

私は3点の小さな配列に私の配列を分割する簡単なアルゴリズムを書いた。次に、これらの3つの点に2次関数を当てはめ、微分して中間点の値を計算します。エンドポイントについては、2つの値しか使用しません。

少しばかりです。また、ループを効率的に処理する方法があることも知っています。 IF-のelif文を排除した方法でこのループをクリーンアップに

dydx=[] 

for i in range(len(x)): 
    if i==0: 
     dx=x[i:i+2] 
     dy=y[i:i+2] 
     order=1 
    elif i==len(x)-1: 
     dx=x[i-1:i+1] 
     dy=y[i-1:i+1] 
     order=1 
    else: 
     dx=x[i-1:i+2] 
     dy=y[i-1:i+2] 
     order=2 
    z=np.polyfit(dx,dy,len(dx)-1) 
    f=np.poly1d(z) 
    df=np.polyder(f) 
    dydx.append(float(df(x[i]))) 
dydx=np.array(dydx) 

任意の提案:ここに私がやったことありますか?