Gnuplot - подгонка функции к определенному значению, проблема с последней (первой) строкой файла данных - PullRequest
0 голосов
/ 17 октября 2018

В последнее время у меня возникают проблемы с двумя простыми графиками.

Я пытаюсь построить несколько функций (полагаю, что синтаксис для этого может быть намного проще), где каждая из них подходиттолько к одной строке данных.

Файл данных:

11[V] 2.92 4.64 0.04 0.04 0.031[mA]
9[V] 3.32 4.72 0.04 0.04 0.025[mA]
8[V] 3.52 4.76 0.04 0.04 0.022[mA]
7[V] 3.72 4.80 0.04 0.04 0.019[mA]
6[V] 3.92 4.88 0.04 0.04 0.016[mA]
4[V] 4.32 4.92 0.04 0.04 0.010[mA]

Команды Gnuplot:

set terminal epscairo color enhanced
set encoding utf8
set xrange[2.8:4.6]
set key left top
set grid
set xlabel 'Napięcie na złączu kolektor-emiter [V]'
set ylabel 'Prąd płynący przez złącze kolektor-emiter [mA]'
set output "dat1_2.eps"
f1(x)=a1*tanh(x)
fit f1(x) "dat1_2.dat" every ::::1 u 2:(($3-0.65)/0.25) via a1
f2(x)=a2*tanh(x)
fit f2(x) "dat1_2.dat" every ::1::2 u 2:(($3-0.65)/0.25) via a2
f3(x)=a3*tanh(x)
fit f3(x) "dat1_2.dat" every ::2::3 u 2:(($3-0.65)/0.25) via a3
f4(x)=a4*tanh(x)
fit f4(x) "dat1_2.dat" every ::3::4 u 2:(($3-0.65)/0.25) via a4
f5(x)=a5*tanh(x)
fit f5(x) "dat1_2.dat" every ::4::5 u 2:(($3-0.65)/0.25) via a5
f6(x)=a6*tanh(x)
fit f6(x) "dat1_2.dat" every ::5 u 2:(($3-0.65)/0.25) via a6
#there is a long plotting line below
plot "dat1_2.dat" using 2:(($3-0.65)/0.25):4:($5/0.25) with xyerrorbar title "Zależność zmierzona", "dat1_2.dat" u ($2+0.07):(($3-0.65)/0.25-0.05):6 with labels notitle font 'Verdana,7.5', f1(x) notitle lt rgb "blue", f2(x) notitle lt rgb "blue", f3(x) notitle lt rgb "blue", f4(x) notitle lt rgb "blue", f5(x) notitle lt rgb "blue", f6(x) notitle lt rgb "blue"

Результат:

[...]
variance of residuals (reduced chisquare) = WSSR/ndf   : 0.0116479
Final set of parameters            Asymptotic Standard Error
=======================            ==========================
a5              = 17.0097          +/- 0.07636      (0.4489%)
         Read 1 points
         line 0: No data to fit

         line 0: undefined variable: a6

Я очень мало представляю, как заставить gnuplot использовать последнюю (первую?) Строку.Простой трюк с удвоением последней строки файла данных дает ожидаемый результат, но он слишком неприятен для меня, и я хотел бы понять, что здесь происходит.

Второй вопрос: как заставить gnuplot соответствовать функциипройти через определенную точку.Позвольте мне показать, что я имею в виду:

https://i.imgur.com/WtLSpj4.png

Как видите, подогнанные функции не проходят через вычисленные значения (пренебрегая ошибочными панелями).Это довольно удивительно для меня, так как, имея только одну точку, я ожидал, что gnuplot сделает то, что я упомянул.Какая команда будет соответствовать f функциям таким желаемым образом?

1 Ответ

0 голосов
/ 17 октября 2018

С помощью every ::::0 или every ::1::2 вы выбираете две точки, через которые может пройти gnuplot, но every ::5 выбирает только одну точку, через которую gnuplot не может соответствовать.

Однако из вашего объяснения я делаю вывод, что вам нужно только вычислить правильный коэффициент масштабирования с учетом одной точки.Учитывая значения в одной строке x0 и y0, ваша функция через эту точку равна

f0(x) = (y0 - 0.65)/(0.25 * tanh(x0)) * tanh(x)

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

y(ydat) = (ydat - 0.65)/0.25
plot "dat1_2.dat" using (x0=$2):(y0=y($3)):4:($5/0.25) every ::::0 with xyerrorbars title "first",\
 y0/tanh(x0) * tanh(x) lc rgb "blue" notitle

Используя array, который доступен начиная с gnuplot 5.2, это можно красиво построить в виде циклов по всем строкам:

y(ydat) = (ydat - 0.65)/0.25
set xrange [2.8:4.6]
N = 6
array X[6]
array Y[6]
array Labels[6] = [ "first", "second", "third", "fourth", "fifth", "sixth" ]
plot for [i=1:N] "dat1_2.dat" using (X[i]=$2):(Y[i]=y($3)):4:($5/0.25) every ::(i-1)::(i-1) with xyerrorbars title Labels[i],\
     for [i=1:N] Y[i]/tanh(X[i]) * tanh(x) lc rgb "blue" notitle

enter image description here

...