首页 > 解决方案 > MethodError: MethodError: Vector{Float64} 类型的对象不可调用

问题描述

mutable struct ConjugateGradientDescent <: DescentMethod
    d
    g
end

function bracket_minimum(f, x=0; s=1e-2, k=2.0)
    a, ya = x, f(x)
    b, yb = a + s, f(a + s)
    if yb > ya
        a, b = b, a
        ya, yb = yb, ya
        s = -s
    end
    while true
        c, yc = b + s, f(b + s)
        if yc > yb
            return a < c ? (a, c) : (c, a)
        end
        a, ya, b, yb = b, yb, c, yc
        s *= k
    end
end

function line_search(f, x, d)
    objective = α -> f(x + α*d)
    a, b = bracket_minimum(objective)
    α = minimize(objective, a, b)
    return x + α*d
end

function init!(M::ConjugateGradientDescent, f, ∇f, x)
    M.g = ∇f(x)
    M.d = -M.g
    return M
end

function step!(M::ConjugateGradientDescent, f, ∇f, x)
    d, g = M.d, M.g
    g′ = ∇f(x)
    β = max(0, dot(g′, g′-g)/(g⋅g))
    d′ = -g′ + β*d
    x′ = line_search(f, x, d′)
    M.d, M.g = d′, g′
    return x′
end

function conjugate_gradients(f, g, x0)
    xʼ = x0
    d = 0.01
    n = 10000
    CGD = ConjugateGradientDescent(d, g)
    init!(CGD, f, g, xʼ)

    i = 0
    prev = 0
    while i <= n
        i += 1
        xʼ = step!(CGD, f, g, xʼ)
        if prev == xʼ
            break
        else
            prev = xʼ
        end
    end
    return xʼ, rosenbrock(xʼ), i
end

x = rand(10)
g(x) = derivative(rosenbrock, x)
x_final, f_final, iter = conjugate_gradients(rosenbrock(x), g, -5.0)

此特定错误有多行:

MethodError:MethodError:Vector{Float64} 类型的对象不可调用使用方括号 [] 来索引数组。

在函数 line_search 中objective = α -> f(x + α*d)显示错误,在括号最小函数中a, ya = x, f(x) b, yb = a + s, f(a + s)显示错误。

为什么我会收到此错误?我很困惑。是否因为另一个函数内部的函数,即 f 是 line_search 函数内部的函数。

标签: julia

解决方案


推荐阅读