非线性优化函数'nloptr中的传递参数`

非线性优化函数'nloptr中的传递参数`,r,mathematical-optimization,nonlinear-optimization,R,Mathematical Optimization,Nonlinear Optimization,我最初的问题可以在这里找到: 这引出了另一个问题:如何将参数传递到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(

我最初的问题可以在这里找到:

这引出了另一个问题:如何将参数传递到
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)

F所以这里发生了几件事:

首先,目标函数,
F
,等式约束函数,
Hc
,不等式约束函数,
Gc
,都必须采用相同的参数。因此,将
x,y,A
传递给所有三个,在不需要它们的地方忽略它们

其次,你必须在某处定义
y
A

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

最后,默认的
maxeval=100
,这远远不够。我必须将其设置为100000以获得收敛

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

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

F如果我们去掉目标函数中的幂2(即
sum((A[1]*x-A[2]*y))
,为什么我们得到不同运行的不同最佳参数解?