R 带约束的优化

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

我试图解决以下优化问题, 我想最小化距离(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(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/案例2
x、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