首页 > 解决方案 > Optim.jl 的错误结果

问题描述

一次偶然的机会,我在使用 Optim.jl 时发现了这个问题

using Optim
f(x)= -abs(1-x/3.5+(2*sin(2*pi*(x-1.75))-sin(2*pi*x))/(7*pi))
res = optimize(x->f(x), 1.75, 3.5)

在 Julia 中运行此代码后,我得到以下结果

Optim.minimizer(res) # This gives 2.8524
Optim.minimum(res)   # This gives -2.7597e-01

但正确的答案应该是 f(x) 在 [1.75, 3.5] 上的最小值在 x = 1.8524 时为 -0.5617(此正确结果已通过使用 wolframalpha.com 中的命令得到确认)。

我还尝试了不同的算法(GoldenSection())作为

optimize(x->f(x), 1.75, 3.5, GoldenSection())

但它给出的结果也是错误的。

也许,我可能错误地使用了 Optim.jl 的命令。请看一下并帮助我从使用 Optim.jl 中获得正确答案。

谢谢你。

标签: optimizationjulia

解决方案


您的问题不是单峰的,因此您需要另一种算法。如果您想使用 Optim.jl,您可以使用例如框约束模拟退火:

julia> Optim.optimize(x -> f(x[1]), [1.75], [3.5], [2.0], SAMIN(), Optim.Options(iterations=10^4))
================================================================================
SAMIN results
==> Normal convergence <==
total number of objective function evaluations: 6826

     Obj. value:     -0.5616838582

       parameter      search width
         1.85242           0.00000
================================================================================

 * Status: failure

 * Candidate solution
    Final objective value:     -5.616839e-01

 * Found with
    Algorithm:     SAMIN

 * Convergence measures
    |x - x'|               = NaN ≰ 0.0e+00
    |x - x'|/|x'|          = NaN ≰ 0.0e+00
    |f(x) - f(x')|         = NaN ≰ 0.0e+00
    |f(x) - f(x')|/|f(x')| = NaN ≰ 0.0e+00
    |g(x)|                 = NaN ≰ 0.0e+00

 * Work counters
    Seconds run:   0  (vs limit Inf)
    Iterations:    6826
    f(x) calls:    6826
    ∇f(x) calls:   0

推荐阅读