GRG нелинейные наименьшие квадраты (оптимизация)

Я пытаюсь преобразовать электронную таблицу Excel, которая включает в себя функцию решателя, используя GRG Non-Linear для оптимизации 2 переменных, которые возвращают наименьшую сумму квадратов ошибок. У меня есть 4 известных времени (B) на 4 известных расстояниях (A). Мне нужно создать функцию оптимизации, чтобы найти, какое взаимодействие значений для Vmax и Tau дает наименьшую сумму квадратов ошибок. Я посмотрел на функцию nls и пакет nloptr, но не могу собрать их воедино. Текущие значения Vmax и Tau - это то, что было определено с помощью функции Excel Solver, просто нужно повторить их в R. Любая помощь будет принята с благодарностью. Спасибо.

A <- c(0,10, 20, 40)
B <- c(0,1.51, 2.51, 4.32)

Measured <- as.data.frame(cbind(A, B))

Corrected <- Measured
Corrected$B <- Corrected$B + .2
colnames(Corrected) <- c("Distance (yds)", "Time (s)")
Corrected$`X (m)` <- Corrected$`Distance (yds)`*.9144

Vmax = 10.460615006988 
Tau = 1.03682513806393 

Predicted_X <- c(Vmax * (Corrected$`Time (s)`[1] - Tau + Tau*exp(-Corrected$`Time (s)`[1]/Tau)),
Vmax * (Corrected$`Time (s)`[2] - Tau + Tau*exp(-Corrected$`Time (s)`[2]/Tau)),
Vmax * (Corrected$`Time (s)`[3] - Tau + Tau*exp(-Corrected$`Time (s)`[3]/Tau)),
Vmax * (Corrected$`Time (s)`[4] - Tau + Tau*exp(-Corrected$`Time (s)`[4]/Tau)))

Corrected$`Predicted X (m)` <- Predicted_X
Corrected$`Squared Error` <- (Corrected$`X (m)`-Corrected$`Predicted X (m)`)^2

#Sum_Squared_Error <- sum(Corrected$`Squared Error`)

1 ответ

Решение

Ваша проблема еще не решена? Я работаю над аналогичной проблемой и думаю, что смогу помочь.

Сначала вы должны определить функцию, которая будет суммой ошибок, которая имеет значение для переменных Vmax и Tau. Затем вы можете вызвать алгоритм оптимизации, который изменит эти переменные и найдет минимум вашей функции. optim() может быть достаточно для вашего приложения, но вот документация для nloptr:

https://www.rdocumentation.org/packages/nloptr/versions/1.0.4/topics/nloptr

и вот список пакетов оптимизации в R:

https://cran.r-project.org/web/views/Optimization.html

Редактировать:

Я быстро перекодировал, как я это сделал. Я новичок, так что, возможно, это не самый лучший способ, но он все еще работает.

A <- c(0,10, 20, 40)
B <- c(0,1.51, 2.51, 4.32)

Measured <- as.data.frame(cbind(A, B))

Corrected <- Measured
Corrected$B <- Corrected$B + .2
colnames(Corrected) <- c("Distance (yds)", "Time (s)")
Corrected$`X (m)` <- Corrected$`Distance (yds)`*.9144

#initialize values
Vmax0 = 15
Tau0 = 5

x0 = c(Vmax0,Tau0)

#define function to optimise: optim will minimize the output
f <- function(x) {

y=0
#variables will be optimise to find the minimum value of f
Vmax = x[1]
Tau = x[2]

Predicted_X <- Vmax * (Corrected$`Time (s)` - Tau + Tau*exp(-Corrected$`Time (s)`/Tau))

y = sum((Predicted_X - Corrected$`X (m)`)^2)

return(y)

}

#call optim: results will be available in variable Y
Y<-optim(x0,f)

Если вы введете Y в консоль, вы обнаружите, что решатель находит те же значения, что и в Excel, и достигается конвергенция.

В R нет необходимости определять столбцы во фреймах данных с помощью скобок, как вы это делали, вместо этого используйте векторы. Вы должны, вероятно, следовать учебнику об этом в первую очередь.

Также вводит в заблуждение, что вы устанавливаете начальные значения как значения, которые уже были оптимальными. Если вы сделаете это, optim () не будет оптимизировать дальше.

Вот документация для Оптима:

https://stat.ethz.ch/R-manual/R-devel/library/stats/html/optim.html

и учебник о том, как использовать функции:

https://www.datacamp.com/community/tutorials/functions-in-r-a-tutorial

ура

Другие вопросы по тегам