我习惯使用函数optim
,但这次我对其中一个变量有条件。我有三个变量: a , b 和 d 。我对 a 或 b 没有任何条件,但 d 必须介于0和1之间:0=<d=<1
。
我该怎么做?
答案 0 :(得分:0)
constrOptim()描述写道
The feasible region is defined by 'ui %*% theta - ci >= 0'.
因此,您需要建立一个带有系数矩阵'ui'的线性方程组和一个解向量'ci',其中'''表示您感兴趣的变量。请注意,您可以将'ui%%theta - ci&gt; = 0'重写为'ui%%theta&gt; = ci'或乘以负数来翻转不等式。
在您的情况下,您可能希望有两个方程式:
或
有系数('ui')
和解决方案向量('ci')
在 R :
ui <- rbind(c(0,0,1),c(0,0,-1))
ci <- c(0,-1)
使用constrOptim帮助文件中的示例:
## 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))
}
修改为x1&lt; = 1,x1&gt; 0
ui <- rbind(c(-1,0), c(1,0))
ci <- c(-1,0)
constrOptim(c(.5,0), fr, grr, ui = ui, ci = ci)
答案 1 :(得分:0)
您有框限制,可由optim
本机处理;你不需要constrOptim
。对于无约束变量,将约束设置为+/- Infinity,并使用method="L-BFGS-B"
。
optim(fn, lower=c(-Inf, -Inf, 0), upper=c(Inf, Inf, 1), method="L-BFGS-B", ...)
一些意见:
d
以使其变得不受约束;例如优化p = log(d/(1-d))
。无约束优化总是比约束更容易,所有其他条件都相同。optim
这些天真的很老了;尝试使用CRAN上的Optimization Task View中的其他一些软件包。