我想要在R中求解一个具有两个非线性约束的非线性目标函数.我已经在GAMS中成功地解决了该模型,但由于我的一般数据工作流,我想使用R来代替.该模型背后的 idea 是,我希望校准一个有理函数(四个参数),使其与给定的数据集(产生两个约束)保持一致,同时最小化函数的斜率和目标值(目标函数)之间的差异.因此,优化问题的结果是决定有理函数形状的四个参数.我正在用R Optimization Infrastructure (ROI)解这个模型.由于我想要为几种不同的情况求解模型,所以我创建了一系列接受变量的函数,以便可以轻松地更新目标函数和约束.
我的模特:
library(ROI)
# I installed several non-linear solvers that were suggested after running ROI_applicable_solvers() on the model
#install.packages("ROI.plugin.alabama")
#install.packages("ROI.plugin.nlminb")
#install.packages("ROI.plugin.nloptr")
# Empirical data for the example
elas_sl_t <- -0.006648
elas_by_t <- 0.2831
gdp_cap_rel_t <- 51.69
cal_cap_t <- 27.75
# Rational function for which parameters x[] need to be solved
elas_f <- function(x, gdp_cap) {
(x[1]*gdp_cap + x[2])/((gdp_cap+x[3])*(gdp_cap+x[4]))
}
# Integral of elas_f
int_elas_f <- function(x, gdp_cap) {
-(x[1] * x[4] - x[2]) * log(gdp_cap + x[4])/(x[4]^2 - x[3] * x[4]) -
(x[2] - x[1] * x[3]) * log(gdp_cap + x[3])/(x[3] * x[4] - x[3]^2) + x[2] * log(gdp_cap)/(x[3] * x[4])
}
# Derivative of elas_f
der_elas_f <- function(x, gdp_cap){
- (x[1] * gdp_cap + x[2]) / ((gdp_cap + x[3])^2 * (gdp_cap + x[4])) -
(x[1] * gdp_cap + x[2]) / ((gdp_cap + x[3]) * (gdp_cap + x[4])^2) + x[1] / ((gdp_cap + x[3]) * (gdp_cap + x[4]))
}
# Objective function (should be minimized)
obj_f <- function(x, gdp_cap = 1, elas_sl_by = elas_sl_t){
(der_elas_f(x, gdp_cap) - elas_sl_by)^2
}
# 1st constraint (should be equal to zero)
con1_f <- function(x, gdp_cap = 1, elas_by = elas_by_t){
elas_f(x, gdp_cap) - elas_by
}
# 2nd constraint (should be equal to zero)
con2_f <- function(x, gdp_cap_ty = gdp_cap_rel_t, gdp_cap_by = 1, cal_ty = cal_cap_t) {
int_elas_f(x, gdp_cap = gdp_cap_ty) - int_elas_f(x, gdp_cap = gdp_cap_by) - log(cal_ty)
}
# The solution of the model is
param_t <- c(1245.685, 30.987, 883.645, 4.097)
# check the solution
con1_f(param_t) # close to zero, ok
con2_f(param_t) # close to zero, ok
obj_f(param_t) # 0.05155
# Solving the model with ROI, using the actual solution as starting values does not work.
nlp <- OP(F_objective(F = obj_f, n = 4),
F_constraint(F = list(con1_f, con2_f), dir = rep("==", 2), rhs = c(0,0)),
maximum = FALSE)
nlp
sol <- ROI_solve(nlp, start = param_t, solver = "auto")
sol
solution(sol)
这个模型似乎无法解决,或者我做错了什么.是否有可能使用R(使用ROI或其他包)来解决上述问题?也许可用的解算器还不够好?我使用了GAMS CONOPT解算器来解决我的问题,这对于ROI/R是不可用的.我还使用了GAMS IPOPT解算器来解决问题,该解算器可用于R(https://github.com/coin-or/Ipopt),但不幸的是不是作为ROI的插件(仅限IPOP,它是二次求解器).我还在ROI中try 了NEOS解算器,但这导致了一条错误消息,因为无法联系服务器.任何帮助都是非常感激的.