gpt4 book ai didi

r - 在非线性优化函数 `nloptr` 中传递参数

转载 作者:行者123 更新时间:2023-12-04 12:08:52 27 4
gpt4 key购买 nike

我最初的问题可以在这里找到:Optimization in R with arbitrary constraints

这就引出了另一个问题,如何将参数传递给 nloptr .
我需要最小化一个函数 F(x,y,A)哪里x和 y 是向量和 A是一个矩阵,同时约束 sum(x * y) >= sum(y/3)sum(x)=1 .
我曾尝试使用 nloptr :

F <- function(x,y,A){
...
}

Gc <- function(x,y){
return(sum(y/3) - sum(x*y))
}

Hc <- function(x){
retunr(1-sum(x))
}

nloptr(x0=rep(1/3,3), eval_f=F, lb = 0.05, ub = 1, eval_g_ineq = Gc, eval_g_eq = Hc, opts = list(), y=y, A=A)

我收到一个错误: 'A' passed to (...) in 'nloptr' but this is not required in the eval_g_ineq function.
如果我说 nloptr( ... , y, A)
我得到: eval_f requires argument 'cov.mat' but this has not been passed to the 'nloptr' function.
任何建议都会很棒。谢谢

最佳答案

所以这里发生了几件事:

一、目标函数,F ,等式约束函数,Hc ,以及不等式约束函数,Gc ,都必须采取相同的论点。所以通x, y, A对所有三个,并在不需要它们的地方忽略它们。

其次,您必须定义 yA某处...

第三,您必须指定要使用的算法。使用 opts=list(algoritm=...) 执行此操作.事实证明,如果您 (a) 使用约束,并且 (b) 不提供计算雅可比矩阵的函数,那么只有一些算法是合适的。在你的情况下 opts=list(algorithm="NLOPT_GN_ISRES")似乎工作。

最后,默认maxeval = 100事实证明这还不够。我必须将其设置为 100,000 才能收敛。

把这一切放在一起,尽管有一个虚构的目标函数:

F <- function(x,y,A){  # made-up function
# minimize scaled distance between points x and y
sum((A[1]*x-A[2]*y)^2)
}
Gc <- function(x,y,A) return(sum(y/3) - sum(x*y))
Hc <- function(x,y,A) return(1-sum(x))

library(nloptr)
y= c(0,1,0)
A= c(10,1)
opt <- nloptr(x0=rep(1/3,3), eval_f=F, lb = rep(0.05,3), ub = rep(1,3),
eval_g_ineq = Gc, eval_g_eq = Hc,
opts = list(algorithm="NLOPT_GN_ISRES",maxeval=100000), y=y, A=A)
opt$solution
# [1] 0.2990463 0.4004237 0.3005300

关于r - 在非线性优化函数 `nloptr` 中传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21632920/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com