2017-11-14 4 views
0

と機能をフィッティング: enter image description hereは、私は以下のグラフの一部に機能に合うようにしようとしていますheavysideのステップ関数

私は信号が指数関数的に増加し始める時間を知りたいです。これを行うために、データに指数曲線をフィットさせ、階段状の階段関数を掛けました。

enter image description here

私は期待したい:私は唯一の指数部は私が次のグラフを取得し合うとき

def fit(x, a, b, c, d, e): 
    return np.heaviside(x-a, 0.5)*b*np.exp(c*x-d)+e 

parameter, covariance = curve_fit(fit, fitx, fity) 

x = np.linspace(min(fitx), max(fitx), 1000) 
plt.plot(fitx, fity) 
plt.plot(x, fit(x, *parameter), 'b-', label='fit') 
plt.show() 

結果は何とか直線

enter image description here

ですx軸の直線、画像2の指数関数グラフが続きます。誰かが間違っていた場所を知っていますか?

+0

パラメータ「a」の適切な開始点を指定する必要があるかもしれません。 –

+0

@IgnacioVergaraKauselは、多くのお手伝いをしました! – tomM

+0

私はフィッティングの問題の70%が悪い出発点であると言いたいと思います。私は答えとしてコメントを入れます。 –

答えて

1

最も可能性の高い状況は、パラメータのコンバージェンスに問題があることです。ほとんどの場合、このコンバージェンスの問題は、パラメータの開始点が悪いためです。

heavyside関数がないと期待どおりに動作するため、関数呼び出しでパラメータaの合理的な開始点を指定する必要があります。

+1

非線形ソルバーの出発点を見つけるために、scipyはscipy.optimize.differential_evolution遺伝的アルゴリズムモジュールを追加しました。 Latin Hypercubeアルゴリズムを使用してパラメータ空間を徹底的に検索するため、検索可能なパラメータ値の範囲が必要ですが、これらの境界はかなり寛大である可能性があります。私は、このscipyモジュールを使用して、二重ローレンツェピーク方程式をカーボンナノチューブのラマン分光データに適合させるための初期パラメータ推定値を生成しました:https://bitbucket.org/zunzuncode/ramanspectroscopyfit –

+0

それについて知っておいてください。 –

0

「信号が指数関数的に増加し始める時間」を探したいとしますが、プロットされた信号は指数関数的に増加しません。実際、それは減少しています(少なくとも時間が増え、左から右へ)。ピークのように見えます。あなたは、そのドロップにいくつかの関数を適合させたいということを意味しますか?

私はガウスがうまくいくと思います。ステップ関数を使用することもOKかもしれませんが、おそらくt = 1e-8程度以上には収まりません。

あなたはデータや完全なコードを含めなかったので、具体的な例を挙げるのは難しいです。しかし、lmfitパッケージが役立つかもしれません。これは、線形関数または誤差関数またはロジスティック曲線を使用できる組み込みステップモデルを備えています。 http://lmfit.github.io/lmfit-py/builtin_models.html#step-like-modelsを参照してください。これはあなたがしようとしているものに近いかもしれません。

関連する問題