ForwardDiff.Dual
является подтипом абстрактного типа Real
. Проблема, однако, заключается в том, что параметры типа Джулии являются инвариантными, а не ковариантными. Затем следующее возвращает false.
# check if `Array{Float64, 1}` is a subtype of `Array{Real, 1}`
julia> Array{Float64, 1} <: Array{Real, 1}
false
Это делает ваше определение функции
function G(x::Array{Real,1})
return sum(exp.(x))
end
неверно (не подходит для вашего использования). Вот почему вы получаете следующую ошибку.
julia> G(x)
ERROR: MethodError: no method matching G(::Array{Float64,1})
Правильное определение должно быть скорее
function G(x::Array{<:Real,1})
return sum(exp.(x))
end
или если вам как-то нужен простой доступ к конкретному типу элемента массива
function G(x::Array{T,1}) where {T<:Real}
return sum(exp.(x))
end
То же самое относится и к вашей grad_F
функции.
Может оказаться полезным прочитать соответствующий раздел документации Julia для типов.
Возможно, вы также захотите напечатать аннотации ваших функций для типа AbstractArray{<:Real,1}
вместо Array{<:Real, 1}
, чтобы ваши функции могли работать с другими типами массивов, такими как StaticArrays
, OffsetArrays
и т. Д., Без необходимости переопределения.