2015-11-06 2 views
0

Либо функция fminbox, либо функция Optim.autodiff создают вектор типа Array {Dual {Float64}, 1} при запуске кода ниже, так как я получаю ошибку «fbellmanind не имеет метода. ..Array {Dual {Float64}, 1}». Я указал функцию fbellmanind на прием Array {Any, 1}, но не повезло. Есть идеи?Fminbox Constrained Optimization Julia

function fbargsolve(x::Vector) 
fbellmanind(probc,EV,V,Ind,x,V0,VUnemp0,Vnp,Vp,q,obj,assets,EmpState,i) 
fbellmanfirm(probc,poachedwage,minw,x,jfirm1,jfirm0,Ind,i) 
@inbounds for ia in 1:na 
    Vnp[ia]=V[ia] 
    Indnp[ia]=Ind[ia] 
    firmratio[ia]=jfirm1[ia]/jfirmres[ia] 
    hhratio[ia]=((Vnp[ia]-VUnemp0[ia])/(Vp[ia]-VUnemp0[ia])) 
    end 
    Crit_bwr=vnormdiff(firmratio,hhratio,Inf) 
    return Crit_bwr 
end 

f=fbargsolve 
df = Optim.autodiff(f, Float64, na) 
x0=vec(bargwage0) 
l=vec(max(reswage,minw)) 
u=vec(poachedwage*ones(na)) 

sol=fminbox(df,x0,l,u) 
+2

к сведению, что 'массив {T, 1} <: Array {Любой, 1}' где 'T <: Any'. – Gnimuc

ответ

1

См очень важный пункт из Julia doc

параметры типа Джулии инвариантны ....

Вы можете следить за по крайней мере, эти два возможных решения:

1- Измените объявление функции, лучше всего явно использовать правильный тип данных Array{Dual{Float64},1}, но если вам нравится общий вал у:

Используйте параметрический тип данных:

julia> function fbellmanind{T}(::Array{T,1}) 
    "OK" 
end 
julia> fbellmanind(["test"]) 
"OK" 

2- Тип отбрасывать ваши аргументы

julia> function fbellmanind(::Array{Any,1}) 
    "OK" 
end 
julia> fbellmanind(Any["test"]) 
"OK" 
+1

лучше явно «конвертировать» (Array {Dual {Float64}, 1}, x) 'вместо использования' :: Array {Any, 1} - Любая пара ["test"] ', поскольку она подвержена багги, когда все материалы могут быть юридически переданы в 'fbellmanind'. – Gnimuc