R 带约束的优化
我试图解决以下优化问题, 我想最小化距离(log(1+exp(x))-ax^2-bx-c)^2,关于x附近区域的一些参数a,b,c,但也要满足不等式log(1+exp(x))1/情况1(R 带约束的优化,r,R,我试图解决以下优化问题, 我想最小化距离(log(1+exp(x))-ax^2-bx-c)^2,关于x附近区域的一些参数a,b,c,但也要满足不等式log(1+exp(x))1/情况1(a,b,c是常数): library(nloptr) fn <- function(x,a=1,b=1,c=1) { (log(1+exp(x))-a*x^2-b*x-c)^2 } fn(1) eval_g0 <-function( x, a=1,b=1,c=1 ) { return( log
a,b,c
是常数):
library(nloptr)
fn <- function(x,a=1,b=1,c=1) {
(log(1+exp(x))-a*x^2-b*x-c)^2
}
fn(1)
eval_g0 <-function( x, a=1,b=1,c=1 ) { return( log(1+exp(x))-a*x^2-b*x-c) }
eval_g0(0)
a=1
b=1
c=1
res1 <-nloptr(x0=c(10),eval_f=fn,lb =c(-Inf),ub =c(Inf),eval_g_ineq =eval_g0,opts =list("algorithm"="NLOPT_LN_COBYLA","xtol_rel"=1.0e-8),a =a,b =b ,c=c)
res1
要了解事物是如何工作的,您可以看看:
2/案例2x、a、b、c都是变量:
library(nloptr)
fn <- function(x,a=1,b=1,c=1) {
(log(1+exp(x))-a*x^2-b*x-c)^2
}
fn(1)
eval_g0 <-function( x, a=1,b=1,c=1 ) { return( log(1+exp(x))-a*x^2-b*x-c) }
eval_g0(0)
a=1
b=1
c=1
res1 <-nloptr(x0=c(10),eval_f=fn,lb =c(-Inf),ub =c(Inf),eval_g_ineq =eval_g0,opts =list("algorithm"="NLOPT_LN_COBYLA","xtol_rel"=1.0e-8),a =a,b =b ,c=c)
res1
如果a
,b
,c
也是变量,只需使用向量x
作为输入:
library(nloptr)
fn <- function(x) {
a=x[2]
b=x[3]
c=x[4]
return((log(1+exp(x[1]))-a*(x[1])^2-b*(x[1])-c)^2)
}
eval_g0 <-function(x) {
a=x[2]
b=x[3]
c=x[4]
return((log(1+exp(x[1]))-a*(x[1])^2-b*(x[1])-c)^2) }
res1 <-nloptr(x0=rep(18,4),eval_f=fn,lb =rep(-Inf,4),ub =rep(Inf,4),eval_g_ineq =eval_g0,opts =list("algorithm"="NLOPT_LN_COBYLA","xtol_rel"=1.0e-8))
res1
pb的解决方案是:x=-1.977346,a=6.058104,b=19.29975,c=14.60534
让我们验证约束g
:
print(c("the constraint value for x is : "))
eval_g0(c(x=-1.977346, a=6.058104 , b=19.29975 , c=14.60534))
[1] "the constraint value for x is : "
x
1.232363e-09
通常情况下,我们应该期望约束值为负数,而不是接近0
的非常小的数字。但是,如第12页所述:
“点x被认为是可行的用于判断是否停止优化如果评估ineq(x),这可能会有所帮助:请注意,您应该指定所需的
A、b、c
。此函数不需要计算雅可比矩阵,因为它需要一些努力!谢谢你的回复!如果我理解正确,我应该指定a、b、c的值?我想找到最佳的。@meme,你只需要使用一个长度为4的向量x
(即变量的数量)。请点击勾号接受答案!我更新了帖子来处理a,b,c
也是变量而不是常量的情况!非常感谢,但是我需要的解决方案不是满足特定x的约束,而是满足所有x的约束。也许这不可行
print(c("the constraint value for x is : "))
eval_g0(c(x=-1.977346, a=6.058104 , b=19.29975 , c=14.60534))
[1] "the constraint value for x is : "
x
1.232363e-09
library(nloptr)
fn <- function(x) {
return(x^2)
}
eval_g0 <-function(x) {
return(1-x)
}
res1 <-nloptr(x0=rep(14),eval_f=fn,eval_g_ineq =eval_g0,opts =list("algorithm"="NLOPT_LN_COBYLA","xtol_rel"=1.0e-8))
res1
print(c("the constraint value for x is : "))
eval_g0(0.999999902845997)
Call:
nloptr(x0 = rep(14), eval_f = fn, eval_g_ineq = eval_g0, opts = list(algorithm = "NLOPT_LN_COBYLA",
xtol_rel = 1e-08))
Minimization using NLopt version 2.4.2
NLopt solver status: 4 ( NLOPT_XTOL_REACHED: Optimization stopped because
xtol_rel or xtol_abs (above) was reached. )
Number of Iterations....: 18
Termination conditions: xtol_rel: 1e-08
Number of inequality constraints: 1
Number of equality constraints: 0
Optimal value of objective function: 0.999999902845997
Optimal value of controls: 1
[1] "the constraint value for x is : "
[1] 9.7154e-08