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
ура