2

第 2 種変形ベッセル関数を含むフィッティング関係を使用して、gnuplot にデータをフィッティングしたいと考えています。それでは、次のように見えるとしましょう。

f(x)= A*x + b*besselk(1,b)

(私はmatlabまたはオクターブでそれを書きました。係数は、フィットで見つけたいのですが、Aとbなので、そのうちの1つはベッセルにあります)。しかし問題は、gnuplot が修正された第 2 種ベッセル関数を持っていないことです。

どうすればそれができるか誰にも分かりますか?

4

1 に答える 1

3

通常、最適な戦略は、非線形または非多項式の問題を線形または多項式の問題に減らすことです。特に、線形問題には常に唯一の解があります。f(x) = A*x + Bしたがって、理想的にはどこに収まるか - これは第 2 種ベッセル関数です。Gnuplot では利用できない、修正されB = b * besy1(b)た第 2 種ベッセル関数については、以下の編集を参照してください。次のようにします。

fit A*x + B "datafile" via A, B

取得したら、atとの交点に対応する をB見つけることができます。は振動的であるため、いくつかの結果が得られる可能性がありますが、データが与えられた範囲に応じて、正しいものを選択できます。近似から得たとします。区間の交点は次のようになります。by = x * besy1(x)Bx = bbesy1(x)B = 1.2[0:10]

plot [0:10] x*besy1(x), 1.2

ここに画像の説明を入力

関心領域が のあたりx = 4.65で、交点の 1 つのおおよその位置がある場合は、正確な交点を探します。x * besy1(x)との間の距離Bはこの領域でゼロに近づくため、距離の 2 乗は明確に定義された最小値を持つ放物線で近似できます。

plot [4.6:4.7] (x*besy1(x)-1.2)**2

ここに画像の説明を入力

あなたの最適x = bは、この最小の位置です。これをデータとしてエクスポートし、 でf(x) = a2*x**2 + b2*x + c2与えられる最小値f'(x) = 0、つまり で放物線に適合させることができx = -b2 / (2.*a2)ます。

set table "data_minimum"
plot [4.6:4.7] (x*besy1(x)-1.2)**2
unset table
fit [4.6:4.7] a2*x**2 + b2*x + c2 "data_minimum" via a2,b2,c2
print -b2/2./a2

これによりx = 4.65447163370989、 の最適bに対応する最小の位置が得られB = b*besy1(b)ます。

これの精度は、二次近似の良さに依存します。これは、x 値の範囲の最小値がどれだけ狭いかに依存します。この場合、範囲[4.6:4.7]により、二次近似は非常に良好ですが、完全ではありません (さらに絞り込むことができます)。

plot [4.6:4.7] "data_minimum" t "data", a*x**2+b*x+c t "quadratic fit"

ここに画像の説明を入力

編集

修正された第 2 種の Bessel 関数や、Gnuplot では利用できないその他の複雑な関数については、外部パーサーを使用できます。たとえば、外部の python コードを使用して関数を解析する方法に関する私の回答を参照してください: Passing Python functions to Gnuplot

scipy私の他の回答(ファイル名)からPythonスクリプトを変更する関数にアクセスするために使用できますtest.py

import sys
from scipy.special import kn as kn

n=float(sys.argv[1])
x=float(sys.argv[2])

print kn(n,x)

そしてGnuplot内ではこれを次のように使用します

kn(n,x) = real(system(sprintf("python test.py %g %g", n, x)))

に置き換えるだけで、上記のすべての手順が機能besy1(x)kn(1,x)ます。

于 2015-08-15T12:19:57.543 に答える