我随着时间的推移对变量进行了一组测量。我将这些测量结果放在一个名为“results”的文件中,格式为:
# time sample
0 5
12 43
234 342
等...
我可以在gnuplot中用以下内容轻松绘制:
plot "results"
有没有办法直接从gnuplot绘制这些测量关于时间的导数(即dsample / dt),或者我是否必须单独计算导数并直接在gnuplot中绘制 ?
答案 0 :(得分:15)
你可以通过定义一个函数来取得衍生物:
#!/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)(这可能是你正在寻找的)只计算除了第一个数据点之外的所有运行(delta y over delta x),而d(y)计算delta y办法。给定此数据文件
0.0 1
0.5 2
1.0 3
1.5 4
2.0 5
2.5 3
3.0 1
结果是
答案 1 :(得分:4)
Viktor T. Toth给出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'
解释:括号内的数据文件修饰符(在使用之后)将被解释为点(x)的计算坐标:( y),计算行来自数据文件的行。对于每一行,列值($ 1,$ 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是' zeroth'数据文件的列,基本上是行号(在电子表格中,忽略数据文件中的注释行之后)。 $0==0?
检查它是否是第一行并分配1/0(NaN),因此plot命令忽略并且不绘制它。但是,只有在间隔长度固定的情况下(在上述情况下为0.5),代码才是正确的。另一方面,Viktor的代码计算每一行的间隔。