Criando novos dados em uma tabela e faz um ajuste

1

Eu quero fazer o seguinte:

Eu tenho um conjunto de dados seguindo uma forma de linha gaussiana, mas há alguns dados que estão se desviando strongmente. Para o ajuste resultante, esses pontos de dados não devem ser incluídos.

Então, minha ideia é criar um de Gaussian acima e outro abaixo como uma restrição. De modo que apenas todos os pontos de dados situados entre esses 2 Gaussianos são considerados no ajuste e o resto fora não.

Eupossocriarfacilmente2gaussianosecriaressesdadosemumatabelausando:(aviso:dados=arquivodedados)

settable'1.Gauss'plotg(x)+0.1unsettablesettable'2.Gauss'plotg(x)-0.1unsettablesettable'all'plot'1.Gauss','2.Gauss','data'unsettable

Masentão:todososdadossãolistadosumporoutro.AlémdissoeunãoseicomoseencaixarmaistardedizendoapenasusaressesdadosseforentreestesdoisGaussianos.

Vocêtemalgumaoutraideia?

ADIÇÃO:

Nãoestourealmenteinteressadoemprogramarounognuplot,porissotenhodificuldadesemcompreenderassuasmensagens.Entãoaquiestátodaminhaprogramaçãonognuplot:

setxrange[1038.6603:1038.666]setyrange[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)

Na penúltima linha, o gnuplot diz: "variável indefinida: x"

Eu sei que algo está faltando ou errado, mas eu não sei realmente como resolver. Poderia talvez comentar suas linhas também? Para que um leigo como eu possa entender isso? Obrigado :)

AQUI 2ª ADIÇÃO:

aqui está todo o meu texto:

    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)

Isso me dá o erro "na linha 8: variável indefinida: x"

Portanto, meus dados estão no intervalo x entre: [1038.6598: 1038.6663]. Quando eu apago as últimas 3 linhas e uso apenas:

   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'

funciona, mas eu não tenho essa boa restrição de 2 Gauss.

Então, o que há de errado no meu texto superior?

    
por Mattes 12.05.2016 / 15:59

2 respostas

1

Você pode filtrar dados criando uma função como:

min_value = 1
max_value = 2
filterData(x)=(x < min_value || x > max_value) ? (1/0) : (x)
plot 'data' u 1:(filterData($2))

O operador ternário: (is this true) ? it is true : it is false e 1/0 é indefinido, o qual o gnuplot ignorará silenciosamente.

(não testado)

    
por 12.05.2016 / 17:18
1

Eu não entendo porque você precisaria salvar os Gaussians em arquivos, você pode trabalhar diretamente usando sua função de Gauss g .

Como você quer comparar seus dados com os dois Gaussianos, sua função de filtragem precisa receber o valor máximo e mínimo na posição considerada:

filterData(y,m,M)=((y<m||y>M)? 1/0 : y)

Então você pode traçar e / ou ajustar:

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)
    
por 13.05.2016 / 09:40

Tags