用JuMP进行非线性优化的一个例子

时间:2017-10-08 14:54:38

标签: julia nonlinear-optimization

作为使用Julia的JuMP建模语言理解非线性优化的测试,我试图通过约束0 <= x[i] <= 0.5来最小化10维中的Rosenbrock函数。第一个带有可变参数的Rosenbrock:

function rosen(x...)
    local n = length(x); local s = 0.0
    for i = 1:length(x)-1
        s += 100*(x[i+1] - x[i]^2)^2 + (x[i] - 1)^2
    end
    return s
end
## rosen (generic function with 1 method)

使用Ipopt作为求解器定义优化模型,

using JuMP; using Ipopt
m = Model(solver = IpoptSolver())
## Feasibility problem with:
## * 0 linear constraints
## * 0 variables
## Solver is Ipopt

以及具有约束约束和起始值x[i] = 0.1的变量:

@variable(m, 0.0 <= x[1:10] <= 0.5)
for i in 1:10 setvalue(x[i], 0.1); end

现在我明白我必须注册目标函数。

JuMP.register(m, :rosen, 10, rosen, autodiff=true)

我不确定这里是否可以这样做,或者我是否需要定义和注册mysquare函数,就像在JuMP手册的“用户定义函数”部分中所做的那样。

@NLobjective(m, Min, rosen(x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]))

我怎样才能更紧凑地写这个?像

这样的表达式
@NLobjective(m, Min, rosen(x[1:10]))
##ERROR: Incorrect number of arguments for "rosen" in nonlinear expression.

给出错误。如果我想用100个变量解决这个问题该怎么办?

现在我们解决了这个模型问题,唉,它回归了一个解决方案,确实是我用NEOS IPOPT求解器解决它的正确解决方案。

sol = solve(m);
## ...
## EXIT: Optimal Solution Found.

由于我只对x [10]的确切值感兴趣,因此将其提取出来:

getvalue(x[10]
## 0.00010008222367154784

这可以以某种方式简化吗?想想用MATLAB中的fminsearch或R中的optim来解决这个问题是多么容易。

R> optim(rep(0.1,10), fnRosenbrock, method="L-BFGS-B",
         lower=rep(0.0,10), upper=rep(0.5,10),
         control=list(factr=1e-12, maxit=5000))
## $par
## [1] 0.50000000 0.26306537 0.08003061 0.01657414 0.01038065
## [6] 0.01021197 0.01020838 0.01020414 0.01000208 0.00000000

当然,除了它说$par[10]是0.0,这是不正确的。

0 个答案:

没有答案