Построение сложных графиков по точкам с аппроксимацией данных

В ходе различных экспериментов иногда требуется построить график для последующего анализа полученных данных. Для этих целей можно воспользоваться Microsoft Excel или любыми другими Open Source аналогами, но из-за их ограниченного функционала провести правильный анализ экспериментальных данных бывает не так то и просто. Для таких целей можно воспользоваться бесплатной утилитой GnuPlot.

Введение

Gnuplot — это консольная программа для построения простых и сложных двух- и трехмерных графиков. Программа работает на всех большинстве компьютеров и операционных систем (GNU/Linux, Microsoft Windows, Mac OS X, и др.). Несмотря на свое название, эта программа не распространяется на условиях GNU General Public License (GPL). У программы своя лицензия, допускающая выпуск модифицированных версий в виде патчей к исходному коду.

Установка и настройка

Вы можете установить GnuPlot в качестве компонента Octave или в виде отдельного пакета. Для установки GnuPlot в систему на Fedora/CentOS/RHEL выполните:

sudo yum -y install gnuplot

На openSUSE:

sudo zypper install gnuplot

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

cd ~
mkdir -p ~/plot_data/

Экспериментальные данные

В данном примере будут использоваться результаты первого упражнения 224 работы общего физического практикума МГУ «Измерение температуры полупроводниковыми термометрами». Создайте в директории файл data.txt — файл с исходными данными. В данном случае текстовый файл содержит результаты исследования вольт-амперной характеристики полупроводникового термометра. Данная зависимость является экспоненциальной, поэтому теоретически зависимость напряжения от логарифма силы тока должна быть линейной.

#U		lnI			du			dlnI
0.645	-7.6417		0.001		0.02
0.666	-6.8782		0.001		0.01
0.678	-6.4001		0.001		0.006
0.685	-6.1469		0.001		0.005
0.692	-5.8925		0.001		0.004
0.697	-5.7199		0.001		0.003
0.701	-5.5519		0.001		0.0024
0.705	-5.3926		0.001		0.0021
0.708   -5.2923		0.001		0.002
0.712	-5.1328		0.001		0.0017
0.715	-5.0268		0.001		0.0015
0.718	-4.9171		0.001		0.0014
0.722	-4.7807		0.001		0.0012
0.723	-4.7376		0.001		0.0011
0.724	-4.6907		0.001		0.001
0.727	-4.6082		0.001		0.0009

Первая колонка отвечает за напряжение на термометре, вторая колонка логарифм силы тока, третья и четвертая — погрешность U и lnI соответственно. Первая строчка это комментарий для лучшего восприятия исходных данных.

Так же создайте файл plot.sh следующего содержания:

#!/usr/bin/gnuplot -persist
set xlabel "Напряжение, В"
set ylabel "Логарифм силы тока"
set xrange[0.644:0.728]
set grid

f(x) = a * x + b
fit f(x) "data.txt" using 1:2 via a,b

plot "data.txt" using 1:2:3:4 notitle with xyerrorbars, \
f(x) title "Функция зависимости напряжения от логарифма силы тока" with line,\

Рассмотрим файл plot.sh построчно:

  • задает полный путь к интерпретатору, который будет вызван для выполнения данного скрипта:
#!/usr/bin/gnuplot -persist
  • устанавливает подпись оси OX и OY:
set xlabel "Напряжение, В"
set ylabel "Логарифм силы тока"
  • устанавливает масштаб графика по оси OX (не обязательно указывать):
set xrange[0.644:0.728]
  • включает отображение сетки на графике:
set grid
  • задает функцию (в данном случае линию ax+b),  для которой будет происходить аппроксимация данных; в качестве параметров a и b используются точки из первого и второго столбца соответственно:
f(x) = a * x + b
fit f(x) "data.txt" using 1:2 via a,b
  • отображает на графике сначала точки с погрешностью, а затем рисует получившуюся прямую:
plot "data.txt" using 1:2:3:4 notitle with xyerrorbars, \
f(x) title "Функция зависимости напряжения от логарифма силы тока" with line,\

Построение графика

Для построения графика, файлу plot.sh надо дать права на исполнение. Проще всего сделать это командой (для этого вы должны находиться в той же директории, что и файл plot.sh):

chmod +x plot.sh

Затем введите в терминал:

./plot.sh

У вас должна появиться похожая картина, а в терминал будет выведены коэффициенты a и b:

a               = 37.2804          +/- 0.1261       (0.3382%)
b               = -31.6888         +/- 0.08845      (0.2791%)

graph_log