Optimization Optim.jl单变量有界优化使用Inf作为界时会混淆输出

Optimization Optim.jl单变量有界优化使用Inf作为界时会混淆输出,optimization,julia,numerical-methods,nonlinear-optimization,Optimization,Julia,Numerical Methods,Nonlinear Optimization,下面是一个完整的例子,说明了我的问题 using Optim χI = 3 ψI = 0.5 ϕI(z) = z^-ψI λ = 1.0532733 V0 = 0.8522423425 zE = 0.5986 wRD = 0.72166623555 objective1(z) = -(z * χI * ϕI(z + zE) * (λ-1) * V0 - z * ( wRD )) objective2(z) = -1 * objective1(z) lower = 0.01 uppe

下面是一个完整的例子,说明了我的问题

using Optim

χI = 3
ψI = 0.5
ϕI(z) = z^-ψI
λ = 1.0532733
V0 = 0.8522423425
zE = 0.5986

wRD = 0.72166623555


objective1(z) = -(z * χI * ϕI(z + zE)  *  (λ-1) * V0 - z * ( wRD ))
objective2(z) = -1 * objective1(z)

lower = 0.01
upper = Inf

plot(0:0.01:0.1,objective1,title = "objective1")
png("/home/nico/Desktop/objective1.png")
plot(0:0.01:0.1,objective2, title = "objective2")
png("/home/nico/Desktop/objective2.png")

results1 = optimize(objective1,lower,upper)
results2 = optimize(objective2,lower,upper)
情节是

objective1(z)
objective2(z)
返回
NaN
at
z=0
和其他任何地方的有限值,对于某些
z>0
具有最佳值

但是,
results1
的输出是

Results of Optimization Algorithm
 * Algorithm: Brent's Method
 * Search Interval: [0.010000, Inf]
 * Minimizer: Inf
 * Minimum: NaN
 * Iterations: 1000
 * Convergence: max(|x - x_upper|, |x - x_lower|) <= 2*(1.5e-08*|x|+2.2e-16): false
 * Objective Function Calls: 1001
Results of Optimization Algorithm
 * Algorithm: Brent's Method
 * Search Interval: [0.010000, Inf]
 * Minimizer: Inf
 * Minimum: NaN
 * Iterations: 1000
 * Convergence: max(|x - x_upper|, |x - x_lower|) <= 2*(1.5e-08*|x|+2.2e-16): false
 * Objective Function Calls: 1001
我认为问题在于
upper=Inf
。例如,如果我将其更改为
upper=100
,则
results1
的输出为

Results of Optimization Algorithm
 * Algorithm: Brent's Method
 * Search Interval: [0.010000, 100.000000]
 * Minimizer: 1.000000e-02
 * Minimum: 5.470728e-03
 * Iterations: 55
 * Convergence: max(|x - x_upper|, |x - x_lower|) <= 2*(1.5e-08*|x|+2.2e-16): true
 * Objective Function Calls: 56

正如所料。

正如您在问题中所注意到的,您使用了有界优化算法,但向它传递了一个无界区间

引用文档(),
optimize
函数用于在有界区间上最小化一元函数,这一点非常精确

提供有关您遇到的问题的更多详细信息。
optimize
方法搜索间隔内的点。实现了两种算法:Brent(默认值)和Golden Section。他们首先检查的是:

new_minimizer = x_lower + golden_ratio*(x_upper-x_lower)
您可以看到它
new\u minimizer
将是
Inf
。因此,优化例程甚至无法找到有效的内点。然后,您会看到函数为
Inf
参数返回
NaN

julia> objective1(Inf)
NaN

julia> objective2(Inf)
NaN
这一组合解释了为什么在生成的输出中找到的最小值是
Inf
,而目标值是
NaN

第二点是,您应该记住,
Float64
数字的精度是有限的,因此您应该选择区间,以确保该方法实际上能够准确地评估其中的目标。例如,即使这样也会失败:

julia> optimize(objective1, 0.0001, 1.0e308)
Results of Optimization Algorithm
 * Algorithm: Brent's Method
 * Search Interval: [0.000100, 100000000000000001097906362944045541740492309677311846336810682903157585404911491537163328978494688899061249669721172515611590283743140088328307009198146046031271664502933027185697489699588559043338384466165001178426897626212945177628091195786707458122783970171784415105291802893207873272974885715430223118336.000000]
 * Minimizer: 1.000005e+308
 * Minimum: -Inf
 * Iterations: 1000
 * Convergence: max(|x - x_upper|, |x - x_lower|) <= 2*(1.5e-08*|x|+2.2e-16): false
 * Objective Function Calls: 1001
最后一点是,实际上,
Optimize
告诉您出了问题,您不应该依赖以下结果:

julia> results1.converged
false

julia> results2.converged
false
有关问题的初始说明(使用
Inf

julia> objective1(1.0e307)
7.2166623555e306

julia> objective1(1.0e308)
-Inf
julia> results1.converged
false

julia> results2.converged
false