如何在Julia中使用隐式解算器?

如何在Julia中使用隐式解算器?,julia,differentialequations.jl,julia-flux,Julia,Differentialequations.jl,Julia Flux,尝试调用隐式Euler来解决ODE时,我收到以下错误: MethodError: no method matching OrdinaryDiffEq.NLNewtonConstantCache(::Float32, ::Array{Float64,2}, ::LinearAlgebra.LU{Float64,Array{Float64,2}}, ::Bool, ::Bool, ::Bool, ::Float32, ::DiffEqBase.UDerivativeWrapper{ODEFuncti

尝试调用隐式Euler来解决ODE时,我收到以下错误:

MethodError: no method matching OrdinaryDiffEq.NLNewtonConstantCache(::Float32, ::Array{Float64,2}, ::LinearAlgebra.LU{Float64,Array{Float64,2}}, ::Bool, ::Bool, ::Bool, ::Float32, ::DiffEqBase.UDerivativeWrapper{ODEFunction{false,DiffEqFlux.var"#dudt_#50"{NeuralODE{Chain{Tuple{Dense{typeof(tanh),Array{Float32,2},Array{Float32,1}},Dense{typeof(identity),Array{Float32,2},Array{Float32,1}}}},Array{Float32,1},Flux.var"#12#14"{Chain{Tuple{Dense{typeof(tanh),Array{Float32,2},Array{Float32,1}},Dense{typeof(identity),Array{Float32,2},Array{Float32,1}}}}},Tuple{Float32,Float32},ImplicitEuler{0,false,DefaultLinSolve,NLNewton{Rational{Int64},Rational{Int64},Rational{Int64}},DataType},Tuple{},Base.Iterators.Pairs{Symbol,Any,NTuple{4,Symbol},NamedTuple{(:dt, :saveat, :reltol, :abstol),Tuple{Float64,StepRangeLen{Float32,Float64,Float64},Float64,Float64}}}}},LinearAlgebra.UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float32,Array{Float32,1}}, ::Float64, ::Float32, ::Float32)

Closest candidates are:
  OrdinaryDiffEq.NLNewtonConstantCache(::tType, ::J, ::W, ::Bool, ::Bool, ::Bool, ::tType, ::ufType, !Matched::tType, ::tType, ::tType) where {tType, J, W, ufType} at /Users/sdoneva/.julia/packages/OrdinaryDiffEq/nV9bA/src/nlsolve/type.jl:62
这就是我如何称呼解算器的:

using Flux, DiffEqFlux, DifferentialEquations, Plots
u0 = [1.0,1.0]
solver = ImplicitEuler(autodiff = false)
tspan_train = (0.0f0,4.00f0)
train_size = 32
t_train = range(tspan_train[1],tspan_train[2],length = train_size)
function create_neural_ode(solver, tspan, t_saveat)
    dudt = Chain(
            Dense(2,50,tanh),
            Dense(50,2))
    ps = Flux.params(dudt)
    n_ode = NeuralODE(dudt, tspan, solver, dt=1/2^4, saveat = t_saveat, reltol=1e-7, abstol=1e-9)     
    n_ode
end
n_ode = create_neural_ode(solver, tspan_train, t_train)

plot(n_ode(u0))

调用隐式工具的正确方法是什么?

您的状态是Float64,而时间是Float32,只是无法使用该组合初始化隐式工具。我把它标记为一个bug,并希望尽快修复它,但同时我建议只使用Float32或Float64。例如:

using Flux, DiffEqFlux, DifferentialEquations, Plots
u0 = Float32[1.0,1.0]
solver = ImplicitEuler(autodiff = false)
tspan_train = (0.0f0,4.00f0)
train_size = 32
t_train = range(tspan_train[1],tspan_train[2],length = train_size)
function create_neural_ode(solver, tspan, t_saveat)
    dudt = Chain(
            Dense(2,50,tanh),
            Dense(50,2))
    ps = Flux.params(dudt)
    n_ode = NeuralODE(dudt, tspan, solver, dt=1/2^4, saveat = t_saveat, reltol=1e-7, abstol=1e-9)
    n_ode
end
n_ode = create_neural_ode(solver, tspan_train, t_train)

plot(n_ode(u0))

工作正常。

您的代码似乎缺少某些部分。列车大小未定义,不能称之为稠密等@GuilhemL。的确很抱歉,我现在修复了它。将初始条件更改为Float32以匹配时间定义。但是我得到
警告:dt更新并重试。有一个。。。奇怪的浮点错误。