我想要执行以下操作:
我有一组遵循高斯线形状的数据集,但有些数据偏差很大。对于最终的拟合,不应包括这些数据点。
因此我的想法是创建两个高斯函数,一个在上,一个在下,作为限制。这样,只有位于这两个高斯函数之间的所有数据点才会被考虑在内,而其余的数据点则不会。
我可以轻松创建 2 个高斯并使用以下命令在表中创建这些数据:(注意:数据=数据文件)
set table '1.Gauss'
plot g(x)+0.1
unset table
set table '2.Gauss'
plot g(x)-0.1
unset table
set table 'all'
plot '1.Gauss', '2.Gauss', 'data'
unset table
但是:所有数据都是一个接一个地列出的。此外,我不知道以后如何拟合,只说如果这些数据介于这两个高斯之间,就使用这些数据。
您还有其他想法吗?
添加:
我不太喜欢编程或 gnuplot,所以我很难理解您的信息。以下是我在 gnuplot 中编写的所有程序:
set xrange [1038.6603:1038.666]
set yrange [0.8:1.3]
file="data"
g(x) = N0*(A*exp(-(x-(b+d))2/(2*sigma2)))+c
N0=0.2; b=1038.66315;d=0.00001; c=1; A=3; sigma=0.0001
filterData(y,m,M)=((yM)? 1/0 : y)
fit h(x) file using 1:(filterData($2,g($1)-0.1,g($1)+0.1)) via N0,d,c,A,sigma
plot file using 1:(filterData($2,g($1)-0.1,g($1)+0.1)) g(x)-0.1, g(x)+1, h(x)
在倒数第二行,gnuplot 显示:“未定义变量:x”
我知道肯定有一些东西缺失或错误,但我真的不知道如何解决。也许可以评论一下你的代码?这样像我这样的外行也能理解吗?谢谢 :)
这里是第二条补充:
以下是我的全部文字:
set xrange [1038.6598:1038.6663]
set yrange [0.8:1.3]
set fit errorvariables
file= "09_05_16-10.thzpp"
g(x) = N0*(A*exp(-(x-(b+d))**2/(2*sigma**2)))+c
N0=0.2; b=1038.66315;d=0.00001; c=1; A=3; sigma=0.0001
filterData(y,m,M)=((y<m||x>M)? 1/0 : y)
fit h(x) file using 1:(filterData($2,g($1)-0.1,g($1)+0.1)) via N0,d,c,A,sigma
plot file using 1:(filterData($2,g($1)-0.1,g($1)+0.1)), g(x)-0.1, g(x)+1, h(x)
这给了我错误“第 8 行:未定义变量:x”
因此我的数据在 x 范围内:[1038.6598:1038.6663]。当我删除最后 3 行并改用:
fit [1038.6603:1038.666] [0.95:1.2] g(x) file via N0,d,c,A,sigma
plot file title 'Messung', g(x) title 'Fit'
它可以起作用,但是我没有这个很好的 2 高斯限制。
那么我上面的文字到底有什么问题呢?
答案1
您可以通过创建类似以下函数来过滤数据:
min_value = 1
max_value = 2
filterData(x)=(x < min_value || x > max_value) ? (1/0) : (x)
plot 'data' u 1:(filterData($2))
三元运算符:(is this true) ? it is true : it is false
和1/0
未定义,gnuplot 将默认忽略它。
(未经测试)
答案2
我不明白为什么你需要将高斯保存到文件中,你可以直接使用高斯函数来工作g
。
因为您想要将数据与两个高斯分布进行比较,所以需要在考虑的位置赋予过滤函数最大值和最小值:
filterData(y,m,M)=((y<m||y>M)? 1/0 : y)
然后您可以绘制和/或拟合:
fit h(x) 'data' using 1:(filterData($2,g($1)-0.1,g($1)+0.1)) via ...
plot 'data' using 1:(filterData($2,g($1)-0.1,g($1)+0.1)), \
g(x)-0.1, \
g(x)+0.1, \
h(x)