Подходит функция erf к данным

Так что у меня петля гистерезиса. Я хочу использовать функцию 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 контролирует положение кривой эрф и b наклон кривой. (Насколько мне известно)

Однако, когда я строю графики полученные данные x_erf и y_erf (синим цветом). Я получаю следующую примерку, которая не идеальна, если не сказать больше:

Данные с эрф фитинга

Есть ли способ, которым я могу получить правильную посадку?

Изменить: Ссылка на файл данных: https://www.dropbox.com/s/o0uoieg3jkliun7/xydata.csv?dl=0 Params [0] = 1.83289895, Params 1 = 0.27837306

1 ответ

Решение

Я подозреваю, что две вещи необходимы для хорошей подгонки здесь. Во-первых, я считаю, что вам нужно добавить mFL на ваш erfunc функция, а во-вторых, как предлагает Глостас, вам нужно указать некоторые начальные догадки для ваших параметров подгонки. Я создал некоторые искусственные данные в попытке воспроизвести ваши данные. Сюжет слева перед подачей curve_fit некоторые начальные параметры и сюжет справа после.


Вот код для воспроизведения приведенных выше графиков

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')
Другие вопросы по тегам