Julia极小单标量函数

Julia极小单标量函数,julia,Julia,如何使用牛顿方法最小化Julia中的简单标量函数?或任何其他合适的优化方案 using Optim # Function to optimize function g(x) return x^2 end x0 = 2.0 # Initial value optimize(g, x0, Newton()) 上面的方法似乎不起作用,而且会返回 ERROR: MethodError: no method matching optimize(::typeof(g), ::Float64

如何使用牛顿方法最小化Julia中的简单标量函数?或任何其他合适的优化方案

using Optim

# Function to optimize
function g(x)
    return x^2
end


x0 = 2.0  # Initial value
optimize(g, x0, Newton())
上面的方法似乎不起作用,而且会返回

ERROR: MethodError: no method matching optimize(::typeof(g), ::Float64, ::Newton{LineSearches.InitialStatic{Float64},LineSearches.HagerZhang{Float64,Base.RefValue{Bool}}})
“优化”功能需要一个时间间隔,而不是一个起点:

optimize(g, -10, 10)
返回

浏览源代码时,您将看到:

function optimize(f,
    lower::Union{Integer, Real},
    upper::Union{Integer, Real},
    method::Union{Brent, GoldenSection};
    kwargs...)
     
    T = promote_type(typeof(lower/1), typeof(upper/1))
    optimize(f,
             T(lower),
             T(upper),
             method;
             kwargs...)
end
因此,我认为一维极小化只有两种方法:Brent和Goldension

举例来说,您可以尝试:


Optim是为向量问题而设计的,而不是像您的示例中那样的标量问题。您可以将示例调整为具有一个变量的向量问题,但:

julia> using Optim

julia> function g(x)        # <- g accepts x as a vector
           return x[1]^2
       end

julia> x0 = [2.0]           # <- Make this a vector
1-element Vector{Float64}:
 2.0

julia> optimize(g, x0, Newton())
 * Status: success
 * Candidate solution
    Final objective value:     0.000000e+00
function optimize(f,
    lower::Union{Integer, Real},
    upper::Union{Integer, Real},
    method::Union{Brent, GoldenSection};
    kwargs...)
     
    T = promote_type(typeof(lower/1), typeof(upper/1))
    optimize(f,
             T(lower),
             T(upper),
             method;
             kwargs...)
end
julia> optimize(g, -10, 10, GoldenSection())
Results of Optimization Algorithm
 * Algorithm: Golden Section Search
 * Search Interval: [-10.000000, 10.000000]
 * Minimizer: 1.110871e-16
 * Minimum: 1.234035e-32
 * Iterations: 79
 * Convergence: max(|x - x_upper|, |x - x_lower|) <= 2*(1.5e-08*|x|+2.2e-16): true
 * Objective Function Calls: 80
julia> using Optim

julia> function g(x)        # <- g accepts x as a vector
           return x[1]^2
       end

julia> x0 = [2.0]           # <- Make this a vector
1-element Vector{Float64}:
 2.0

julia> optimize(g, x0, Newton())
 * Status: success
 * Candidate solution
    Final objective value:     0.000000e+00