Skip to content

Instantly share code, notes, and snippets.

@gucio321
Last active January 8, 2025 22:02
Show Gist options
  • Save gucio321/55bb7da0d446cf76f41055b461922484 to your computer and use it in GitHub Desktop.
Save gucio321/55bb7da0d446cf76f41055b461922484 to your computer and use it in GitHub Desktop.
Tutorial: Fitowanie krzywych do danych pomiarowych w gnuplot

Wstęp

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).

Workflow tworzenia wykresu

W tej sekcji opisuję jak mniej więcej zabieram się do tworzenia wykresu:

  1. W LibreOffice Calc wyliczamy potrzebne dane.
  2. 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.
  3. 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]"
  1. tutaj następuje część odpowiedzialna za fitowanie opisana w następnej sekcji
  2. 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))
  1. Odpalamy skrypt i działa.

Użycie z latex

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}

Tworzenie dopasowań

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:

$$ f(x) = \frac{A}{(r+B)^2 + C} + D $$

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ć

Problemy z dopasowaniami

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

ustawianie "na oko"

Po prostu piszesz losową rzecz i patrzysz czy się naprawiło

używając desmosa

Moja powerstrategia na dopasowywanie krzywych (gdy wszystko inne zawiedzie) jest następująca:

  1. 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.
  2. teraz wpisujemy funkcję którą chcemy dopasować i bawimy się parametrami tak długo, aż jest +/- dobrze.
  3. Wtedy wystarczy przepisać wartości parametrów do gnuplota i go odpalić. Wtedy gnuplot powinien poprawić nasze "na oko" żeby wszystko pasowało idealnie.

Zaończenie

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!

Motywacja

Dlaczego to napisałem? Szczerze nie wiem - siedzę o 22 i piszę sprawozdanie.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment