gnuplot pozwala na dopasowanie dowolnej krzywej danych pomiarowych.
W tym poradniku zamierzam wyjaśnić jak wykorzystywać polecenie fit
w skrypach gnuplot ale również w ogóle jak korzystać z gnuplota do tworzenia wykresów (a raczej jak ja go używam).
W tej sekcji opisuję jak mniej więcej zabieram się do tworzenia wykresu:
- W LibreOffice Calc wyliczamy potrzebne dane.
- Teraz należy je skopiować (Ctrl+C) i wkleić do pliku tekstowego np.
cwl134_A.dat
Przydatne: Jeżeli przypadkiem wkleasz do vima tak jak ja i skopiowałes z kolumn które nie są obok siebie możesz zrobić tak:%s/\t\+/\t/g
(zamiana powtarzających się tabów na jednego taba). Jakby w pierwszej linijce było coś innego niż dane (na przykład tytuły kolumn to polecam dać#
bo gnuplot randomowo ma z tym problem. - Tworzymy skrypt gnuplota (np. cwl134_A.gnuplot):
#!/usr/bin/env gnuplot
# ^ dla kompatybilności z linuxem
# 1. ustawienie plików wyjścia
# 1.1 dla szybkiego debugowania output w postaci png jest przydatny
set terminal png
set output "cwl134_A.png"
# 1.2 dla finalnego rezultatu eksportuję plik do postscripta kompatybilnego z latexem
#set terminal epslatex
#set output "cwl134_A.tex"
# 1.3 logi z fitów są potrzebne w procesie dopisywania statystyki do sprawozdań
set fit log "cwl134_A.log"
# z siatką wygląda lepiej
set grid
# opisy osi
set xlabel "czas [s]"
set ylabel "położenie [m]"
- tutaj następuje część odpowiedzialna za fitowanie opisana w następnej sekcji
- na koniec wystarczy dopisać właściwą komendę wkreślającą:
plot "cwl_134_A.dat" using 1:2 with points pt 7 ps 2 title "punkty pomiarowe", \
f(x) with lines title (sprintf("dopasowanie: f(x)=%.2f x + %.2f", a,b))
- Odpalamy skrypt i działa.
Tak w telegraficznym skrucie:
Przy ustawionym terminalu epslatex
gnuplot generuje 2 rzeczy: .eps
i .tex
.
Poniższy kod wrzucamy w latexa i powinno działać (chyba nie trzeba dodaatkowych include'ów)
\begin{figure}[H]
\resizebox{\textwidth}{!}{\input{cwl134_A}}
\centering
\caption{Mój super wykres}
\end{figure}
Aby stworzyć dobre dopasowanie ważne jest aby wiedzieć jaką właściwie funkcję chcemy dopasować. W tym celu:
- uzyskujemy dostęp do odpowiedniej wiedzy lub dokumentacji z opisem tej zależności (np. wzór fizyczny)
- rysujemy wykres samych punktów (bez
f(x)
w komendzie z plot powyżej) i próbujemy zgadnąć zależność. Przydatne może okazać się skorzystanie z narzędzia typu https://desmos.com w celu zbadania zależności. Przykładowo jeśli chcemy dopasować funkcję w stylu$\frac{1}{r^2}$ musimy wstępnie zadecydować które parametry (które i gdzie je w ogóle wstawić) są nam potrzebne. Powyższa zależność ze wszystkimi możliwymi parametrami będzie wyglądać mniej więcej tak:
Przy wykorzystaniu takiego wzoru będziemy mieć 100% kontroli nad wykresem (polecam wpisać f(x)=A/((x+B)^2+C)+D
w https://desmos.com i "pobawić się" suwakami)
sama procedura fitowania w gnuplocie jest trywialnia (pozdrowienia dla pani dr E. A.)
# 1. najpierw definiujemy funkcję
f(x) = a/((x+b)^2+c)+d
# 2. wywołuję komendę fitującą.
fit f(x) "cwl134_A.dat" using 1:2 via a, b, c, d
Jak widać komenda fitująca składa się z kilku części:
- słowo kluczowe
fit
- nazwa funkcji którą ma dopasować
- nazwa pliku z danymi
using 1:2
to odniesienie do kolumn w pliku (format csv i te sprawy)- po
via
następuje lista zmiennych które program ma dopasować
Czasami gnuplot nie potrafi dopasować krzywej do danych. Może to wynikać z faktu że Twoje dane są dość "duże" (duże liczby) lub po prostu losowo coś mu nie wychodzi (miałem tak z dopasowywaniem gaussiana). NALEŻY WSTĘPNIE USTAWIĆ WARTOŚCI PARAMETRÓW. Możesz to zrobić w dwojaki sposób
- na oko
- korzystając z desmosa. Początkowe wartości ustawia się po prostu definiując parametry przed definicją f(x)
a = 7
b = -0.5
Po prostu piszesz losową rzecz i patrzysz czy się naprawiło
Moja powerstrategia na dopasowywanie krzywych (gdy wszystko inne zawiedzie) jest następująca:
- desmos ma możliwość importowania tabelek z excela. Dlatego robimy ctrl+C tabelki i ctrl+V do desmosa w komórkę. Powinien zaimportować jako ładną tabelkę i narysować punkty.
- teraz wpisujemy funkcję którą chcemy dopasować i bawimy się parametrami tak długo, aż jest +/- dobrze.
- Wtedy wystarczy przepisać wartości parametrów do gnuplota i go odpalić. Wtedy gnuplot powinien poprawić nasze "na oko" żeby wszystko pasowało idealnie.
mam nadzieję że jak ktoś już to przeczyta to sę mu przyda. LMK w komentarzach czy czy w ogóle ktoś tu trafił i jakiś feedback!
Dlaczego to napisałem? Szczerze nie wiem - siedzę o 22 i piszę sprawozdanie.