最近,在一些简单的绘图过程中,我一直困扰着两个问题。
我正在尝试绘制几个函数(我想该函数的语法可能会更简单),其中每个函数仅适合一行数据。
数据文件:
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功能?
答案 0 :(得分:1)
使用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