using NeuralNetDiffEq
using Base.Test
using Plots; plotly()
using DiffEqBase, ParameterizedFunctions
using DiffEqProblemLibrary, DiffEqDevTools
using Knet
linear = (t,u) -> (1.01*u)
(f::typeof(linear))(::Type{Val{:analytic}},t,u0) = u0*exp(1.01*t)
prob = ODEProblem(linear,1/2,(0.0,1.0))
sol = solve(prob,nnode(10),dt=1/10,iterations=10)
#dts = 1./2.^(8:-1:2)
#sim_linear = test_convergence(dts,prob,nnode(10),iterations=5000)
WARNING: The finite difference methods from Calculus.jl no longer extend Base.gradient and should be called as Calculus.gradient instead. This usage is deprecated.
3.028974 seconds (3.96 M allocations: 170.895 MB, 1.18% gc time)
DiffEqBase.ODESolution{Any,1,Array{Array{Any,1},1},Array{Float64,1},Dict{Symbol,Float64},LinSpace{Float64},Array{Any,1},DiffEqBase.ODEProblem{Float64,Float64,false,##1#2,Void,UniformScaling{Int64}},NeuralNetDiffEq.nnode,NeuralNetDiffEq.NeuralNetworkInterpolation{Array{Function,1},Array{Any,1}}}(Array{Any,1}[Any[0.5],Any[0.554448],Any[0.619576],Any[0.695354],Any[0.781743],Any[0.878695],Any[0.986155],Any[1.10406],Any[1.23233],Any[1.3709]],[0.5,0.559381,0.625814,0.700136,0.783285,0.876309,0.980381,1.09681,1.22707,1.3728],Dict(:l∞=>0.00724554,:final=>0.00190116,:L∞=>0.00724554,:L2=>0.00477499,:l2=>0.00459687),linspace(0.0,1.0,10),Any[],DiffEqBase.ODEProblem{Float64,Float64,false,##1#2,Void,UniformScaling{Int64}}(#1,0.5,(0.0,1.0),nothing,UniformScaling{Int64} 1*I),NeuralNetDiffEq.nnode([10]),NeuralNetDiffEq.NeuralNetworkInterpolation{Array{Function,1},Array{Any,1}}(Function[NeuralNetDiffEq.u],Any[ [0.193931; 0.101129; … ; 0.187058; -0.187707], [0.0370189; 0.28234; … ; 0.0412036; -0.0410582], [0.160841 0.760056 … 0.149684 -0.151002]]),true,0,:Success)
plot(sol,plot_analytic=true)
sol(0.232)
1-element Array{Any,1}: 0.625818
f = (t,u) -> (t^3 + 2*t + (t^2)*((1+3*(t^2))/(1+t+(t^3))) - u*(t + ((1+3*(t^2))/(1+t+t^3))))
(::typeof(f))(::Type{Val{:analytic}},t,u0) = u0*exp(-(t^2)/2)/(1+t+t^3) + t^2
prob2 = ODEProblem(f,1.0,(0.0,1.0))
sol2 = solve(prob2,nnode(10),dt=0.1,iterations=200)
(:iteration,100,:loss,0.072428310343313499) (:iteration,200,:loss,0.017558080004817875) 4.579778 seconds (22.46 M allocations: 1.023 GB, 4.22% gc time)
DiffEqBase.ODESolution{Any,1,Array{Array{Any,1},1},Array{Float64,1},Dict{Symbol,Float64},LinSpace{Float64},Array{Any,1},DiffEqBase.ODEProblem{Float64,Float64,false,##3#4,Void,UniformScaling{Int64}},NeuralNetDiffEq.nnode,NeuralNetDiffEq.NeuralNetworkInterpolation{Array{Function,1},Array{Any,1}}}(Array{Any,1}[Any[1.0],Any[0.906344],Any[0.837442],Any[0.796139],Any[0.784761],Any[0.805066],Any[0.858192],Any[0.944622],Any[1.06416],Any[1.21592]],[1.0,0.905704,0.840507,0.801406,0.788794,0.80487,0.852367,0.933629,1.05009,1.20218],Dict(:l∞=>0.0140672,:final=>0.0137393,:L∞=>0.0144095,:L2=>0.00753109,:l2=>0.00771539),linspace(0.0,1.0,10),Any[],DiffEqBase.ODEProblem{Float64,Float64,false,##3#4,Void,UniformScaling{Int64}}(#3,1.0,(0.0,1.0),nothing,UniformScaling{Int64} 1*I),NeuralNetDiffEq.nnode([10]),NeuralNetDiffEq.NeuralNetworkInterpolation{Array{Function,1},Array{Any,1}}(Function[NeuralNetDiffEq.u],Any[ [0.00453418; 0.0147203; … ; -0.00142021; 0.0181123], [-0.0208539; -0.00611115; … ; 0.00172096; -0.0222058], [-0.00740977 0.00497175 … -0.000471647 -0.00127116]]),true,0,:Success)
plot(sol2,plot_analytic=true)
f2 = (t,u) -> (-u/5 + exp(-t/5).*cos(t))
(::typeof(f2))(::Type{Val{:analytic}},t,u0) = exp(-t/5)*(u0 + sin(t))
prob3 = ODEProblem(f2,Float32(0.0),(Float32(0.0),Float32(2.0)))
sol3 = solve(prob3,nnode(10),dt=0.2,iterations=1000)
(:iteration,100,:loss,0.0045771506f0) (:iteration,200,:loss,0.00080440316f0) (:iteration,300,:loss,0.00092169887f0) (:iteration,400,:loss,0.0049958257f0) (:iteration,500,:loss,0.0053011216f0) (:iteration,600,:loss,0.0054777786f0) (:iteration,700,:loss,0.0070675183f0) (:iteration,800,:loss,0.0003283397f0) (:iteration,900,:loss,0.0023501052f0) (:iteration,1000,:loss,0.00053509703f0) 25.992406 seconds (114.35 M allocations: 5.091 GB, 3.84% gc time)
DiffEqBase.ODESolution{Any,1,Array{Array{Any,1},1},Array{Float32,1},Dict{Symbol,Float32},LinSpace{Float32},Array{Any,1},DiffEqBase.ODEProblem{Float32,Float32,false,##5#6,Void,UniformScaling{Int64}},NeuralNetDiffEq.nnode,NeuralNetDiffEq.NeuralNetworkInterpolation{Array{Function,1},Array{Any,1}}}(Array{Any,1}[Any[0.0],Any[0.211368],Any[0.394763],Any[0.54397],Any[0.654567],Any[0.724149],Any[0.752475],Any[0.741518],Any[0.695437],Any[0.620439]],Float32[0.0,0.210817,0.393387,0.541181,0.649923,0.717615,0.744435,0.732547,0.685826,0.60952],Dict(:l∞=>0.0109186,:final=>0.0109186,:L∞=>0.0109186,:L2=>0.00640516,:l2=>0.00656466),linspace(0.0f0,2.0f0,10),Any[],DiffEqBase.ODEProblem{Float32,Float32,false,##5#6,Void,UniformScaling{Int64}}(#5,0.0f0,(0.0f0,2.0f0),nothing,UniformScaling{Int64} 1*I),NeuralNetDiffEq.nnode([10]),NeuralNetDiffEq.NeuralNetworkInterpolation{Array{Function,1},Array{Any,1}}(Function[NeuralNetDiffEq.u],Any[ Float32[0.015709; -0.017534; … ; -0.0215845; -0.0475279], Float32[-0.0131022; 0.0320655; … ; 0.0388481; 0.0848029], Float32[0.00592925 -0.000954756 … 0.00727559 0.00240677]]),true,0,:Success)
plot(sol3,plot_analytic=true)
sol3([0.721])
1-element Array{Array{Any,1},1}: Any[0.574705]
f4 = (t,u) -> (u - t)
(::typeof(f4))(::Type{Val{:analytic}},t,u0) = (t+1) - (1/3)*(e^t)
prob4 = ODEProblem(f4,Float32(2/3),(Float32(0.0),Float32(2.0)))
sol4 = solve(prob4,nnode(10),dt=0.2,iterations=1000)
(:iteration,100,:loss,0.0034845073f0) (:iteration,200,:loss,0.0052241525f0) (:iteration,300,:loss,0.0023704171f0) (:iteration,400,:loss,0.006754351f0) (:iteration,500,:loss,0.0036599224f0) (:iteration,600,:loss,0.0011417887f0) (:iteration,700,:loss,0.0014885347f0) (:iteration,800,:loss,0.0023152037f0) (:iteration,900,:loss,0.00209561f0) (:iteration,1000,:loss,0.0009707346f0) 24.653467 seconds (107.57 M allocations: 4.802 GB, 4.13% gc time)
DiffEqBase.ODESolution{Any,1,Array{Array{Any,1},1},Array{Float32,1},Dict{Symbol,Float32},LinSpace{Float32},Array{Any,1},DiffEqBase.ODEProblem{Float32,Float32,false,##7#8,Void,UniformScaling{Int64}},NeuralNetDiffEq.nnode,NeuralNetDiffEq.NeuralNetworkInterpolation{Array{Function,1},Array{Any,1}}}(Array{Any,1}[Any[0.666667],Any[0.806768],Any[0.926242],Any[1.01959],Any[1.08212],Any[1.10729],Any[1.08471],Any[0.999748],Any[0.834765],Any[0.572159]],Float32[0.666667,0.805939,0.92457,1.01742,1.07808,1.09853,1.06878,0.976316,0.805546,0.536981],Dict(:l∞=>0.0351776,:final=>0.0351776,:L∞=>0.0351776,:L2=>0.0161961,:l2=>0.0173069),linspace(0.0f0,2.0f0,10),Any[],DiffEqBase.ODEProblem{Float32,Float32,false,##7#8,Void,UniformScaling{Int64}}(#7,0.6666667f0,(0.0f0,2.0f0),nothing,UniformScaling{Int64} 1*I),NeuralNetDiffEq.nnode([10]),NeuralNetDiffEq.NeuralNetworkInterpolation{Array{Function,1},Array{Any,1}}(Function[NeuralNetDiffEq.u],Any[ Float32[-0.235277; -0.845953; … ; -0.0219762; -0.00645437], Float32[-0.273156; 1.78126; … ; -0.0717477; -0.00539317], Float32[0.355426 0.852084 … -8.06274f-5 -0.0156499]]),true,0,:Success)
plot(sol4, plot_analytic=true)
sol4(1)
1-element Array{Any,1}: 1.09992
f5 = (t,u) -> ((1/t)*(2-u))
(::typeof(f5))(::Type{Val{:analytic}},t,u0) = 2/t + 2
prob5 = ODEProblem(f5,Float32(4),(Float32(1.0),Float32(4.0)))
sol5 = solve(prob5,nnode(10),dt=0.3,iterations=1000)
(:iteration,100,:loss,0.24647419f0) (:iteration,200,:loss,0.24242423f0) (:iteration,300,:loss,0.5343885f0) (:iteration,400,:loss,0.2714228f0) (:iteration,500,:loss,0.23377489f0) (:iteration,600,:loss,0.0412234f0) (:iteration,700,:loss,0.022998033f0) (:iteration,800,:loss,0.027929015f0) (:iteration,900,:loss,0.038684204f0) (:iteration,1000,:loss,0.05757989f0) 25.085666 seconds (110.24 M allocations: 4.918 GB, 4.17% gc time)
DiffEqBase.ODESolution{Any,1,Array{Array{Any,1},1},Array{Float32,1},Dict{Symbol,Float32},LinSpace{Float32},Array{Any,1},DiffEqBase.ODEProblem{Float32,Float32,false,##9#10,Void,UniformScaling{Int64}},NeuralNetDiffEq.nnode,NeuralNetDiffEq.NeuralNetworkInterpolation{Array{Function,1},Array{Any,1}}}(Array{Any,1}[Any[4.0],Any[3.47734],Any[3.15937],Any[2.96997],Any[2.84585],Any[2.74952],Any[2.67041],Any[2.61467],Any[2.58868],Any[2.58328]],Float32[4.0,3.5,3.2,3.0,2.85714,2.75,2.66667,2.6,2.54545,2.5],Dict(:l∞=>0.0832815,:final=>0.0832815,:L∞=>0.0832815,:L2=>0.0306392,:l2=>0.0349675),linspace(1.0f0,4.0f0,10),Any[],DiffEqBase.ODEProblem{Float32,Float32,false,##9#10,Void,UniformScaling{Int64}}(#9,4.0f0,(1.0f0,4.0f0),nothing,UniformScaling{Int64} 1*I),NeuralNetDiffEq.nnode([10]),NeuralNetDiffEq.NeuralNetworkInterpolation{Array{Function,1},Array{Any,1}}(Function[NeuralNetDiffEq.u],Any[ Float32[0.456493; -0.000137541; … ; -0.456605; 1.69721], Float32[-0.391812; 1.56349; … ; 0.392288; -0.481007], Float32[0.410219 -0.793491 … -0.415449 0.0955288]]),true,0,:Success)
plot(sol5, plot_analytic=true)
f6 = (t,u) -> 2*sin(3t) + u/2
(::typeof(f6))(::Type{Val{:analytic}},t,u0) = (((-4/37)*e^(-t/2)*(6*cos(3t)+sin(3t)))/(e^(-t/2)))
prob6 = ODEProblem(f6,Float32(24/37),(Float32(pi/3),Float32(2*pi/3)))
sol6 = solve(prob6,nnode(10),dt=Float32(pi)/30,iterations=1000)
(:iteration,100,:loss,0.049189662f0) (:iteration,200,:loss,0.0068121064f0) (:iteration,300,:loss,0.006593465f0) (:iteration,400,:loss,0.0023646536f0) (:iteration,500,:loss,0.005789346f0) (:iteration,600,:loss,0.0039350763f0) (:iteration,700,:loss,0.0064273495f0) (:iteration,800,:loss,0.0030677859f0) (:iteration,900,:loss,0.002208409f0) (:iteration,1000,:loss,0.008572124f0) 25.237449 seconds (110.17 M allocations: 4.916 GB, 4.61% gc time)
DiffEqBase.ODESolution{Any,1,Array{Array{Any,1},1},Array{Float32,1},Dict{Symbol,Float32},LinSpace{Float32},Array{Any,1},DiffEqBase.ODEProblem{Float32,Float32,false,##11#12,Void,UniformScaling{Int64}},NeuralNetDiffEq.nnode,NeuralNetDiffEq.NeuralNetworkInterpolation{Array{Function,1},Array{Any,1}}}(Array{Any,1}[Any[0.648649],Any[0.645963],Any[0.566401],Any[0.419502],Any[0.223173],Any[0.00147367],Any[-0.218369],Any[-0.409356],Any[-0.548134],Any[-0.618003]],Float32[0.648649,0.646506,0.566384,0.417949,0.219102,-0.00617062,-0.2307,-0.427403,-0.572555,-0.648649],Dict(:l∞=>0.0306457,:final=>0.0306457,:L∞=>0.0306458,:L2=>0.0134102,:l2=>0.0144604),linspace(1.0471976f0,2.0943952f0,10),Any[],DiffEqBase.ODEProblem{Float32,Float32,false,##11#12,Void,UniformScaling{Int64}}(#11,0.6486486f0,(1.0471976f0,2.0943952f0),nothing,UniformScaling{Int64} 1*I),NeuralNetDiffEq.nnode([10]),NeuralNetDiffEq.NeuralNetworkInterpolation{Array{Function,1},Array{Any,1}}(Function[NeuralNetDiffEq.u],Any[ Float32[0.00422624; -0.00484248; … ; 0.0200981; 0.00109903], Float32[-0.00700049; -0.00401974; … ; -3.14897; 0.00104047], Float32[-3.8404f-5 0.00131334 … -0.015191 0.00319253]]),true,0,:Success)
plot(sol6, plot_analytic = true)