2013-04-01 16 views
10

Mam zestaw pomiarów zmiennej w czasie. Mam te pomiary w pliku o nazwie „Wyniki” z tego formatu:Jak wykreślić pochodną wykresu w gnuplot?

# time sample 
0  5 
12  43 
234 342 

etc ...

mogę łatwo wykreślić ten w gnuplot z:

plot "results" 

Czy istnieje jakiś sposób, do wykreślenia pochodnej tych pomiarów w odniesieniu do czasu (tj. dsample/dt) bezpośrednio z gnuplot, lub czy muszę obliczyć pochodną osobno i wykreślić , że bezpośrednio w gnuplot?

Odpowiedz

13

Można to zrobić poprzez zdefiniowanie funkcji wziąć pochodną:

#!/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) (co jest chyba to, co szukasz) po prostu oblicza powstanie nad run (delta y nad deltą x) w ogóle oprócz pierwszego punktu danych, a d (y) oblicza delta y w ten sam sposób. Biorąc pod uwagę ten plik danych

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

W rezultacie

enter image description here

+0

Nie sądzę, że pochodna tutaj powinna zaczynać się od 0. od wyglądu twoich działek powinna być albo niezdefiniowana, albo pewna skończona wartość (w zależności od algorytmu, który OP chce zaimplementować, aby znaleźć pochodną). Ale, kudos za wysiłek na tym i +1 za demonstrację funkcji inline. – mgilson

+1

@andyras, ciekawe podejście, powinieneś dodać trochę eksploracji. Myślę też, że można to zmodyfikować, aby wykreślić pochodną w środkowych punktach między początkowymi danymi - może wyglądać odrobinę lepiej. W końcu myślę, że znalezienie właściwego narzędzia do pracy ma tutaj zastosowanie .. – agentp

+0

@george - Nie mogłem się zgodzić. Chociaż * możesz * to zrobić z gnuplot, nie wiem, że ty * powinieneś *.Byłoby znacznie łatwiej zrozumieć/zmodyfikować, gdybyś napisał szybki skrypt, by wziąć pochodną w innym języku i wyposażył ją w gnuplot, jak sądzę. – mgilson

2

Alternatywny (bardziej ogólne) składni wykreślić pochodną podaje here 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' 

Objaśnienie: Modyfikator pliku danych (po przy użyciu) w nawiasach należy interpretować jako obliczone współrzędne punktu (x) :(y), obliczane wiersz po wierszu z pliku danych. Dla każdego wiersza wartości kolumn (1 $, 2 $, ...) są modyfikowane przez dozwolone operacje arytmetyczne. Wartość nawiasów jest ostatnim wyrażeniem na liście wyrażeń rozdzielanych przecinkami. Pierwsze dwa są oceniane najpierw i przechowywane w zmiennych, które są używane później i dla następnego rzędu. Kod pseudo do powyższych parametrów to:

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 

dodatkową: Wyjaśnienie to może być również użyte do interpretowania @andryas roztworu pochodnej funkcyjnej D2 (x, y). Jedyna różnica polega na użyciu 0 USD. 0 $ w gnuplot to kolumna "zerowa" pliku danych, zasadniczo numer wiersza (jak w arkuszu kalkulacyjnym, po zignorowaniu linii komentarza w pliku danych). $0==0? sprawdza, czy jest to pierwszy wiersz i przypisuje 1/0 (NaN), więc polecenie fabuły ignoruje i nie wykreśla go. Kod jest jednak poprawny tylko wtedy, gdy długość interwału jest stała (w powyższym przypadku 0,5). Z drugiej strony, kod Viktora oblicza przedział dla każdego rzędu.

+0

Wygląda na to, że to rozwiązanie zakłada, że ​​każdy punkt jest równomiernie rozmieszczony wzdłuż osi x (lub czasu). Czy można go rozszerzyć, aby obsługiwać przypadek, w którym punkty danych są oddzielone zmiennym czasem? –

Powiązane problemy