簡體   English   中英

使用約束最小化 R 中的多元函數

[英]minimize a multivariate function in R with constraints

我正在嘗試最小化 R 中的函數S.residuum ,但有一些限制

S.residuum<- function(w, stdv, corr) {
  intermed<-0
  for (i in 1:length(stdvv)) {
  intermed =intermed+residuum(w,stdvv,corr.mat,i)
  }
  return(intermed)
}  

其中w是長度為 6 的向量。 約束如下所示:

0.03 <= w1 <= 0.27
0.03 <= w2 <= 0.27
0.20 <= w3 <= 0.91 
0.01 <= w4 <= 0.1
0.01 <= w5 <= 0.1
0.01 <= w6 <= 0.1

到目前為止,我能夠實現它:

nlminb(c(1,1,1,1,1,1),S.residuum,hessian = NULL,
       lower=c(0.03,0.03,0.2,0.01,0.01), upper=c(0.27,0.27,0.91,0.1,0.1)),

其中c(1,1,1,1,1,1)是初始值。

但是,我還有 2 個其他限制。 我把第一個寫成函數:

nequal <- function(w,stdv, corr) {
  intermed<-0
  for (j in 1:length(stdvv)) {
    for (i in 1:length(stdvv)) {
      intermed =intermed+ w[[i]] * w[[j]] * stdv[[i]] * stdv[[j]] * corr[[i]][[j]]
    }
  }
  intermed=sqrt(intermed)
},

其中stdv是向量, corr是矩陣。 應滿足以下約束條件:

 1) nequal <=0.75
 2) w1+w2+w3+w4+w5+w6=1

有人可以對我說我怎么能在 R 中做到這一點? 謝謝!

您可以使用Rsolnp包中的函數solnp 代碼如下所示:

library(Rsolnp)

# Inequality constraint
nequal <- function(w) {
 intermed <- 0
 for (j in 1:length(stdvv)) {
  for (i in 1:length(stdvv)) {
  intermed = intermed + w[[i]] * w[[j]] * stdvv[[i]] * stdvv[[j]] * corr.mat[[i]][[j]]
  }
 }
  sqrt(intermed)
}

# Equality constraint
equal <- function(w) {
  w[[1]]+w[[2]]+w[[3]]+w[[4]]+w[[5]]+w[[6]]
}

# Minimization with constraints
min <- solnp(c(0., 0., 0., 0., 0., 0.),
          S.residuum, 
          eqfun = equal,
          eqB = 1,
          ineqfun = nequal,
          ineqLB = 0,
          ineqUB = 0.075,
          LB = c(0.03, 0.03, 0.2, 0.01, 0.01, 0.01),
          UB = c(0.27, 0.27, 0.91, 0.1, 0.1, 0.1))

在這里找到了constrOptim() ,它對我來說效果很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM