2016-09-01 2 views
1

Итак, у меня есть петля гистерезиса. Я хочу использовать функцию erf, чтобы она соответствовала моим данным.Fit функция erf для данных

Часть моего цикла показана черным на нижнем графике.

Я пытаюсь использовать функцию scipy.optimize.curve_fit и scipy.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

Есть ли способ я могу получить надлежащую подгонку?

Edit: Ссылка на файл данных: https://www.dropbox.com/s/o0uoieg3jkliun7/xydata.csv?dl=0 Params [0] = 1,83289895, Params 1 = 0,27837306

+0

Какие значения 'params'? Можете ли вы дать нам фактические значения x_data и y_data, чтобы мы могли запустить это сами? – Eric

+1

Вы пробовали разные стартовые значения? Возможно, вы оптимизированы в каких-то локальных минимумах. – Glostas

ответ

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

Чтобы достичь еще лучшей подгонки, вы можете добавить четвертый параметр как y-offset, чтобы увеличить синюю кривую, чтобы лучше совместить данные. – lanery

Смежные вопросы