R:constrOptim约束中的优化

R:constrOptim约束中的优化,r,mathematical-optimization,R,Mathematical Optimization,我习惯于使用函数optim,但这次我的一个变量有一个条件。我有三个变量:a、b和d。我对a或b没有任何条件,但d必须介于0和1之间:0=,正如constrOptim()描述所述 The feasible region is defined by 'ui %*% theta - ci >= 0'. 因此,您需要建立一个线性方程组,其中系数矩阵“ui”和解向量“ci”,其中“theta”表示您感兴趣的变量。请注意,您可以将“ui%%theta-ci>=0”重写为“ui%%theta>=ci

我习惯于使用函数
optim
,但这次我的一个变量有一个条件。我有三个变量:a、b和d。我对a或b没有任何条件,但d必须介于0和1之间:
0=,正如constrOptim()描述所述

The feasible region is defined by 'ui %*% theta - ci >= 0'. 
因此,您需要建立一个线性方程组,其中系数矩阵“ui”和解向量“ci”,其中“theta”表示您感兴趣的变量。请注意,您可以将“ui%%theta-ci>=0”重写为“ui%%theta>=ci”,或乘以负数以翻转不等式

在您的情况下,您需要两个方程式:

带系数('ui')

和解向量('ci')

R中:

 ui <- rbind(c(0,0,1),c(0,0,-1))
 ci <- c(0,-1)

ui您有框约束,可以由
optim
本机处理;您不需要
constrOptim
。将无约束变量的约束设置为+/-无穷大,并使用
method=“L-BFGS-B”

一些评论:

    您可能需要考虑转换<代码> d>代码>以使其不受约束;例如,优化
    p=log(d/(1-d))
    。在其他条件相同的情况下,无约束优化总是比有约束优化容易
  • optim
    现在实际上已经很老了;试着尝试一下起重机上的其他一些包装
    ## from optim
 fr <- function(x) {   ## Rosenbrock Banana function
     x1 <- x[1]
     x2 <- x[2]
     100 * (x2 - x1 * x1)^2 + (1 - x1)^2
 }
 grr <- function(x) { ## Gradient of 'fr'
     x1 <- x[1]
     x2 <- x[2]
     c(-400 * x1 * (x2 - x1 * x1) - 2 * (1 - x1),
        200 *      (x2 - x1 * x1))
 }
 ui <- rbind(c(-1,0), c(1,0))
 ci <- c(-1,0) 
 constrOptim(c(.5,0), fr, grr, ui = ui, ci = ci)
optim(fn, lower=c(-Inf, -Inf, 0), upper=c(Inf, Inf, 1), method="L-BFGS-B", ...)