基于微分方程的Julia复值参数估计

基于微分方程的Julia复值参数估计,julia,mathematical-optimization,differentialequations.jl,Julia,Mathematical Optimization,Differentialequations.jl,我想用Optim和微分方程来估计ODE的复杂参数。 通过更改文档中示例中的参数,我构建了一个示例案例: 我可以建立我的损失目标,然后返回复杂的值 using DifferentialEquations using Optim using DiffEqParamEstim using RecursiveArrayTools # for VectorOfArray # ODE function function f(du,u,p,t) du[1] = p[1]*u[1] - u[1]*u[2

我想用Optim和微分方程来估计ODE的复杂参数。 通过更改文档中示例中的参数,我构建了一个示例案例:

我可以建立我的损失目标,然后返回复杂的值

using DifferentialEquations
using Optim
using DiffEqParamEstim
using RecursiveArrayTools # for VectorOfArray

# ODE function
function f(du,u,p,t)
  du[1] = p[1]*u[1] - u[1]*u[2]
  du[2] = dy = -3*u[2] + u[1]*u[2]
end

# A set of comlex Initial conditions and parameters
u0 = [1.0 + 1im ;1.0 + 1im]
tspan = (0.0,10.0)
p = [1.5 + 1.5im]
prob = ODEProblem(f,u0,tspan,p)

sol = solve(prob,Tsit5())
t = collect(range(0,stop=10,length=200))
randomized = VectorOfArray([(sol(t[i]) + .01randn(2)) for i in 1:length(t)])
data = convert(Array,randomized)

cost_function = build_loss_objective(prob,Tsit5(),L2Loss(t,data),
                                     maxiters=10000,verbose=false)
cost_function(1.0im+0.1)

result = optimize(cost_function, 0.0+ 0im, 10.0+ 10im)
然后我尝试使用optimize()优化我的成本函数,该函数返回以下错误:

LoadError: MethodError: no method matching optimize(::DiffEqObjective{DiffEqParamEstim.var"#43#48"{Nothing,Bool,Int64,typeof(DiffEqParamEstim.STANDARD_PROB_GENERATOR),Base.Iterators.Pairs{Symbol,Integer,Tuple{Symbol,Symbol},Name
dTuple{(:maxiters, :verbose),Tuple{Int64,Bool}}},ODEProblem{Array{Complex{Float64},1},Tuple{Float64,Float64},true,Array{Complex{Float64},1},ODEFunction{true,typeof(f),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},DiffEqBase.StandardODEProblem},Tsit5,L2Loss{Array{Float64,1},Array{Complex{Float64},2},Nothing,Nothing,Nothing},Nothing},DiffEqParamEstim.var"#47#53"{DiffEqParamEstim.var"#43#48"{Nothing,Bool,Int64,typeof(DiffEqParamEstim.STANDARD_PROB_GENERATOR),Base.Iterators.Pairs{Symbol,Integer,Tuple{Symbol,Symbol},NamedTuple{(:maxiters, :verbose),Tuple{Int64,Bool}}},ODEProblem{Array{Complex{Float64},1},Tuple{Float64,Float64},true,Array{Complex{Float64},1},ODEFunction{true,typeof(f),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},DiffEqBase.StandardODEProblem},Tsit5,L2Loss{Array{Float64,1},Array{Complex{Float64},2},Nothing,Nothing,Nothing},Nothing}}}, ::Complex{Float64}, ::Complex{Float64})
Closest candidates are:
  optimize(::Any, ::Number, ::Number, ::AbstractArray{T,N} where N; kwargs...) where T at /home/.julia/packages/Optim/L5T76/src/multivariate/solvers/constrained/fminbox.jl:156
  optimize(::Any, ::Number, ::Number, ::AbstractArray{T,N} where N, ::Optim.AbstractConstrainedOptimizer) where T at /home/.julia/packages/Optim/L5T76/src/multivariate/solvers/constrained/fminbox.jl:160
  optimize(::Any, ::Number, ::Number, ::AbstractArray{T,N} where N, ::Optim.AbstractConstrainedOptimizer, ::Optim.Options; kwargs...) where T at /home/.julia/packages/Optim/L5T76/src/multivariate/solvers/constrained/fminbox.jl:160
  ...
Stacktrace:
 [1] top-level scope at /home/Documents/random stuff/minimal_example.jl:27
in expression starting at /home/Documents/random stuff/minimal_example.jl:27
有可能在复值函数上使用这种方法吗? 如果是,正确的方法是什么

编辑:

using DifferentialEquations
using Optim
using DiffEqParamEstim
using RecursiveArrayTools # for VectorOfArray

# ODE function
function f(du::AbstractArray{T}, u::AbstractArray{T},p::AbstractArray{T},t) where T<:Complex
  du[1] = p[1]*u[1] - u[1]*u[2]
  du[2] = dy = -3*u[2] + u[1]*u[2]
end

# A set of complex Initial conditions and parameters
u0 = [1.0 + 1im ;1.0 + 1im]
tspan = (0.0,10.0)
p = [1.5 + 1.5im]
prob = ODEProblem(f,u0,tspan,p)

sol = solve(prob,Tsit5())
sol.u
t = collect(range(0,stop=10,length=200))
randomized = VectorOfArray([(sol(t[i]) + .01randn(2)) for i in 1:length(t)])
data = convert(Array,randomized)

cost_function = build_loss_objective(prob,Tsit5(),L2Loss(t,data[1,:]),
                                     maxiters=10000,verbose=false)

result = optimize(cost_function, u0,BFGS())

Brent不能用于复数,因为没有排序。在1个复数的数组上尝试BFGS。1个复数的数组是什么意思?我试着使用:`cost\u function=build\u loss\u objective(prob,Tsit5(),L2Loss(t,data[1,:]),maxiters=10000,verbose=false)`result=optimize(cost\u function,BFGS())但是它仍然抛出一个错误它抛出了什么?我更新了问题并在那里写了它,因为它太长了,无法在评论中发表。
optimize
使用BFGS需要一个初始条件。

InexactError: Float64(-567409.1782943244 - 312256.811660436im)
in top-level scope at minimal_example.jl:27
in optimize at Optim/L5T76/src/multivariate/optimize/interface.jl:115
in optimize at Optim/L5T76/src/multivariate/optimize/interface.jl:115
in #optimize#93 at Optim/L5T76/src/multivariate/optimize/interface.jl:116 
in optimize at Optim/L5T76/src/multivariate/optimize/optimize.jl:33 
in initial_state at Optim/L5T76/src/multivariate/solvers/first_order/bfgs.jl:66
in value_gradient!! at NLSolversBase/mGaJg/src/interface.jl:82
in setproperty! at base/Base.jl:21
in convert at base/number.jl:7
in Real at base/complex.jl:37