适合数据的erf功能

时间:2016-09-01 08:17:12

标签: python python-3.x numpy scipy

所以我有滞后循环。我想使用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 参数[0] = 1.83289895,参数1 = 0.27837306

1 个答案:

答案 0 :(得分:2)

我怀疑在这里需要两件事情才能很好地契合。首先,我认为您需要将mFL添加到erfunc函数中,其次,正如Glostas所建议的那样,您需要为拟合参数指定一些初始猜测。我创建了一些人工数据,试图复制您的数据。左边的图是在给curve_fit一些初始参数之前,右边的图是在之后。

enter image description here

以下是重现上述情节的代码

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')