web-dev-qa-db-ja.com

テーブルに新しいデータを作成し、適合させる

私は次のことをしたい:

ガウス線形に従ったデータセットがありますが、大きく逸脱しているデータがいくつかあります。結果の適合については、これらのデータポイントを含めないでください。

したがって、私の考えは、制限として2つのガウス分布を上と下に作成することです。そのため、これら2つのガウス分布の間にあるすべてのデータポイントだけが適合と見なされ、残りは外部と見なされません。

enter image description here

2つのガウス分布を簡単に作成し、次を使用してこれらのデータをテーブルに作成できます:(注意:data = data file)

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  

しかし、その後:すべてのデータが次々にリストされます。さらに、これら2つのガウス分布の間にある場合は、このデータを使用すると言って、後でどのように適合させるかがわかりません。

他に何かアイデアはありますか?

追加:

私はプログラミングや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)

最後から2番目の行で、gnuplotは次のように述べています:「未定義の変数:x」

もちろん何かが足りないか間違っていることは知っていますが、どうすれば解決できるのか本当にわかりません。多分あなたのセリフにもコメントできますか?私のような素人がそれを理解できるように?ありがとうございました :)

ここに2番目の追加:

これが私のテキストのすべてです:

    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ガウス制限を持っていません。

それで、私の上のテキストの何が問題になっていますか?

2
Mattes

次のような関数を作成して、データをフィルタリングできます。

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
Yorik

ガウス関数をファイルに保存する必要がある理由がわかりません。ガウス関数gを使用して直接作業できます。

データを2つのガウス分布と比較するため、フィルタリング関数には、考慮される位置で最大値と最小値を指定する必要があります。

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)
2
Joce