Как я могу построить производную графа в gnuplot?

У меня есть набор измерений переменной во времени. У меня есть эти измерения в файле с названием "результаты" с этим форматом:

# time sample
0      5
12     43
234    342

и т.д...

Я могу легко построить это в gnuplot с помощью:

plot "results"

Есть ли способ построить производную этих измерений относительно времени (т.е. dsample/dt) непосредственно из gnuplot, или мне нужно вычислить производную отдельно и построить ее непосредственно в gnuplot?

Ответ 1

Вы можете сделать это, определив функцию для принятия производной:

#!/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) (что, вероятно, вы ищете) просто вычисляет возвышение над run (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

Результат

enter image description here

Ответ 2

Альтернативный (более общий) синтаксис для построения производной дается здесь от Виктора Т. Тота

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

Экстра. Это объяснение также можно использовать для интерпретации решения @andry для производной функции d2 (x, y). Единственное различие заключается в использовании $0. $0 в gnuplot - это "нулевой" столбец файла данных, в основном номер строки (как в электронной таблице, после игнорирования строк комментариев в файле данных). $0==0? проверяет, является ли это первой строкой и назначает 1/0 (NaN), поэтому команда plot игнорирует и не создает ее. Код, однако, правильный, только если длина интервала фиксирована (в приведенном выше случае 0,5). С другой стороны, код Виктора вычисляет интервал для каждой строки.