GRG非线性最小二乘(优化)

时间:2017-12-22 13:45:41

标签: r

我正在尝试转换涉及求解器函数的Excel电子表格,使用GRG Non-Linear来优化返回最小平方误差总和的2个变量。我有4个已知时间(B),已知距离为4(A)。我需要创建一个优化函数来找出Vmax和Tau的值的相互作用产生最小的平方误差和。我查看了nls函数和nloptr包,但似乎无法将它们拼凑在一起。 Vmax和Tau的当前值是通过excel求解器函数确定的,只需要在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 个答案:

答案 0 :(得分:2)

您的问题仍未解决? 我正在处理类似的问题,我想我可以提供帮助。

首先,您必须定义一个函数,该函数将是变量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()将不会进一步优化。

以下是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

干杯