【问题标题】:Julia minimize simple scalar functionJulia 最小化简单的标量函数
【发布时间】:2021-02-06 00:36:16
【问题描述】:

如何使用牛顿法最小化 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}}})

【问题讨论】:

    标签: julia


    【解决方案1】:

    optimize 函数需要一个区间,而不是起点:

    optimize(g, -10, 10)
    

    返回

    Results of Optimization Algorithm
     * Algorithm: Brent's Method
     * Search Interval: [-10.000000, 10.000000]
     * Minimizer: 0.000000e+00
     * Minimum: 0.000000e+00
     * Iterations: 5
     * Convergence: max(|x - x_upper|, |x - x_lower|) <= 2*(1.5e-08*|x|+2.2e-16): true
     * Objective Function Calls: 6
    

    关于可用的方法我没有看过文档,但是你可以直接使用@edit宏查看源代码:

    @edit 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
    

    因此,我认为您只有两种方法用于一维最小化:BrentGoldenSection

    你可以试试:

    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
    

    【讨论】:

      【解决方案2】:

      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
      

      【讨论】:

        猜你喜欢
        • 2023-03-25
        • 1970-01-01
        • 2015-08-26
        • 2021-07-16
        • 2012-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-18
        相关资源
        最近更新 更多