【发布时间】:2016-03-25 11:53:03
【问题描述】:
问题:我有一组表现出周期性变化的测量值(时间、测量值、误差),我想用傅里叶级数形式对它们进行拟合
其中 A0 是我测量的平均值,t 是时间,t0 是(已知)参考时间,P 是(已知)周期。我想拟合系数 A_k 和 phi_k。
这是我目前得到的:
# Find Fourier components
# nfourier is the number of fourier components
def fourier(coeffs, time_data, epoch, period, nfourier, A0):
import numpy as np
omega = 2.0*np.pi/period
fseries = np.zeros(len(time_data))
fseries.fill(A0)
for k in range(nfourier):
ak = coeffs[k]
phik = coeffs[k+1]
time_diff = time_data - epoch
fseries = fseries + ak * np.cos(k * omega * time_diff + phik)
return fseries
我估计残差如下:
def residuals(coeffs, measurement_data, time_data, error_data, epoch, period, nfourier, A0):
model = fourier(coeffs, time_data, epoch, period, nfourier, A0)
result = measurement_data - model
return result
然后我适合它:
def fit_it(coeffs, measurement_data, time_data, error_data, epoch, period, nfourier, A0):
from scipy.optimize import leastsq
opt_coeff = leastsq(residuals, coeffs, args=(measurement_data, time_data, error_data, epoch, period, nfourier, A0))
return opt_coeff
我不确定我在这里做错了什么,但也许专家可以提供一些建议。如果有人愿意提供帮助,我很乐意提供测试数据集。
【问题讨论】:
-
为什么不使用定义并通过对每个
cos()因子的缩放数据进行平均来估计系数?应该更简单。很难理解你使用的代码 -
嗨 Niko,你能给我举个例子来说明你的意思吗?我的数据只是一个时间序列,我将一些固定参数(epoch、period、nfourier、A0)作为函数之间的参数传递。该函数在fourier() 中定义,fit_it() 最小化(或至少应该)残差。它只是线性最小二乘拟合。
-
好的,我指的是fourier coeficients的实际定义,但是无论如何,仍然不太了解代码,例如epoch是如何相关的,或者其他一些参数?
-
基于我在原帖中给出的公式:coeffs - 这些是 A_k、phi_k 系数。测量数据 - 这些是我的 y 轴值。 time_data - x 轴值 (t) error_data - 测量数据中每个点的不确定性 epoch - 已知参考时间 (t0) period - 已知周期 (P) nfourier - 要拟合的傅立叶参数数量(例如 9) A0 - mean(measurement_data) 这有意义吗?
-
使用最小二乘法作为近似值是一种方法,但是请注意,最小二乘法将尝试找到全局近似值。这意味着,例如通过更改
nfourier参数,例如,从 2 到 3 并进行最小二乘,nfourier3 的前 2 个系数将不匹配nfourier2 的前 2 个系数(虽然这些应该匹配)。如果到目前为止我还没有正确理解代码
标签: python scipy time-series fft model-fitting