3

gnuplotでマルチブランチフィットをしたいです。2つの関数z1(x)とz2(x)を定義しましたが、z1(x)が49行目までのすべてのデータに適合し、50行目からはz2(x)に適合している必要があります。これは私がフィッティング部分で行うことです:

z(x,y) = (y < 50) ? z1(x) : z2(x)

fit z(x,y) 'data.txt' using  1:-1:2  via a, b

しかし、gnuplotはz2(x)の部分を完全に無視します。z2(x)の定義をコメントアウトすることもできますが、エラーも警告も表示されません。y> = 50の場合には到達しませんが、data.txtファイルには100行あります。

また、後でz1(x)とz2(x)をプロットすると、それらは定数ゼロ(z1 = z2 = 0)になりますが、近似パラメーターaとbは大まかに(2番目の分岐が無視されるため完全ではありません)正しい順序。

私はここで何か間違ったことをしていますか?良い例はありますか(公式のgnuplotフィットデモは役に立ちませんでした)?

4

1 に答える 1

3

'data.txt'ファイルの行番号がx関数の変数であるz(x)場合は、単純にすることができます(これは、実際に機能するために必要です!!!)。z(x,y)実際には、関数はz(x)2つの間隔で別々に定義された単一の変数関数です。サンプルデータファイルを使用して問題を再現しました。このファイルでは、データファイルの10番目のポイント(49または50が必要)の範囲z1(x)とブレークがあります。z2(x)

次のコードはあなたが望むことをします。z(x)最初の10個のデータポイントと残りのデータポイントで関数を異なる方法で定義します(これは、 xHASが行番号と等しくなる場所です)。

z1(x) = a*x + b
a = 1.2
b = 1.2
z2(x) = a + b
z(x) = x < 10 ? z1(x) : z2(x)

column(0)次に、データポイントの行番号( )をxとして、それぞれの行の値(1)をyとして使用し、パラメーターaを変更してデータファイルを近似します。b

 fit z(x) 'data.txt' using (column(0)):1 via a,b

そして、私たちがどのように行うかを見るためにプロットします

 plot 'data.txt' using (column(0)):1, z(x)

これが機能しない場合は、indexデータファイルをプロットするためのオプションを調べることができます。これには、データファイル内のデータ範囲(最初の50ポイント)を1行の空白行(または2行、覚えられない)で区切り、それに応じてスクリプトを変更する必要があります。

于 2012-12-04T00:11:58.323 に答える