У меня есть какая-то функция, которая ведет себя так, как показано ниже, т.е. некоторые конические / затухающие колебания
Я хочу подогнать данные, используя scipy's curve_fit . Ранее я задавал вопрос, связанный с подгонкой функций с помощью scipy, , на который здесь хорошо ответили , и подчеркивал важность первоначального предположения для значений подгоночных параметров.
Однако я я изо всех сил пытаюсь приспособить эти данные таким образом, чтобы охватить как колебания, так и затухание. Мой подход заключается в следующем:
from scipy.optimize import curve_fit
import numpy as np
def Fit(x,y):
#Define the function fit
func = ansatz
#Define the initial guess of parameters
mag = (y.max() + y.min()) / 2
y_shifted = y - mag
omega_guess = np.pi * np.sum(y_shifted[:-1] * y_shifted[1:] < 0) / (x.max() - x.min())
lam = np.log(2) / 1e7 #Rough guess based on approximate half life
p0 = (mag,mag, omega_guess,mag,lam)
#Do the fit
popt, pcov = curve_fit(func, x,y,p0=p0)
# return
return func(x, *popt)
def ansatz(x,A,B,omega,offset,lam):
osc = A*np.sin(omega*x) + B*np.cos(omega*x)
linear = offset
decay = np.exp(-x*lam)
return decay*osc + linear
data = np.load('example.npy')
x = data[:,0]
y = data[:,1]
yFit = Fit(x,y)
Этот подход фиксирует распад, но не колебания. Что ошибочного в моем подходе? Догадываетесь о подходящих параметрах? Функция анзац? Реализация кода?