optimization - 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 中获得正确答案。
谢谢你。
解决方案
您的问题不是单峰的,因此您需要另一种算法。如果您想使用 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
推荐阅读
- rest - Elasticseach 存在对对象类型的查询返回 0 个结果
- angular - 使用 Angular 服务使用 cypress 登录
- node.js - Nodejs:allure-reporter 随机隐藏步骤
- c - 如何在 Baytrail SoC 上添加对 PCIe 桥接器的支持到 coreboot
- ios - 无法从数组中删除元素
- r - 如何使用 for 循环将函数应用于数据框中列中的特定值
- spring-boot - Prometheus 端点是一个空白页面 - 在 Spring Boot 应用程序中使用 kamon 和 Prometheus 报告器
- haskell - 如何使用 Servant 实现条件端点?
- python - 如何解决“异常:缺少默认处理程序
在 “ Python Kivy 中的错误? - azure-service-fabric - Service Fabric - 分发内存缓存