2015-11-06 77 views
0

当我运行下面的代码时,fminbox或Optim.autodiff函数似乎创建了一个Array {Dual {Float64},1}类型的向量,因为我得到错误“fbellmanind没有方法匹配。 ..Array {双{Float64},1}”。我已经指定函数fbellmanind接受Array {Any,1}但没有运气。有任何想法吗?Fminbox约束优化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} <:数组{任何,1}'其中'T <:任何'。 – Gnimuc

回答

1

从引用一个非常重要的一段Julia doc

Julia的类型参数是不变....

您可以按照至少两个可能的解决方案:

1-改变你的函数声明,最好是明确地使用正确的数据类型Array{Dual{Float64},1},但如果你喜欢一个通用的wa Y:

使用参数的数据类型:

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

最好明确地做'convert(Array {Dual {Float64},1},x)'而不是使用':: Array {Any,1} - 任何[“测试”]对,因为它很容易被当所有的东西都可以合法地传递到'fbellmanind'时。 – Gnimuc