我試圖用JuMP解決一個非線性問題,其中變量的數量由用戶決定 - 也就是說,在編譯時不知道。Julia + JuMP:函數參數的可變數量
要做到這一點,@NLobjective
行看起來是這樣的:
@eval @JuMP.NLobjective(m, Min, $(Expr(:call, :myf, [Expr(:ref, :x, i) for i=1:n]...)))
其中,舉例來說,如果n=3
,編譯器解釋爲等同於行:
@JuMP.NLobjective(m, Min, myf(x[1], x[2], x[3]))
的問題是, @eval
只能在全局範圍內工作,並且包含在函數中時會引發錯誤。
我的問題是:我怎麼能做到這一點相同的功能 - 讓@NLobjective
調用myf
與x[1],...,x[n]
參數個數可變 - 一個函數的局部,而不是知名的,在編譯範圍之內?
def testme(n)
myf(a...) = sum(collect(a).^2)
m = JuMP.Model(solver=Ipopt.IpoptSolver())
JuMP.register(m, :myf, n, myf, autodiff=true)
@JuMP.variable(m, x[1:n] >= 0.5)
@eval @JuMP.NLobjective(m, Min, $(Expr(:call, :myf, [Expr(:ref, :x, i) for i=1:n]...)))
JuMP.solve(m)
end
testme(3)
謝謝!
這不'JuMP'幫助,但如果你真的遇到問題,'NLopt'允許的參數不數在編譯時已知,並且API相對簡單。 –
謝謝!我會研究它。 –