【问题标题】:R/Python - For Loop Statement for a Trigonometric FormulaR/Python - 三角公式的 For 循环语句
【发布时间】:2018-12-06 10:07:43
【问题描述】:

我正在开发一个估计模块,我们正在计算季节性变化和预测。以前,我们使用固定的 5 阶正弦函数进行估计。公式如下

doy_seasonality = exp(z[1]*sin(2*pi*doy/365)+z[2]*cos(2*pi*doy/365)
                       +z[3]*sin(4*pi*doy/365)+ z[4]*cos(4*pi*doy/365)
                       +z[5]*sin(6*pi*doy/365)+ z[6]*cos(6*pi*doy/365)
                       +z[7]*sin(8*pi*doy/365)+ z[8]*cos(8*pi*doy/365)
                       + z[9]*sin(10*pi*doy/365)+ z[10]*cos(10*pi*doy/365))

现在,我们已经尝试对我们的模型进行一些修改。使用快速傅里叶变换,我们可以自动生成三角函数的阶数。

例如,在我当前的数据集上,我有以下订单数组。

order_FFT = [2, 6, 10, 24], 这样

order_FFT[0] = 2
order_FFT[1] = 6
order_FFT[2] = 10
order_FFT[3] = 24

这里将有 4 个订单。对于其他一些数据集,可能或多或少没有。的订单。因此,我需要定义一个 for 循环,以便修改公式。

使用我当前的数据集和对应的 orders_FFT 数组,for 循环应该执行以下公式:

doy_seasonality = exp(z[1]*sin(2*pi*doy/365)+z[2]*cos(2*pi*doy/365)
                       +z[3]*sin(6*pi*doy/365)+ z[4]*cos(6*pi*doy/365)
                       +z[5]*sin(10*pi*doy/365)+ z[6]*cos(10*pi*doy/365)
                       +z[7]*sin(24*pi*doy/365)+ z[8]*cos(24*pi*doy/365)

这基本上意味着

doy_seasonality = exp(z[1]*sin(order_FFT[0]*pi*doy/365)+z[2]*cos(order_FFT[0]*pi*doy/365)
                       +z[3]*sin(order_FFT[1]*pi*doy/365)+ z[4]*cos(order_FFT[1]*pi*doy/365)
                       +z[5]*sin(order_FFT[2]*pi*doy/365)+ z[6]*cos(order_FFT[2]*pi*doy/365)
                       +z[7]*sin(order_FFT[3]*pi*doy/365)+ z[8]*cos(order_FFT[3]*pi*doy/365)

我在试图为此找出一个 for 循环代码时不知所措。很抱歉,我无法在这里展示我自己的努力。

【问题讨论】:

  • 什么是z?请提供一个可重现的最小示例。
  • z 是一个值列表。对于每个 order_FFT 值,将有 2 个对应的 z 值(一个用于正弦部分,一个用于余弦部分)。
  • 什么是doy?请提供一个可重现的最小示例。
  • doy 代表一年中的一天。 doy 值已经从另一个函数传递给公式。
  • 我知道缩写。我不知道这是单个值还是向量。请注意,如果您只是提供了一个可重现的最小示例,我可能已经回答了这个问题。

标签: r python-3.x numpy for-loop


【解决方案1】:

我不会使用循环。这是一种 R 方法:

#Some test data
set.seed(42)
z <- rnorm(8)
doy <- 1:365
order_FFT <- c(2, 6, 10, 24)

#separate coefficients for sin and cos in two rows:
z <- matrix(z, nrow = 2)
#calculate the sins and cosins:
sins <- outer(doy, order_FFT, function(x, y) sin(x * pi * y / 365))
cosins <- outer(doy, order_FFT, function(x, y) cos(x * pi * y / 365))
#use matrix products to multiply and sum
doy_seasonality2 <- c(exp(sins %*% z[1,] + cosins %*% z[2,]))

会产生同样的结果吗?

doy_seasonality = exp(z[1]*sin(2*pi*doy/365)+z[2]*cos(2*pi*doy/365)
                      +z[3]*sin(6*pi*doy/365)+ z[4]*cos(6*pi*doy/365)
                      +z[5]*sin(10*pi*doy/365)+ z[6]*cos(10*pi*doy/365)
                      +z[7]*sin(24*pi*doy/365)+ z[8]*cos(24*pi*doy/365))
all.equal(doy_seasonality, doy_seasonality2)
#[1] TRUE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-11
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    相关资源
    最近更新 更多