Dav*_*nro 3 optimization julia nlopt
任何人都知道NLopt是否适用于单变量优化.试图运行以下代码:
using NLopt
function myfunc(x, grad)
x.^2
end
opt = Opt(:LD_MMA, 1)
min_objective!(opt, myfunc)
(minf,minx,ret) = optimize(opt, [1.234])
println("got $minf at $minx (returned $ret)")
Run Code Online (Sandbox Code Playgroud)
但是得到以下错误消息:
> Error evaluating untitled
LoadError: BoundsError: attempt to access 1-element Array{Float64,1}:
1.234
at index [2]
in myfunc at untitled:8
in nlopt_callback_wrapper at /Users/davidzentlermunro/.julia/v0.4/NLopt/src/NLopt.jl:415
in optimize! at /Users/davidzentlermunro/.julia/v0.4/NLopt/src/NLopt.jl:514
in optimize at /Users/davidzentlermunro/.julia/v0.4/NLopt/src/NLopt.jl:520
in include_string at loading.jl:282
in include_string at /Users/davidzentlermunro/.julia/v0.4/CodeTools/src/eval.jl:32
in anonymous at /Users/davidzentlermunro/.julia/v0.4/Atom/src/eval.jl:84
in withpath at /Users/davidzentlermunro/.julia/v0.4/Requires/src/require.jl:37
in withpath at /Users/davidzentlermunro/.julia/v0.4/Atom/src/eval.jl:53
[inlined code] from /Users/davidzentlermunro/.julia/v0.4/Atom/src/eval.jl:83
in anonymous at task.jl:58
while loading untitled, in expression starting on line 13
Run Code Online (Sandbox Code Playgroud)
如果这是不可能的,有没有人知道我是否可以指定边界和初始条件的单变量优化器?
你在这里缺少一些东西.
LD_MMA看起来就像这样.请参阅此处以获取各种算法的列表,这些算法需要渐变.xtol_rel!(opt,1e-4)以下示例中的内容.另请参阅ftol_rel!另一种指定不同容差条件的方法.例如,根据文档,xtol_rel"当优化步骤(或最佳估计值)将每个参数改变小于tol乘以参数的绝对值时,将停止." 并且ftol_rel将"停止时优化步骤(或最佳的估计)由小于TOL乘以函数值的绝对值改变目标函数值."见此处的"停止标准"部分下用于在各种详细信息选项在这里.x.^2在您的输出中表示向量操作和向量输出).如果你的"目标函数"最终没有输出一维数,那么你的优化目标是什么就不清楚了(例如,最小化一个向量是什么意思?目前尚不清楚,你可以最小化向量的范数例如,但是整个矢量 - 它不清楚). 下面是一个基于代码的工作示例.请注意,我在github页面上包含了示例的打印输出,这有助于您诊断问题.
using NLopt
count = 0 # keep track of # function evaluations
function myfunc(x::Vector, grad::Vector)
if length(grad) > 0
grad[1] = 2*x[1]
end
global count
count::Int += 1
println("f_$count($x)")
x[1]^2
end
opt = Opt(:LD_MMA, 1)
xtol_rel!(opt,1e-4)
min_objective!(opt, myfunc)
(minf,minx,ret) = optimize(opt, [1.234])
println("got $minf at $minx (returned $ret)")
Run Code Online (Sandbox Code Playgroud)
¹(用优化的话来说,Yinyu Ye.)