Как вписать эти данные в python и scipy? - PullRequest
1 голос
/ 02 марта 2020

У меня есть какая-то функция, которая ведет себя так, как показано ниже, т.е. некоторые конические / затухающие колебания enter image description here

Я хочу подогнать данные, используя 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)

Этот подход фиксирует распад, но не колебания. Что ошибочного в моем подходе? Догадываетесь о подходящих параметрах? Функция анзац? Реализация кода?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...