, 당신은 Float64
값의 배열로 f
을 정의했습니다. JuMP documentation for Nonlinear Expressions에 명시된 바와 같이 모든 비선형 표현식은 @NLexpression
매크로 내부에 정의되어야하며 매크로에서는 AffExpr
및 QuadExpr
개체를 현재 사용할 수 없습니다.
solve
작업을 통해 해결책을 찾는 명령의 결과 다음과 같은 설정 :
julia> using JuMP
julia> using Ipopt
julia> m = Model(solver=IpoptSolver(print_level=0))
Feasibility problem with:
* 0 linear constraints
* 0 variables
Solver is Ipopt
julia> @variable(m, x[i=1:2])
2-element Array{JuMP.Variable,1}:
x[1]
x[2]
julia> function bounds_BK1()
return ([-5.0;-5.0],[10.0;10.0])
end
bounds_BK1 (generic function with 1 method)
julia> @NLexpression(m, F1, x[1]^2 + x[2]^2)
JuMP.NonlinearExpression(Feasibility problem with:
* 0 linear constraints
* 2 variables
Solver is Ipopt,1)
julia> @NLexpression(m, F2, (x[1]-5.0)^2 + (x[2]-5.0)^2)
JuMP.NonlinearExpression(Feasibility problem with:
* 0 linear constraints
* 2 variables
Solver is Ipopt,2)
julia> @constraint(m, x .>= bounds_BK1()[1])
2-element Array{JuMP.ConstraintRef{JuMP.Model,JuMP.GenericRangeConstraint{JuMP.GenericAffExpr{Float64,JuMP.Variable}}},1}:
x[1] ≥ -5
x[2] ≥ -5
julia> @constraint(m, x .<= bounds_BK1()[2])
2-element Array{JuMP.ConstraintRef{JuMP.Model,JuMP.GenericRangeConstraint{JuMP.GenericAffExpr{Float64,JuMP.Variable}}},1}:
x[1] ≤ 10
x[2] ≤ 10
julia> s = solve(m)
******************************************************************************
This program contains Ipopt, a library for large-scale nonlinear optimization.
Ipopt is released as open source code under the Eclipse Public License (EPL).
For more information visit http://projects.coin-or.org/Ipopt
******************************************************************************
:Optimal
julia> getvalue(x)
2-element Array{Float64,1}:
0.261454
0.261454
나는 당신이 그 것 나중에 functs_BK1
내에서 표현의 배열을 구축하는 것이 현재 가능하다고 생각하지 않는다 @NLexpression
으로 전달하십시오. 현재 JuMP 변수의 스칼라 표현식을 @NLexpression
의 인수로 직접 전달해야합니다.