如何在python和scipy中适应这些数据?

如何在python和scipy中适应这些数据?,python,scipy,curve-fitting,scipy-optimize,Python,Scipy,Curve Fitting,Scipy Optimize,我有如下所示的一些函数,即一些锥形/衰减振荡 我想使用。我之前问过一个与scipy拟合函数相关的问题,并强调了拟合参数值初始猜测的重要性 然而,我正在努力适应一种既能捕捉振荡又能捕捉衰减的方式。我的做法如下: from scipy.optimize import curve_fit import numpy as np def Fit(x,y): #Define the function fit func = ansatz #Define the initia

我有如下所示的一些函数,即一些锥形/衰减振荡

我想使用。我之前问过一个与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)
来自scipy.optimize import curve\u fit的

将numpy作为np导入
def配合(x,y):
#定义函数拟合
func=ansatz
#定义参数的初始猜测
磁极=(y.max()+y.min())/2
y_移位=y-mag
omega_guess=np.pi*np.sum(y_移位[:-1]*y_移位[1::<0)/(x.max()-x.min())
lam=np.log(2)/1e7#基于近似半衰期的粗略猜测
p0=(mag,mag,omega_猜,mag,lam)
#合身
popt,pcov=曲线拟合(func,x,y,p0=p0)
#返回
返回函数(x,*popt)
def ansatz(x,A,B,ω,偏移量,lam):
osc=A*np.sin(ω*x)+B*np.cos(ω*x)
线性=偏移
衰减=np.exp(-x*lam)
返回衰减*osc+线性
data=np.load('example.npy')
x=数据[:,0]
y=数据[:,1]
yFit=配合(x,y)

这种方法捕捉衰减,但不捕捉振荡。我的方法有什么错误?猜测拟合参数?安萨茨函数?代码实现

你可以让succeive fit找到一个好的初始猜测。首先拟合偏移量,然后去除它,然后拟合指数并去除它,然后只拟合振荡。你可以通过成功拟合来找到初始值,这是一个很好的初始猜测。首先拟合偏移量,然后删除它,然后拟合指数并删除它,然后只拟合振荡。