Skip to content
This repository has been archived by the owner on Jun 24, 2022. It is now read-only.

Jacobians of equations defined by Fun #4

Open
ChrisRackauckas opened this issue May 1, 2017 · 2 comments
Open

Jacobians of equations defined by Fun #4

ChrisRackauckas opened this issue May 1, 2017 · 2 comments

Comments

@ChrisRackauckas
Copy link
Member

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
Copy link

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
Copy link
Member Author

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.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants