optimt .jl结果错误



偶然地,我在使用optimize .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())

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

也许,我可能错误地使用了optiml .jl的命令。请您看一看,并帮助我得到正确的答案,从使用优化。jl。

谢谢。

你的问题不是单峰的,所以你需要另一个算法。如果你想使用Optim。你可以使用例如盒约束模拟退火:

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

最新更新