Неточность в нахождении минимума функции в R

Имеется функция:

Holt <- function(data_table, coef)
{
  alpha <- coef[1]
  beta <- coef[2]
  ldt = length(data_table)
  ut = bt = numeric(ldt)
  for(i in (1:(ldt)))
  {
    if(i == 1)
    {
      ut[i] = data_table[i]
      bt[i] = data_table[i+1] - data_table[i]
    }
    else
    {
      ut[i] = alpha * data_table[i-1] + (1 - alpha) * (ut[i-1] + bt[i-1])
      bt[i] = beta * (ut[i] - ut[i-1]) + (1 - beta) * bt[i-1]
    }
  }
  aet = abs(data_table[2:ldt] - ut[2:ldt])
  mape = mean(aet[1:(ldt-1)] / data_table[2:ldt]) * 100
  return(mape)
}

Мне нужно найти оптимальные значения alpha и beta в диапазоне от 0.0001 до 0.9999, чтобы значение mape было минимальным

Я использовал метод покоординатного спуска и метод золотого сечения для линейной оптимизации:

LOptimisation <- function(data_table, f, fix = NULL, commit_index)
{
  goldR = (1 + sqrt(5)) / 2
  a = .0001
  b = .9999
  eps = .0001
  while(abs(b - a) > eps)
  {
    x1 = b - (b - a) / goldR
    x2 = a + (b - a) / goldR
    r1 <- fix
    r2 <- fix
    r1[commit_index] <- x1
    r2[commit_index] <- x2
    if(f(data_table, r1) >= f(data_table, r2)) a <- x1 else b <- x2
  }
  return(round((a + b) / 2, 4))
}

MOptimisation <- function(data_table, f, c)
{
  eps = .0001
  coef <- tcoef <- numeric(c)
  coef[1:c] <- .5
  while(abs(f(data_table, tcoef) - f(data_table, coef)) >= eps)
  { 
    tcoef <- coef
    for(i in 1:c) coef[i] <- LOptimisation(data_table, f, coef, i)
  }
  return(coef)
}

c в данном случае это количество переменных для оптимизации (2), а data_table это вектор входных данных:

c(100, 40, 30, 10, 100, 40, 30, 10, 100, 40, 30, 10, 100, 40, 30, 10)

У меня проблема заключается в том, что оптимальные alpha и beta на выходе получаются 0.6425 и 0.0231 и mape = 38.15588, хотя должно быть alpha = 0.6438, beta = 0.0225, mape = 38.08153


Ответы (0 шт):