在给定约束条件下求解 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
我想在给定的约束条件下最大化以下函数。
-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