在给定约束条件下求解 R 中的方程

Solving an equation in R with given constraints

我想在给定的约束条件下最大化以下函数。

-p1log(p1) - p3log(p3) - p5log(p5)

根据 p1 + p3 + p5 = 1 和 p1 + 3p3 + 5p5 = 3.5

p1 , p3 和 p5 都在 0 和 1 之间 [它们是概率。

我的问题是如何在 R 中解决这个问题?据我所知,constrOptim() 是解决此类问题的常用函数之一。但是我想不通。

感谢任何帮助。

程序包 Rsolnp 使用拉格朗日乘数来解决具有等式约束的非线性问题。这是它的设置方式。 eps 意味着不让对数产生 NaN 值。

library(Rsolnp)

f <-function(X) {
  x <- X[1]
  y <- X[2]
  z <- X[3]
  res <- -x*log(x) - y*log(y) - z*log(z)
  -res
}
eq_f <- function(X){
  x <- X[1]
  y <- X[2]
  z <- X[3]
  c(
    x + y + z,
    x + 3*y + 5*z
  )
}

eps <- .Machine$double.eps*10^2
X0 <- c(0.1, 0.1, 0.1)

sol <- solnp(
  pars = X0,
  fun = f,
  eqfun = eq_f,
  eqB = c(1, 3.5),
  LB = rep(eps, 3),
  UB = rep(1, 3)
)
#
#Iter: 1 fn: -1.0512     Pars:  0.21624 0.31752 0.46624
#Iter: 2 fn: -1.0512     Pars:  0.21624 0.31752 0.46624
#solnp--> Completed in 2 iterations

sol$convergence
#[1] 0
sol$pars
#[1] 0.2162396 0.3175208 0.4662396
sol$values
#[1]  0.000000 -1.051173 -1.051173

sol$values的最后一个值是最优参数下的函数值。
我们可以检查是否满足约束条件。

sum(sol$pars)
#[1] 1
sum(sol$pars*c(1, 3, 5))
#[1] 3.5