Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我试图用scipy curve_fit将周期数据拟合到模板,但它没有';我找不到句号_Python_Scipy_Scipy Optimize_Astronomy - Fatal编程技术网

Python 我试图用scipy curve_fit将周期数据拟合到模板,但它没有';我找不到句号

Python 我试图用scipy curve_fit将周期数据拟合到模板,但它没有';我找不到句号,python,scipy,scipy-optimize,astronomy,Python,Scipy,Scipy Optimize,Astronomy,我正试图写一个脚本,接收一颗潜在可变恒星的光度数据,并尝试将一个理论模板与之匹配,以确定它的几个特征,如周期和振幅 数据带有日期/时间(mjd,基本上是自公元前4713年1月1日以来的天数)和亮度(震级) 该模板是一个由相位和y值组成的数组,相位从t=0到t=0.998(增量为0.002),y在该期间从0到1再回到0 我的模型函数将拉伸和移动模板,使其具有与数据y值相同的峰间振幅和范围。我移动给定的t值,然后除以周期,得到相位方面的时间。我使用%1删除除小数以外的所有内容,因为我不关心数据来自哪

我正试图写一个脚本,接收一颗潜在可变恒星的光度数据,并尝试将一个理论模板与之匹配,以确定它的几个特征,如周期和振幅

数据带有日期/时间(mjd,基本上是自公元前4713年1月1日以来的天数)和亮度(震级)

该模板是一个由相位和y值组成的数组,相位从t=0到t=0.998(增量为0.002),y在该期间从0到1再回到0

我的模型函数将拉伸和移动模板,使其具有与数据y值相同的峰间振幅和范围。我移动给定的t值,然后除以周期,得到相位方面的时间。我使用%1删除除小数以外的所有内容,因为我不关心数据来自哪个周期,只关心它位于哪个周期中。(ex 347.65->0.65)

这可以正确地找到t0、振幅和yoffset的值,但无法找到周期。如果我在初始猜测中给出了正确的周期(p0),那么这将成功地将模板与数据相匹配。但是,如果周期关闭,它将不会改变初始猜测的周期

我怀疑这是因为我如何折叠数据并切掉整数部分,但对曲线拟合函数了解不够,无法找到修复方法。我还尝试使用scipy的最小二乘函数(我知道curve_fit是它的包装器),但也无法让它工作

有什么更好的方法可以做到这一点呢?

将在一段时间内“折叠”您的时间序列。然后,您可以将生成的折叠时间曲线拟合到正弦曲线(或任何模型),并查看哪个周期给出最佳结果

如果你不想随机尝试不同的时段,你可以对数据做一个简单的分析,然后寻找功率最高的时段。不过,我认为链接函数需要等间距的数据


是一个很好的描述时间序列是如何处理造父变星的。

一个玩具数据集可能会激励人们尝试一下。没有人希望重新创建您的数据格式,只是在事后被告知您的数据结构不同。
class tmpfitter:
    def __init__ (self, templets)
        self.n=0
        self.tmps=templets

    def model(self, t, period, t0, amplitude, yoffset):
        # modify the template using peak-to-peak amplitude, yoffset
        # shift times so phases line up, fold input times t by period
        xtemp = self.tmps[self.n,:,0]
        ytemp = self.tmps[self.n,:,1]*amplitude + yoffset
        ph = (t - t0) / period % 1 #Folds data into single period
        # interpolate the modified template at the phase we want
        return interp1d(xtemp,ytemp)(ph)


def tmpfit(templets,data,pinit):
    datfit = []
    npars = []
    fitter = tmpfitter(templets)
    # Iterate through all templates, finding a best fit for each, find best fit of best fits at end.
    for i in range(len(templets)):
        fitter.n = i
        pars, cov = curve_fit(fitter.model, data[:,0], data[:,1], sigma=data[:,2], p0=pinit, maxfev=10000)
        datfit.append(median(abs(fitter.model(data[:,0],pars[0],pars[1],pars[2],pars[3])-data[:,1])))
        npars.append(pars)
    n = np.argmin(datfit)
    return n, npars[n]