在表中创建新数据并进行拟合

在表中创建新数据并进行拟合

我想要执行以下操作:

我有一组遵循高斯线形状的数据集,但有些数据偏差很大。对于最终的拟合,不应包括这些数据点。

因此我的想法是创建两个高斯函数,一个在上,一个在下,作为限制。这样,只有位于这两个高斯函数之间的所有数据点才会被考虑在内,而其余的数据点则不会。

在此处输入图片描述

我可以轻松创建 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 false1/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)

相关内容