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