我有一组随时间变化的变量的测量值。我将这些测量值保存在一个名为“结果”的文件中,格式如下:
# time sample
0 5
12 43
234 342
ETC...
我可以很容易地在 gnuplot 中绘制它:
plot "results"
有什么方法可以直接从 gnuplot 绘制这些测量值对时间(即 dsample/dt)的导数,还是我必须单独计算导数并直接在 gnuplot 中绘制?
我有一组随时间变化的变量的测量值。我将这些测量值保存在一个名为“结果”的文件中,格式如下:
# time sample
0 5
12 43
234 342
ETC...
我可以很容易地在 gnuplot 中绘制它:
plot "results"
有什么方法可以直接从 gnuplot 绘制这些测量值对时间(即 dsample/dt)的导数,还是我必须单独计算导数并直接在 gnuplot 中绘制?
您可以通过定义一个函数来获取导数来做到这一点:
#!/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 超过 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
结果是
Viktor T. Toth在此处给出了绘制导数的替代(更通用)语法
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 是数据文件的“第零”列,本质上是行号(如在电子表格中,在忽略数据文件中的注释行之后)。$0==0?
检查它是否是第一行并分配一个 1/0 (NaN),以便 plot 命令忽略并且不绘制它。然而,代码只有在区间长度固定的情况下才是正确的(在上述情况下为 0.5)。另一方面,Viktor 的代码计算每一行的间隔。