Gnuplot:用肩峰拟合和绘制峰,但也需要绘制单个峰

问题描述 投票:0回答:1

我想绘制我的拟合峰的子峰。我有一个带有主峰和肩峰的复合峰。我可以拟合并绘制它,但我需要构建光谱的各个子峰。我怎样才能绘制它们呢?我的代码如下:

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
}

我尝试在绘制主要拟合和绘图程序后单独绘制每个峰值,但不起作用,我只看到拟合程序的结果是子峰值。

gnuplot curve-fitting data-fitting spectrum
1个回答
0
投票

首先,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.))

© www.soinside.com 2019 - 2024. All rights reserved.