17

我有一组随时间变化的变量的测量值。我将这些测量值保存在一个名为“结果”的文件中,格式如下:

# time sample
0      5
12     43
234    342

ETC...

我可以很容易地在 gnuplot 中绘制它:

plot "results"

有什么方法可以直接从 gnuplot 绘制这些测量值对时间(即 dsample/dt)的导数,还是我必须单独计算导数并直接在 gnuplot 中绘制?

4

2 回答 2

18

您可以通过定义一个函数来获取导数来做到这一点:

#!/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

结果是

在此处输入图像描述

于 2013-04-01T22:03:57.053 回答
6

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 的代码计算每一行的间隔。

于 2017-09-22T19:15:28.720 回答