我正在研究原型的估算模块。目的是将适当的季节性变化参数发送到预报器模块。
最初,在预定曲线估计中,我们使用的是一年中某一天的季节性公式-具有5个订单的三角函数(固定)。它是这样的:
doy_seasonality = np.exp(z[0]*np.sin(2*np.pi*doy/365.)+z[1]*np.cos(2*np.pi*doy/365.)
+z[2]*np.sin(4*np.pi*doy/365.)+ z[3]*np.cos(4*np.pi*doy/365.)
+z[4]*np.sin(6*np.pi*doy/365.)+ z[5]*np.cos(6*np.pi*doy/365.)
+z[6]*np.sin(8*np.pi*doy/365.)+ z[7]*np.cos(8*np.pi*doy/365.)
+ z[8]*np.sin(10*np.*pi*doy/365.)+ z[9]*np.cos(10*np.pi*doy/365.))
即我们有5个固定订单[2, 4, 6, 8, 10]
现在,我们已经找到了一种通过快速傅立叶变换获取订单的更好方法。根据我们在模拟中用作输入的估计键,订单数组可以具有不同数量的值。
例如,假设订单数组如下
orders = [2, 6, 10, 24]
对应于每个阶值,将有两个z值(这是一个三角参数-SIN部分为一个值,COS部分为一个值)。例如,它可能看起来像这样
z = [0.08 0.11 0.25 0.01 0.66 0.19 0.45 0.07]
要实现这一点,我需要定义一个带有两个并行迭代的for循环:
z[0] to z[2*length(orders)-1] i.e. `z[0] to z[7]`
和orders[0] to orders[length(orders)-1] i.e. orders[0] to orders[3]
最后,该公式应计算以下内容:
doy_seasonality = np.exp(z[0]*np.sin(orders[0]*np.pi*doy/365.)+z[1]*np.cos(orders[0]*np.pi*doy/365.)
+z[2]*np.sin(orders[1]*np.pi*doy/365.)+ z[3]*np.cos(orders[1]*np.pi*doy/365.)
+z[4]*np.sin(orders[2]*np.pi*doy/365.)+ z[5]*np.cos(orders[2]*np.pi*doy/365.)
+z[6]*np.sin(orders[3]*np.pi*doy/365.)+ z[7]*np.cos(orders[3]*np.pi*doy/365.))
我无法为此设计适当的语法。
doy(一年中的一天)是一个等距分布的向量:1、2、3 ... 364、365
答案 0 :(得分:1)
orders = np.array([2, 6, 10, 24])
z = np.array([0.08, 0.11, 0.25, 0.01, 0.66, 0.19, 0.45, 0.07])
doy = np.arange(365) + 1
s = 0
for k in range(len(orders)):
s += z[2 * k ] * np.sin(orders[k] * np.pi * doy / 365.)
s += z[2 * k + 1] * np.cos(orders[k] * np.pi * doy / 365.)
s = np.exp(s)