以下に示すように、peak-o-matを使用して曲線を ax/y データセットに適合させることができました。これは、線形の背景と 10 個のローレンツ曲線です。
多くの同様の曲線をフィッティングする必要があるため、Levenberg-Marquardt-Algorithm であるmpfit.pyを使用して、スクリプト化されたフィッティング ルーチンを作成しました。ただし、フィットには時間がかかり、私の意見では、peak-o-mat の結果よりも精度が低くなります。
開始値
固定された線形バックグラウンドでの結果の適合(peak-o-mat の結果から得られた線形バックグラウンドの値)
すべての変数を自由にして結果を当てはめる
開始値はすでに非常に近いと思いますが、線形の背景が固定されている場合でも、左ローレンツ分布は明らかに適合度を低下させます。
完全なフリー フィットの場合、結果はさらに悪化します。
Peak-o-mat はscipy.odr.odrpackを使用しているようです。今、より可能性が高いもの:
- 私はいくつかの実装エラーをしましたか?
- odrpack は、この特定の問題により適していますか?
より単純な問題 (中央に 1 つのピークがある線形データ) に当てはめると、peak-o-mat とスクリプトの間に非常に良い相関関係が示されます。また、ordpackについてはあまり見つけられませんでした。
編集:私は自分で質問に答えることができたようですが、答えは少し不安です. scipy.odr (odr または leastsq 法でのフィッティングを可能にする) を使用すると、制約がなくても結果がpeak-o-mat として得られます。
下の画像は、再びデータ、開始値 (ほぼ完璧)、そして odr と leastsq の適合を示しています。コンポーネント曲線は、odr のものです。
私はodrに切り替えますが、これはまだ私を動揺させます. メソッド (leastsq モードの mpfit.py、scipy.optimize.leastsq、scipy.odr) は、同じ結果をもたらすはずです。
そして、この投稿に出くわした人のために: ODR フィットを行うには、x と y の値にエラーを指定する必要があります。エラーがなければ、sx << sy で小さい値を使用します。
linear = odr.Model(f)
mydata = odr.RealData(x, y, sx = 1e-99, sy = 0.01)
myodr = odr.ODR(mydata, linear, beta0 = beta0, maxit = 2000)
myoutput1 = myodr.run()