2013-04-01 4 views
10

私は時間の経過と共に変数の測定値のセットを持っています。どのような方法がありますグラフの派生物をgnuplotでプロットするにはどうしたらいいですか?

plot "results" 

は、私は簡単にはgnuplotでこれをプロットすることができます...

# time sample 
0  5 
12  43 
234 342 

など:私は、この形式での「結果」というファイルにこれらの測定を持っていますgnuplotから時間(すなわちdsample/dt)に関するこれらの測定値の微分を直接プロットするか、微分を個別に計算してそのを直接gnuplotにプロットする必要がありますか?

答えて

13

あなたは微分を取るように関数を定義することによってそれを行うことができます。

#!/usr/bin/env gnuplot 

set term pngcairo 
set output 'test.png' 

# derivative functions. Return 1/0 for first point, otherwise delta y or (delta y)/(delta x) 
d(y) = ($0 == 0) ? (y1 = y, 1/0) : (y2 = y1, y1 = y, y1-y2) 
d2(x,y) = ($0 == 0) ? (x1 = x, y1 = y, 1/0) : (x2 = x1, x1 = x, y2 = y1, y1 = y, (y1-y2)/(x1-x2)) 

set key bottom left Left reverse 

# offset for derivatives (half the x spacing) 
dx = 0.25 

plot 'data.dat' title 'data', \ 
    '' u ($1-dx):(d($2)) title '1-variable derivative', \ 
    '' u ($1-dx):(d2($1,$2)) title '2-variable derivative', \ 
    '' u ($1-dx):(d2($1,$2)) smooth csplines title '2-variable derivative (smoothed)' 

D2(x、y)は(あなたが探しているものはおそらくです)ちょうどデルタオーバーラン(デルタyの上の上昇を計算x)を、第1のデータ点を除いて、すべてd(y)は同じ方法でデルタyを計算する。このデータファイル

0.0 1 
0.5 2 
1.0 3 
1.5 4 
2.0 5 
2.5 3 
3.0 1 

指定された結果は、導関数をプロットする

enter image description here

+0

私は実際にはゼロから始めるべきではないと思っています。あなたのプロットの見た目からは、未定義か有限の値(OPがその導関数を見つけるために実装したいアルゴリズムに依存します)しかし、これには努力していて、インライン関数を示すために+1しています。 – mgilson

+1

@andyras、面白いアプローチ、あなたは少しのexplinationを追加する必要があります。また、これは初期データ間の中間点で微分をプロットするように変更することができると思います。結局のところ、私は仕事のための正しいツールを見つけることはここに当てはまると思う。 – agentp

+0

@george - 私はもっと同意できなかった。あなたはgnuplotでこれを行うことができますが、私はあなたが*すべきであることを知りません。あなたが別の言語で派生したものを入手するための簡単なスクリプトを書いて、それをgnuplotにパイプしたとすれば、理解したり変更したりする方がはるかに簡単です。 – mgilson

2

代替(より一般的な)構文はhere

x0=NaN 
y0=NaN 
plot 'test.dat' using (dx=$1-x0,x0=$1,$1-dx/2):(dy=$2-y0,y0=$2,dy/dx) w l t 'dy/dx' 

ヴィクトル・T.・トスによって

を与えられています説明:データファイル修飾子(の後に)は、データファイルから行ごとに計算された点(x):(y)の計算座標として解釈されます。各行について、列の値($ 1、$ 2、...)は許容される算術演算によって変更されます。括弧の値はカンマで区切られた式のリストの最後の式です。最初の2つが最初に評価され、後で使用される変数に格納され、次の行に使用されます。上記の構文のための擬似コードは次のとおり

x0 = NaN // Initialise to 'Not a number' for plot to ignore the first row 
    y0 = NaN 
    foreach row in 'test.dat' with col1 as $1, and col2 as $2: 
    dx = $1-x0 
    x0 = $1 
    x = $1 - dx/2 // Derivative at the midpoint of the interval 
    dy = $2-y0 
    y0 = $2 
    y = dy/dx 
    plot x:y // Put the point on the graph 

エクストラ:この説明は、また、導関数D2(x、y)に@andryas溶液を解釈するために使用することができます。唯一の違いは$ 0の使用です。 gnuplotの$ 0は、データファイルの '0番目の列です。基本的に行番号です(データファイルのコメント行を無視した後のスプレッドシートのように)。 $0==0?は、最初の行であるかどうかをチェックし、1/0(NaN)を代入するので、plotコマンドは無視してプロットしません。ただし、コードは区間長が固定されている場合(上記の場合は0.5)にのみ正しくなります。一方、Viktorのコードはすべての行の間隔を計算します。

+0

この解決策のように、各点はx(または時間)軸に沿って等間隔に配置されていると考えられます。データポイントが可変時間で分離されている場合に対応できるように拡張することはできますか? –

関連する問題