SciML / DiffEqApproxFun.jl

The tools for proper interactions between ApproxFun.jl and DifferentialEquations.jl for pseudospectiral partial differential equation discretizations in scientific machine learning (SciML)
https://benchmarks.sciml.ai/
Other
13 stars 8 forks source link

Jacobians of equations defined by `Fun` #4

Open ChrisRackauckas opened 7 years ago

ChrisRackauckas commented 7 years ago

For the direct usage of Fun, stiff methods can't be used because the Jacobians cannot be calculated.

@time sol=solve(prob,Rosenbrock23(),dt=1/40, adaptive=false, tstops=tstops)

MethodError: no method matching extract_derivative(::ApproxFun.Fun{ApproxFun.SumSpace{Tuple{ApproxFun.CosSpace{ApproxFun.PeriodicInterval{Float64}},ApproxFun.SinSpace{ApproxFun.PeriodicInterval{Float64}}},ApproxFun.RealBasis,ApproxFun.PeriodicInterval{Float64},1},Float64})
Closest candidates are:
  extract_derivative(!Matched::Real) at C:\Users\Chris\.julia\v0.5\ForwardDiff\src\derivative.jl:17
  extract_derivative(!Matched::AbstractArray{T,N}) at C:\Users\Chris\.julia\v0.5\ForwardDiff\src\derivative.jl:18
 in perform_step! at rosenbrock_integrators.jl:165 [inlined]
 in perform_step! at rosenbrock_integrators.jl:160 [inlined]
 in solve!(::OrdinaryDiffEq.ODEIntegrator{OrdinaryDiffEq.Rosenbrock23{0,true,DiffEqBase.LinSolveFactorize{Base.LinAlg.#lufact!}},ApproxFun.Fun{ApproxFun.SumSpace{Tuple{ApproxFun.CosSpace{ApproxFun.PeriodicInterval{Float64}},ApproxFun.SinSpace{ApproxFun.PeriodicInterval{Float64}}},ApproxFun.RealBasis,ApproxFun.PeriodicInterval{Float64},1},Float64},Float64,Float64,Float64,Array{ApproxFun.Fun{ApproxFun.SumSpace{Tuple{ApproxFun.CosSpace{ApproxFun.PeriodicInterval{Float64}},ApproxFun.SinSpace{ApproxFun.PeriodicInterval{Float64}}},ApproxFun.RealBasis,ApproxFun.PeriodicInterval{Float64},1},Float64},1},DiffEqBase.ODESolution{Float64,1,Array{ApproxFun.Fun{ApproxFun.SumSpace{Tuple{ApproxFun.CosSpace{ApproxFun.PeriodicInterval{Float64}},ApproxFun.SinSpace{ApproxFun.PeriodicInterval{Float64}}},ApproxFun.RealBasis,ApproxFun.PeriodicInterval{Float64},1},Float64},1},Void,Void,Array{Float64,1},Array{Array{ApproxFun.Fun{ApproxFun.SumSpace{Tuple{ApproxFun.CosSpace{ApproxFun.PeriodicInterval{Float64}},ApproxFun.SinSpace{ApproxFun.PeriodicInterval{Float64}}},ApproxFun.RealBasis,ApproxFun.PeriodicInterval{Float64},1},Float64},1},1},DiffEqBase.ODEProblem{ApproxFun.Fun{ApproxFun.SumSpace{Tuple{ApproxFun.CosSpace{ApproxFun.PeriodicInterval{Float64}},ApproxFun.SinSpace{ApproxFun.PeriodicInterval{Float64}}},ApproxFun.RealBasis,ApproxFun.PeriodicInterval{Float64},1},Float64},Float64,false,##3#4,Void,UniformScaling{Int64}},OrdinaryDiffEq.Rosenbrock23{0,true,DiffEqBase.LinSolveFactorize{Base.LinAlg.#lufact!}},OrdinaryDiffEq.InterpolationData{##3#4,Array{ApproxFun.Fun{ApproxFun.SumSpace{Tuple{ApproxFun.CosSpace{ApproxFun.PeriodicInterval{Float64}},ApproxFun.SinSpace{ApproxFun.PeriodicInterval{Float64}}},ApproxFun.RealBasis,ApproxFun.PeriodicInterval{Float64},1},Float64},1},Array{Float64,1},Array{Array{ApproxFun.Fun{ApproxFun.SumSpace{Tuple{ApproxFun.CosSpace{ApproxFun.PeriodicInterval{Float64}},ApproxFun.SinSpace{ApproxFun.PeriodicInterval{Float64}}},ApproxFun.RealBasis,ApproxFun.PeriodicInterval{Float64},1},Float64},1},1},OrdinaryDiffEq.Rosenbrock23ConstantCache{Float64,OrdinaryDiffEq.TimeDerivativeWrapper{##3#4,ApproxFun.Fun{ApproxFun.SumSpace{Tuple{ApproxFun.CosSpace{ApproxFun.PeriodicInterval{Float64}},ApproxFun.SinSpace{ApproxFun.PeriodicInterval{Float64}}},ApproxFun.RealBasis,ApproxFun.PeriodicInterval{Float64},1},Float64}},OrdinaryDiffEq.UDerivativeWrapper{##3#4,Float64}}}},ApproxFun.Fun{ApproxFun.SumSpace{Tuple{ApproxFun.CosSpace{ApproxFun.PeriodicInterval{Float64}},ApproxFun.SinSpace{ApproxFun.PeriodicInterval{Float64}}},ApproxFun.RealBasis,ApproxFun.PeriodicInterval{Float64},1},Float64},##3#4,Void,OrdinaryDiffEq.Rosenbrock23ConstantCache{Float64,OrdinaryDiffEq.TimeDerivativeWrapper{##3#4,ApproxFun.Fun{ApproxFun.SumSpace{Tuple{ApproxFun.CosSpace{ApproxFun.PeriodicInterval{Float64}},ApproxFun.SinSpace{ApproxFun.PeriodicInterval{Float64}}},ApproxFun.RealBasis,ApproxFun.PeriodicInterval{Float64},1},Float64}},OrdinaryDiffEq.UDerivativeWrapper{##3#4,Float64}},OrdinaryDiffEq.DEOptions{Float64,Float64,Float64,Float64,DiffEqBase.#ODE_DEFAULT_NORM,DiffEqBase.CallbackSet{Tuple{},Tuple{}},DiffEqBase.#ODE_DEFAULT_ISOUTOFDOMAIN,DiffEqBase.#ODE_DEFAULT_PROG_MESSAGE,DiffEqBase.#ODE_DEFAULT_UNSTABLE_CHECK,DataStructures.BinaryHeap{Float64,DataStructures.LessThan},Void,Void}}) at solve.jl:321
 in #solve#45(::Array{Any,1}, ::Function, ::DiffEqBase.ODEProblem{ApproxFun.Fun{ApproxFun.SumSpace{Tuple{ApproxFun.CosSpace{ApproxFun.PeriodicInterval{Float64}},ApproxFun.SinSpace{ApproxFun.PeriodicInterval{Float64}}},ApproxFun.RealBasis,ApproxFun.PeriodicInterval{Float64},1},Float64},Float64,false,##3#4,Void,UniformScaling{Int64}}, ::OrdinaryDiffEq.Rosenbrock23{0,true,DiffEqBase.LinSolveFactorize{Base.LinAlg.#lufact!}}, ::Array{Any,1}, ::Array{Any,1}, ::Array{Any,1}, ::Type{Val{true}}) at solve.jl:7
 in (::DiffEqBase.#kw##solve)(::Array{Any,1}, ::DiffEqBase.#solve, ::DiffEqBase.ODEProblem{ApproxFun.Fun{ApproxFun.SumSpace{Tuple{ApproxFun.CosSpace{ApproxFun.PeriodicInterval{Float64}},ApproxFun.SinSpace{ApproxFun.PeriodicInterval{Float64}}},ApproxFun.RealBasis,ApproxFun.PeriodicInterval{Float64},1},Float64},Float64,false,##3#4,Void,UniformScaling{Int64}}, ::OrdinaryDiffEq.Rosenbrock23{0,true,DiffEqBase.LinSolveFactorize{Base.LinAlg.#lufact!}}, ::Array{Any,1}, ::Array{Any,1}, ::Array{Any,1}, ::Type{Val{true}}) at <missing>:0
 in (::DiffE...
dlfivefifty commented 7 years ago

There is support for Jacobians already via auto-differentiation. The usage is as follows:

using ApproxFun
import ApproxFun: DualFun
N = u->u''+u^2
u0 = Fun(exp)
J = N(DualFun(u0)).J

How would you expect this to be exposed?

ChrisRackauckas commented 7 years ago

Thanks. We'll just make an override in the correct place to allow this to work. This just needs DiffEqDiffTools.jl to be completed then.