Korzystanie z programu Gnuplot (index)


Korzystanie z programu Gnuplot (4) - fitowanie

WPROWADZENIE

Polecenie fit umożliwia dopasowanie zdefiniowanej przez nas funkcji do zbioru danych pomiarowych. Dopasowanie opiera się na implementacji algorytmu najmniejszych kwadratów Marquardt-Levenberg. Fitowana funkcja musi zwracać wartości rzeczywiste. Można fitować funkcję dwóch zmiennych z=f(x,y). Zmienna zależna to domyślnie z, a kolejne możliwe zmienne niezależne to x, y, t, u, v.

Aby wspomóc algorytm dopasowujący należy podać parametry początkowe, z których algorytm wystartuje w procenie optymalizacji. Domyślna wartość startowa każdego parametru to 1. Jeżeli chcemy określić dokładność optymalizacji, to można to zrobić poprzez ustawienie parametru FIT_LIMIT (zmiana wyliczanej wartości pomiędzy dwoma iteracjami) lub FIT_MAXITER (maksymalna liczba iteracji).

Podanie zakresów pozwala ograniczyć zakres danych, które będą brane pod uwagę przy dopasowaniu. Standardowo są brane pod uwagę dwie kolumny danych [using 1:2:(1)]. Jeżeli podamy trzy kolumny (using 1:2:3), to trzecia kolumna interpretowana jest jako odchylenie standardowe s, które użyte jest jako waga punktu 1/s**2.

Wartości parametrów fitowanych powinny być zbliżone co do rzędu wielkości, aby fitowanie szybciej zbieżne (np. zamiast par można wstawic par*1e8).


gnuplot> help fit

# Składnia:
# fit {ranges} expression datafile {datafile-modifiers}
# via parameterfile | var1{,var2,...}

# ranges - [{dummy_variable=}{min}{:max}]
# expression - zwykle funkcja wcześniej zdefiniowana przez użytkownika
# datafile - nazwa pliku z danymi, do których dopasowywana jest funkcja
# datafile-modifiers - można użyć using, jak w plot
# via - precyzuje które parametry mają być fitowane
# parameterfile - plik z definicjami parametrów postaci
# var1 = value1
# var2 = value2
# Każdy parametr ma być podany w osobnej linii.

f(x) = a*x**2 + b*x + c
FIT_LIMIT = 1e-6              # default 1e-5

fit f(x) "measured.dat" via a,b,c                 # wczyta tylko x,y
fit f(x) "measured.dat" using 1:2:(1) via a,b,c   # podajemy wagę 1
fit f(x) "measured.dat" using 1:2:3 via a,b,c     # są podane wagi punktów
fit f(x) "measured.dat" via "start.par"           # parametry podane w pliku

Można fitować najwyżej pięć parametrów.
Dozwolone formaty i domyślne nazwy zmiennych:
z
x:z
x:z:s
x:y:z:s
x:y:t:z:s
x:y:t:u:z:s
x:y:t:u:v:z:s
Domyślne nazwy zmiennych można zmieniać w zakresach, ale nie można
zmieniać nazwy zmiennej z.
Opcja using powinna mieć tyle pozycji, ile niezależnych zmiennych plus dwa;
trzeba wyspecyfikować wszystkie pozycje.

# Format danych x:z:s, odchylenie s=1.
fit a*tanh(x/b) "measured.dat" using 1:2:(1) via a,b

# Format danych x:y:z:s, odchylenie s=1.
g(x,y) = a*x**2 + b*y**2 + c*x*y
fit g(x,y) "surface.dat" using 1:2:3:(1) via a,b,c

# Powierzchnia z=a*x+b*y+c, odchylenie s=1.
fit a*x+b*y+c "surface.dat" using 1:2:3:(1) via a,b,c

# Funkcja z=a*x+b*y, odchylenie s=1.
fit a*x+b*y "surface.dat" using 1:2:3:(1) via a,b

# Funkcja z=a*x+b*y+c*t, odchylenie s=1.
# Format danych x:y:t:z:s, odchylenie 1.
fit a*x+b*y+c*t "foo.dat" using 1:2:3:4:(1) via a,b,c

# Maksymalna liczba parametrów do fitowania.
# Format danych x:y:t:u:v:z:s, odchylenie s=1.
h(x,y,t,u,v) = a*x + b*y + c*t + d*u + e*v
fit h(x,y,t,u,v) "foo.dat" using 1:2:3:4:5:6:(1) via a,b,c,d,e

DOPASOWANIE PŁASZCZYZNY

Przy fitowaniu w trybie skryptowym gnuplot zapisuje dziennik operacji w pliku fit.log w trybie append.


# Plik surface.dat
# x, y, z
0	0	1.1
0.9	0	0
0	1	0
0.3	0.3	0.3

# Plik surface.gnu
# Dopasowanie płaszczyzny do danych.

set term postscript eps
set output "surface.eps"

set fit logfile "surface.log"           # zmieniam nazwę logfile

f(x,y) = a*x+b*y+c

fit f(x,y) "surface.dat" using 1:2:3:(1) via a,b,c

set key title "z = a x + b y + c"
set title "Dopasowanie plaszczyzny"
set xlabel "x"
set ylabel "y"
set zlabel "z"
set xrange [0:1]
set yrange [0:1]
set zrange []

# Najpierw plik, potem funkcja.
# Zakres dopasuje się do danych z pliku.
splot "surface.dat" title "eksperyment", f(x,y) title "teoria"

set output          # zamknięcie pliku 

ERRORVARIABLES


# Plik line.dat
0.	0.0
1.	1.1
2.	1.9
3.	3.0
4.	2.9
5.	5.1
6.	5.9
7.	7.0
8.	8.0

# Plik line.gnu
set term postscript 
set output "line.eps"

f(x) = a*x+b

# Ustawiam, że dla każdej zmiennej chcę znać niepewność.
# Niepewności będą zapisane do specjalnych zmiennych (*_err).
# Dla a to a_err, dla b to b_err.

set fit errorvariables

# Ustawiam parametry startowe procedury fitowania.
a = 2
b = 2

fit f(x) "line.dat" using 1:2 via a,b

# Przesuwamy legendę.
set key bottom title "f(x) = a x + b"

# Na tle rysunku wypiszemy dopasowane współczynniki.
set label 1 "a = %f",a," +/- %f",a_err at 3,9
set label 2 "b = %f",b," +/- %f",b_err at 3,8

set title "Dopasowanie prostej"
set xlabel "x"
set ylabel "y"
set xrange [0:10]
set yrange [0:10]

plot "line.dat" using 1:2 title "eksperyment", f(x) title "dopasowanie"

set output          # zamknięcie pliku

ZADANIE 4.1


Korzystanie z programu Gnuplot (index)