【JuMP.jl】非线性规划
[JuMP] 03 非线性规划
非线性规划模型
非线性规划问题是线性规划问题的自然推广, 在实际的工程问题中,优化问题中的目标函数与约束不会总是线性函数,因此非线性规划的求解功能是必要的。
min x ∈ R n f 0 ( x ) s.t. l j ≤ f j ( x ) ≤ u j j = 1 … m l i ≤ x i ≤ u i i = 1 … n . \begin{aligned} \min_{x \in \mathbb{R}^n} & f_0(x) \\ \;\;\text{s.t.} & l_j \le f_j(x) \le u_j & j = 1 \ldots m \\ & l_i \le x_i \le u_i & i = 1 \ldots n. \end{aligned} x∈Rnmins.t.f0(x)lj≤fj(x)≤ujli≤xi≤uij=1…mi=1…n.
例:
max 1 + x 2 + y 2 s . t . x ≥ 0 y ≥ 0 x 2 + y 2 ≤ 2 \begin{aligned} \max~& \sqrt{1+x^2+y^2}\\ \mathrm{s.t.}~& x\geq 0\\ & y\geq 0\\ & x^2+y^2\leq 2 \end{aligned} max s.t. 1+x2+y2x≥0y≥0x2+y2≤2
using JuMP
import Ipopt
import Test
非线性向量值函数的定义
function_calls = 0
function foo(x, y)global function_calls += 1common_term = x^2 + y^2term_1 = sqrt(1 + common_term)term_2 = common_termreturn term_1, term_2
end
foo_1(x, y) = foo(x, y)[1]
foo_2(x, y) = foo(x, y)[2]
打印模型
model = Model(Ipopt.Optimizer)
set_silent(model)
@variable(model, x[1:2] >= 0, start = 0.1)
register(model, :foo_1, 2, foo_1; autodiff = true)
register(model, :foo_2, 2, foo_2; autodiff = true)
@NLobjective(model, Max, foo_1(x[1], x[2]))
@NLconstraint(model, foo_2(x[1], x[2]) <= 2)
function_calls = 0
print(model)
max f o o 1 ( x 1 , x 2 ) S u b j e c t t o x 1 ≥ 0.0 x 2 ≥ 0.0 f o o 2 ( x 1 , x 2 ) − 2.0 ≤ 0 \begin{aligned} \max~& foo_1(x_1,x_2)\\ \mathrm{Subject~ to}~& x_1\geq 0.0\\ & x_2\geq 0.0\\ & foo_2(x_1,x_2)-2.0\leq 0 \end{aligned} max Subject to foo1(x1,x2)x1≥0.0x2≥0.0foo2(x1,x2)−2.0≤0
optimize!(model)
@show value.(x)
value.(x) = [1.0000000024913394, 1.0000000024913394]