2017-05-19 2 views
1

pythonにトランジェント部分をフィルタでフィルタリングするモジュール/メソッドはありますか? 私はトランジェントコンポーネントと定常状態コンポーネントを含むグラフを持っています。私はmatplotlibを使用して生成されたグラフから定常状態値を抽出しようとしています。 使用されるコードと、得られたグラフは以下の通りである:Pythonの線グラフから定常状態成分を分離する

from numpy import genfromtxt 
import matplotlib.pyplot as plt 

per_data=genfromtxt('output-3.csv',delimiter=',',names=['x', 'y']) 
print(type(per_data)) 
plt.xlabel ('x stuff') 
plt.ylabel ('y stuff') 
plt.title('my test result') 
plt.plot(per_data['y']) 
plt.show() 

enter image description here

+0

は、これはただのプロットから、あなたの最初のデータを削除することによって解決することができないものですか?私は 'x stuff = 1000'からすべてを取得することを意味します –

+0

私はこのようなグラフが100個生成されているので、できるだけ多くの情報量が保持されるように定常状態を分離するプロセスを自動化することを考えていました。 – Dee

答えて

1

私が正しく理解していれば、あなたが効果的にそれの誘導体の絶対値グラフの一部として定常状態応答を定義することができポイントはほぼ0であり、すなわち変化率はほぼ0である。同様に、導関数の絶対値がほぼ0より大きい場合、逆も言える。

これはかなり簡単に除外する必要がありますが、「定常状態を分離する」と言うと、実際には何百万ものことを意味する可能性があります。あなたは定常状態を維持したいですか?連続した定常状態を維持したいだけですか?定常状態の間にある部品ではどうしますか?あなたはここにほしいものを指定するのを怠ったので、私はちょうどあなたが両方の部分をどのように分けていくのかを示し、後でそれらとやりたいことを決めることができます。

まず、派生境界としてあなたが望むものを決定します。あなたはこれを試すことができます、私はちょうど0.1を選ぶつもりです。その後、デリバティブを計算する方法を理解する必要があります。私たちのデータは明らかに(あなたが示したものから)連続していません。隣接する点の間の微分を近似するために傾きを見つけることによる簡単な数値的方法が問題に適しているはずです。

グラフの各ペアにこの微係数を適用し、それらの微分値に基づいてリストをフィルタリングできます。ここで

は例です:

#spacing is the distance between each point on the x axis 
def find_derivative(y1, y2, spacing) 
    return (y2 - y1)/ spacing 

# note index should obviously be < len and not negative, but garbage 
# in garbage out, so no need for an assertion on that point 
def consecutive_derivative(datapoints, index, spacing) 
    assert len(datapoints) >= 2, "Error, why would we need the derivative of one point?" 
    if index < (len(datapoints)): 
     y1 = list[index] 
     y2 = list[index+1] 
    else: 
     y1 = list[index-1] 
     y2 = list[index] 

    return find_derivative(y1, y2, spacing) 

def to_derivative_list(datapoints, spacing): 
    return [consecutive_derivative(datapoints, i, spacing) for i in range(len(datapoints)] 


# ... some code for list creation ... 

steady_state_cutoff = 0.1 
derivatives = to_derivative_list(per_data, per_data_spacing) 
steady_state_indicies = [] 
transient_state_indicies = [] 
for index, derivative in enumerate(derivatives): 
    if abs(derivative) < steady_state_cutoff 
     steady_state_indicies.append(index) 
    else 
     transient_state_indicies.append(index) 
#now you even have each index which is a steady state and 
#those that are transient, so you can form your own new graphs off of 
#these 
関連する問題