2016-09-01 5 views
1

ヒステリシスループがあります。私はerf関数を使ってデータに合わせたいと思っています。データにerf関数を適合

ループの一部が下のグラフで黒く表示されます。

私は次のコードでデータを合わせてscipy.optimize.curve_fitscipy.special.erf機能を使用しようとしています:

import scipy.special 
import scipy.optimize 

def erfunc(x,a,b): 
    return mFL*scipy.special.erf((x-a)/(b*np.sqrt(2))) 

params,extras = scipy.optimize.curve_fit(erfunc,x_data,y_data) 

x_erf = list(range(-3000,3000,1)) 
y_erf = erfunc(x_erf,params[0],params[1]) 

mFLは一定で、aコントロールERF曲線の位置とb曲線の傾きであります。 (私の知る限り)

しかし、私は得られたx_erfとy_erfのデータを(青で)プロットします。私は、控えめに言っても理想的ではないとする、次のフィッティングを得る:

Data with erf fitting plot

私は適切なフィットを得ることができる方法はありますか?

編集:データファイルへのリンク :https://www.dropbox.com/s/o0uoieg3jkliun7/xydata.csv?dl=0 のparams [0] = 1.83289895、PARAMS 1 = 0.27837306

+0

を再現するコードはありますか? x_dataとy_dataの実際の値を教えて、これを自分で実行することはできますか? – Eric

+1

異なる開始値を試したことがありますか?おそらくローカルミニマムに最適化されているかもしれません。 – Glostas

答えて

2

私は二つのことがここで良いフィット感のために必要とされている疑いがあります。まず、erfunc関数にmFLを追加する必要があると思います.2番目に、Glostasの示唆するように、フィッティングパラメータの初期推測をいくつか指定する必要があります。私は、あなたのデータを複製するために人工データを作成しました。左のプロットは、curve_fitにいくつかの初期パラメータを与える前で、右のプロットは後です。

enter image description here


ここでは上記のプロット `params`の値であり、どのような

import numpy as np 
from scipy.special import erf 
from scipy.optimize import curve_fit 
import matplotlib.pyplot as plt 


def erfunc(x, mFL, a, b): 
    return mFL*erf((x-a)/(b*np.sqrt(2))) 

x_data = np.linspace(-3000, 3000, 100) 

mFL, a, b = 0.0003, 500, 100 

y_data = erfunc(x_data, mFL, a, b) 
y_noise = np.random.rand(y_data.size)/1e4 
y_noisy_data = y_data + y_noise 

params, extras = curve_fit(erfunc, x_data, y_noisy_data) 
# supply initial guesses to curve_fit through p0 arg 
superior_params, extras = curve_fit(erfunc, x_data, y_noisy_data, 
            p0=[0.001, 100, 100]) 

fig = plt.figure() 
ax1 = fig.add_subplot(121) 
ax2 = fig.add_subplot(122) 

ax1.plot(x_data, erfunc(x_data, *params)) 
ax1.plot(x_data, y_noisy_data, 'k') 
ax1.set_title('Before Guesses') 

ax2.plot(x_data, erfunc(x_data, *superior_params)) 
ax2.plot(x_data, y_noisy_data, 'k') 
ax2.set_title('After Guesses') 
+0

さらに良いフィットを得るには、青い曲線をバンプアップしてデータをより良く一致させるためにyオフセットとして4番目のパラメータを追加します。 – lanery

関連する問題