所以这里发生了几件事:
首先,目标函数,F
,等式约束函数,Hc
,以及不等式约束函数,Gc
,所有人都必须采取相同的论点。所以通过x, y, A
对于所有三个,并在不需要的地方忽略它们。
其次,你必须定义y
and A
某处...
第三,您必须指定要使用哪种算法。这样做与opts=list(algoritm=...)
。事实证明,如果您 (a) 使用约束,并且 (b)not提供计算雅可比矩阵的函数,那么只有某些算法是合适的。在你的情况下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