julia - 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 函数内部的函数。
解决方案
推荐阅读
- excel - 在 vba 中编辑/更新现有行数据
- python - 将整数字符串列表转换为整数数组的最有效方法
- python - 将 Python 输出管道传输到 NetCat - time.sleep() 会中断输出?
- python - 2列的唯一值不在另一列
- mvvm - MVVM 依赖注入服务使用
- elasticsearch - elasticsearch排序取决于请求命中哪个节点
- python - 访问多级字典的最后一个值
- c# - IdentityServer4 和 UserInfo 端点自定义
- list - Python 3 OOP - 如何从属性列表(对象实例)中按首字母获取名称
- asp.net-mvc - Kendo Control 仅从主页调用 Controller 的操作方法。它不会从另一个页面调用它