我想绘制我的拟合峰的子峰。我有一个带有主峰和肩峰的复合峰。我可以拟合并绘制它,但我需要构建光谱的各个子峰。我怎样才能绘制它们呢?我的代码如下:
set term png
set fit quiet
set fit logfile "peakfitdatalog.txt"
do for[i = 0:20] for [j = 0:20] {
outfile = "testmap_Y".(sprintf('%02d_X%02d',j,i)).".png"
set output outfile
set xrange [900:1000]
x01=960
w1=10.64
a1=50000
mu1=0.90
x02=967
w2=10.64
a2=500
mu2=0.90
y0=350
y1=0.1
voigtfv(x)=y0+y1*x+a1*((2./pi)*w1/(4.*(x-x01)**2.+w1**2.))+a2*((2./pi)*w2/(4.*(x-x02)**2.+w1**2.))
fit voigtfv(x) "testmap_Y".(sprintf('%02d_X%02d',j,i)).".txt" via a1, a2, w1, w2, y0, y1
plot "testmap_Y".(sprintf('%02d_X%02d',j,i)).".txt", voigtfv(x)
set print "fit_param.dat" append
print sprintf("%i,%i,%i,%i",a1,a2,w1,w2)
set print
}
我尝试在绘制主要拟合和绘图程序后单独绘制每个峰值,但不起作用,我只看到拟合程序的结果是子峰值。
首先,voigtfv函数第四项的分母中出现“w1”可能是“w2”的拼写错误。
通用非线性拟合(如 Gnuplot 的 fit 命令)可能无法收敛到您想要的解,具体取决于初始值。您可以通过在 gnuplot 命令行上键入“help fitstarting_values”来阅读有关初始值的注释。
只要你的样本数据,当'a2'的初始值设置为与'a1'相同的大小时,它就可以很好地工作。
set xrange [900:1000]
set offset 0, 0, graph 0.3, 0
x01=960
w1=10.64
a1=50000
x02=967
w2=10.64
a2=50000 ### changed
y0=350
y1=0.1
voigtfv(x)=y0+y1*x\
+a1*((2./pi)*w1/(4.*(x-x01)**2.+w1**2.))\
+a2*((2./pi)*w2/(4.*(x-x02)**2.+w2**2.))
fit voigtfv(x) "testmap_Y.txt" via a1, a2, w1, w2, y0, y1
plot "testmap_Y.txt", voigtfv(x), \
a1*((2./pi)*w1/(4.*(x-x01)**2.+w1**2.)),\
a2*((2./pi)*w2/(4.*(x-x02)**2.+w2**2.))