SciML / DifferentialEquations.jl

Multi-language suite for high-performance solvers of differential equations and scientific machine learning (SciML) components. Ordinary differential equations (ODEs), stochastic differential equations (SDEs), delay differential equations (DDEs), differential-algebraic equations (DAEs), and more in Julia.
https://docs.sciml.ai/DiffEqDocs/stable/
Other
2.8k stars 222 forks source link

ImplicitEuler fails to solve a nonlinear spring-damper problem #1010

Closed bradcarman closed 4 months ago

bradcarman commented 6 months ago

Bug and MWE

The following problem does not solve (i.e. gives Warning: Newton steps could not converge and algorithm is not adaptive. Use a lower dt.)

using OrdinaryDiffEq

dt = 1e-4
abstol = 1e-3
d=1
k=1000
F = 100
autodiff=false

function f2(du,u,p,t)
    F, k, d = p
    x, dx, ddx = u

    du[1] = dx
    du[2] = ddx
    du[3] = (d*dx + k*x^2) - (F)
end

fmm2 = ODEFunction(f2; mass_matrix=[1 0 0;0 1 0;0 0 0])
prob2 = ODEProblem(fmm2, [0.0, F/d, 0.0], (0.0, 0.01), [F, k, d])
ref2 = solve(prob2, ImplicitEuler(;autodiff); abstol, dt, adaptive=false, initializealg=NoInit())

Expected behavior

This problem solves without issue using a clean implementation of the Implicit/Backwards Euler method. See https://github.com/bradcarman/SimpleEuler.jl/blob/main/test/runtests.jl for more information.

Note: this problem also solves correctly using f0 and f1 versions of the problem, as also seen in the SimpleEuler.jl runtests.jl file. Adding additional derivatives to be calculated should not be causing the ImplicitEuler method to fail.

Additionally the Modelica problem solves without issue and gives the same result: link

Here is a plot of ddx from ref0, ref1, sol0, sol1, sol2, and sol3. * - ddx calculated manually

image

Here is the modelica result:

image

Environment

(@v1.9) pkg> st
Status `C:\Users\bradl\.julia\environments\v1.9\Project.toml`
⌃ [1dea7af3] OrdinaryDiffEq v6.59.3
  [3fc8e3da] SimpleEuler v0.1.0 `C:\Work\Packages\SimpleEuler.jl`

julia> versioninfo()
Julia Version 1.9.3
Commit bed2cd540a (2023-08-24 14:43 UTC)
Build Info:
  Official https://julialang.org/ release
Platform Info:
  OS: Windows (x86_64-w64-mingw32)
  CPU: 12 × Intel(R) Xeon(R) W-11855M CPU @ 3.20GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-14.0.6 (ORCJIT, tigerlake)
  Threads: 1 on 12 virtual cores
Environment:
  JULIA_BUILDANDBENCHMARK_NUGET = E:\CSxDT10\CSSupportTools\lib\Julia
  JULIA_DIR = C:\Programs\julia-1.9.3
  JULIA_EDITOR = code
  JULIA_NUM_THREADS =

julia> Pkg.status(; mode = PKGMODE_MANIFEST)
Status `C:\Users\bradl\.julia\environments\v1.9\Manifest.toml`
⌃ [47edcb42] ADTypes v0.2.5
  [f03e0fa6] AM2App v0.13.0 `C:\Work\Packages\AM2App.jl`
  [a4c015fc] ANSIColoredPrinters v0.0.1
⌃ [c3fe647b] AbstractAlgebra v0.34.5
  [621f4979] AbstractFFTs v1.5.0
  [398f06c4] AbstractLattices v0.3.0
  [1520ce14] AbstractTrees v0.4.4
  [7d9f7c33] Accessors v0.1.33
⌅ [79e6a3ab] Adapt v3.7.2
  [27a7e980] Animations v0.4.1
  [ec485272] ArnoldiMethod v0.2.0
  [4fba245c] ArrayInterface v7.7.0
  [4c555306] ArrayLayouts v1.4.5
⌅ [15f4f7f2] AutoHashEquals v0.2.0
  [67c07d97] Automa v1.0.2
⌃ [13072b0f] AxisAlgorithms v1.0.1
  [39de3d68] AxisArrays v0.4.7
  [aae01518] BandedMatrices v1.4.0
  [6e4b80f9] BenchmarkTools v1.4.0
  [e2ed5e7c] Bijections v0.1.6
  [d1d4a3ce] BitFlags v0.1.8
  [62783981] BitTwiddlingConvenienceFunctions v0.1.5
⌃ [764a87c0] BoundaryValueDiffEq v5.6.0
  [4f66f736] BradCode v0.2.1 `C:\Work\Packages\BradCode.jl`
  [fa961155] CEnum v0.5.0
  [2a0fbf3d] CPUSummary v0.2.4
  [96374032] CRlibm v1.0.1
  [00ebfdb7] CSTParser v3.3.6
  [159f3aea] Cairo v1.0.5
⌅ [13f3f980] CairoMakie v0.10.12
  [49dc2e85] Calculus v0.5.1
  [43e84be3] CatView v0.8.0 `C:\Work\Packages\CatView.jl`
  [b7f2f3fa] CatViewer v0.3.0 `C:\Work\Packages\CatViewer.jl`
  [31115a61] CatapultData v0.3.0 `C:\Work\Packages\CatapultData.jl`
  [86aefda3] CatapultFunctions v0.6.3 `C:\Work\Packages\CatapultFunctions.jl`
  [f788264d] CatapultModel v0.16.3 `C:\Work\Packages\CatapultModel.jl`
  [96f00424] CatapultModelInversion v0.3.2 `C:\Work\Packages\CatapultModelInversion.jl`
  [082447d4] ChainRules v1.58.1
  [d360d2e6] ChainRulesCore v1.19.0
  [fb6a15b2] CloseOpenIntervals v0.1.12
  [da1fd8a2] CodeTracking v1.3.5
  [944b1d66] CodecZlib v0.7.3
  [a2cac450] ColorBrewer v0.4.0
  [35d6a980] ColorSchemes v3.24.0
  [3da002f7] ColorTypes v0.11.4
⌅ [c3611d14] ColorVectorSpace v0.9.10
  [5ae59095] Colors v0.12.10
  [861a8166] Combinatorics v1.0.2
  [a80b9123] CommonMark v0.8.12
  [38540f10] CommonSolve v0.2.4
  [bbf7d656] CommonSubexpressions v0.3.0
  [34da2185] Compat v4.10.1
  [7f83659b] ComponentLibrary v0.9.2 `C:\Work\Packages\ComponentLibrary.jl`
  [b152e2b5] CompositeTypes v0.1.3
  [a33af91c] CompositionsBase v0.1.2
  [2569d6c7] ConcreteStructs v0.2.3
  [f0e56b4a] ConcurrentUtilities v2.3.0
  [187b0558] ConstructionBase v1.5.4
  [d38c429a] Contour v0.6.2
  [150eb455] CoordinateTransformations v0.6.3
  [adafc99b] CpuId v0.3.1
  [a5017ee6] CrashSimOffice v0.4.1 `C:\Work\Packages\CrashSimOffice.jl`
  [a8cc5b0e] Crayons v4.1.1
  [3cefb62a] DAE2AE v0.1.0 `C:\Work\Packages\DAE2AE.jl`
  [a10d1c49] DBInterface v2.5.0
  [717857b8] DSP v0.7.9
  [9a962f9c] DataAPI v1.15.0
  [a93c6f00] DataFrames v1.6.1
  [82cc6244] DataInterpolations v4.6.0
  [864edb3b] DataStructures v0.18.15
  [e2d170a0] DataValueInterfaces v1.0.0
  [927a84f5] DelaunayTriangulation v0.8.11
⌃ [bcd4f6db] DelayDiffEq v5.44.0
  [8bb1440f] DelimitedFiles v1.9.1
⌃ [2b5f629d] DiffEqBase v6.144.0
⌃ [459566f4] DiffEqCallbacks v2.35.0
  [77a26b50] DiffEqNoiseProcess v5.20.0
  [213d9088] DiffEqToleranceTools v0.1.0 `C:\Work\Packages\DiffEqToleranceTools.jl`
  [163ba53b] DiffResults v1.1.0
  [b552c78f] DiffRules v1.15.1
⌃ [0c46a032] DifferentialEquations v7.11.0
  [b4f34e82] Distances v0.10.11
  [31c24e10] Distributions v0.25.104
  [ffbed154] DocStringExtensions v0.9.3
  [e30172f5] Documenter v1.2.1
  [35a29f4d] DocumenterTools v0.1.18
⌅ [5b8099bc] DomainSets v0.6.7
  [5091b313] DotNET v0.2.1
  [fa6b7ba4] DualNumbers v0.6.8
  [7c1d4256] DynamicPolynomials v0.5.3
  [4e289a0a] EnumX v1.0.4
  [f151be2c] EnzymeCore v0.6.4
  [90fa49ef] ErrorfreeArithmetic v0.5.2
  [429591f6] ExactPredicates v2.2.6
  [460bff9d] ExceptionUnwrapping v0.1.9
  [d4d017d3] ExponentialUtilities v1.25.0
  [e2ba6199] ExprTools v0.1.10
  [6b7a57c9] Expronicon v0.10.5
  [411431e0] Extents v0.1.2
  [8f5d6c58] EzXML v1.2.0
  [c87230d0] FFMPEG v0.4.1
  [7a1cc6ca] FFTW v1.7.2
  [9d29842c] FastAlmostBandedMatrices v0.1.0
  [7034ab61] FastBroadcast v0.2.8
  [9aa1b823] FastClosures v0.3.2
  [29a986be] FastLapackInterface v2.0.0
  [fa42c844] FastRounding v0.3.1
  [5789e2e9] FileIO v1.16.1
  [1a297f60] FillArrays v1.9.3
  [d8f44d74] FilterHelpers v0.2.0
  [6a86dc24] FiniteDiff v2.21.1
  [53c48c17] FixedPointNumbers v0.8.4
  [59287772] Formatting v0.4.2
  [f6369f11] ForwardDiff v0.10.36
  [b38be410] FreeType v4.1.1
⌃ [663a7486] FreeTypeAbstraction v0.10.0
  [069b7b12] FunctionWrappers v1.1.3
  [77dc65aa] FunctionWrappersWrappers v0.1.3
  [d9f16b24] Functors v0.4.5
  [f7f18e0c] GLFW v3.4.1
⌅ [e9467ef8] GLMakie v0.8.12
⌃ [46192b85] GPUArraysCore v0.1.5
⌅ [28b8d3ca] GR v0.72.10
  [c145ed77] GenericSchur v0.5.3
⌃ [cf35fbd7] GeoInterface v1.3.2
  [5c1252a2] GeometryBasics v0.4.9
  [d7ba0133] Git v1.3.0
  [c27321d9] Glob v1.3.1
  [a2bd30eb] Graphics v1.1.2
  [86223c79] Graphs v1.9.0
⌅ [3955a311] GridLayoutBase v0.9.2
  [42e2da0e] Grisu v1.0.2
  [0b43b601] Groebner v0.5.1
⌅ [d5909c97] GroupsCore v0.4.2
  [708ec375] Gumbo v0.8.2
  [cd3eb016] HTTP v1.10.1
  [eafb193a] Highlights v0.5.2
  [3e5b6fbb] HostCPUFeatures v0.1.16
  [34004b35] HypergeometricFunctions v0.3.23
  [b5f81e59] IOCapture v0.2.3
  [615f187c] IfElse v0.1.1
  [2803e5a7] ImageAxes v0.6.11
⌃ [c817782e] ImageBase v0.1.5
⌅ [a09fc81d] ImageCore v0.9.4
  [82e4d734] ImageIO v0.6.7
  [bc367c6b] ImageMetadata v0.9.9
  [9b13fd28] IndirectArrays v1.0.0
  [d25df0c9] Inflate v0.1.4
  [6d011eab] Inflector v1.1.0
  [842dd82b] InlineStrings v1.4.0
  [18e54dd8] IntegerMathUtils v0.1.2
⌃ [a98d9a8b] Interpolations v0.15.0
⌅ [d1acc4aa] IntervalArithmetic v0.21.2
  [8197267c] IntervalSets v0.7.8
  [d8418881] Intervals v1.10.0
  [3587e190] InverseFunctions v0.1.12
  [41ab1584] InvertedIndices v1.3.0
  [92d709cd] IrrationalConstants v0.2.2
  [f1662d9f] Isoband v0.1.1
  [c8e1da08] IterTools v1.9.0
  [82899510] IteratorInterfaceExtensions v1.0.0
  [1019f520] JLFzf v0.1.7
  [692b3bcd] JLLWrappers v1.5.0
  [682c06a0] JSON v0.21.4
  [0f8b85d8] JSON3 v1.14.0
  [b835a17e] JpegTurbo v0.1.5
  [98e50ef6] JuliaFormatter v1.0.45
  [aa1ae85d] JuliaInterpreter v0.9.27
  [8391cb6b] JuliaSimCompiler v0.1.4 `C:\Work\Packages\JuliaSimCompiler.jl`
  [ccbc3e58] JumpProcesses v9.10.1
  [ef3ab10e] KLU v0.4.1
  [5ab0869b] KernelDensity v0.6.8
  [ba0b0d4f] Krylov v0.9.5
  [b964fa9f] LaTeXStrings v1.3.1
  [2ee39098] LabelledArrays v1.15.0
  [984bce1d] LambertW v0.4.6
  [23fbe1c1] Latexify v0.16.1
  [73f95e8e] LatticeRules v0.0.1
  [10f19ff3] LayoutPointers v0.1.15
  [0e77f7df] LazilyInitializedFields v1.2.2
  [50d2b5c4] Lazy v0.15.1
  [5078a376] LazyArrays v1.8.3
  [8cdb02fc] LazyModules v0.3.1
  [1d6d02ad] LeftChildRightSiblingTrees v0.2.0
  [2d8b4e74] LevyArea v1.0.0
  [9c8b4983] LightXML v0.9.1
  [d3d80556] LineSearches v7.2.0
  [9b3f67b0] LinearAlgebraX v0.2.5
⌃ [7ed4a6bd] LinearSolve v2.21.1
  [16fef848] LiveServer v1.2.7
  [89398ba2] LocalRegistry v0.5.6
  [2ab3a3ac] LogExpFunctions v0.3.26
  [e6f89c97] LoggingExtras v1.0.3
  [bdcacae8] LoopVectorization v0.12.166
  [6f1432cf] LoweredCodeUtils v2.3.2
  [6c6e2e6c] MIMEs v0.1.4
  [d8e11817] MLStyle v0.4.17
  [1914dd2f] MacroTools v0.5.12
⌅ [ee78f7c6] Makie v0.19.12
⌅ [20f20a25] MakieCore v0.6.9
  [d125e4d3] ManualMemory v0.1.8
  [dbb5928d] MappedArrays v0.4.2
  [d0879d2d] MarkdownAST v0.1.2
  [0a4f8689] MathTeXEngine v0.5.7
  [a3b82374] MatrixFactorizations v2.1.0
  [739be429] MbedTLS v1.1.9
  [442fdcdd] Measures v0.3.2
  [7269a6da] MeshIO v0.4.10
  [39ec1447] Millboard v0.2.5
  [e1d29d7a] Missings v1.1.0
  [78c3b35d] Mocking v0.7.7
⌃ [961ee093] ModelingToolkit v8.73.2
  [c7ce1f42] ModelingToolkitComponents v0.23.1 `C:\Work\Packages\ModelingToolkitComponents.jl`
  [23d639d0] ModelingToolkitDesigner v1.1.1 `C:\Work\Packages\ModelingToolkitDesigner.jl`
  [16a59e39] ModelingToolkitStandardLibrary v2.3.4
  [66fc600b] ModernGL v1.1.7
  [7475f97c] Mods v2.2.0
  [e94cdb99] MosaicViews v0.3.4
  [46d2c3a1] MuladdMacro v0.2.4
  [e1cad5d1] Multibody v0.1.0 `C:\Work\Packages\Multibody.jl`
  [3b2b4ff1] Multisets v0.4.4
  [102ac46a] MultivariatePolynomials v0.5.3
  [ffc61752] Mustache v1.0.19
  [d8a4904e] MutableArithmetics v1.4.0
  [d41bc354] NLSolversBase v7.8.3
  [2774e3e8] NLsolve v4.5.1
  [77ba4419] NaNMath v1.0.2
  [f09324ee] Netpbm v1.1.1
⌅ [8913a72c] NonlinearSolve v2.8.2
  [0f4fe800] OMJulia v0.3.1
  [510215fc] Observables v0.5.5
⌃ [6fe1bfb0] OffsetArrays v1.12.10
  [52e1d378] OpenEXR v0.3.2
  [4d8831e6] OpenSSL v1.4.1
  [429524aa] Optim v1.7.8
  [bac558e1] OrderedCollections v1.6.3
⌃ [1dea7af3] OrdinaryDiffEq v6.59.3
  [90014a1f] PDMats v0.11.31
  [f57f5aa1] PNGFiles v0.4.3
  [65ce6f38] PackageExtensionCompat v1.0.2
  [19eb6ba3] Packing v0.5.0
  [5432bcbf] PaddedViews v0.5.12
  [d96e819e] Parameters v0.12.3
⌃ [69de0a69] Parsers v2.8.0
  [2ae35dd2] Permutations v0.4.19
  [b98c9c47] Pipe v1.3.0
  [eebad327] PkgVersion v0.3.3
  [ccf2f8ad] PlotThemes v3.1.0
⌃ [995b91a9] PlotUtils v1.3.5
  [91a5bcdd] Plots v1.39.0
  [e409e4f3] PoissonRandom v0.4.4
  [f517fe37] Polyester v0.7.9
  [1d0040c9] PolyesterWeave v0.2.1
  [647866c9] PolygonOps v0.1.2
  [f27b6e38] Polynomials v4.0.6
  [2dfb63ee] PooledArrays v1.4.3
  [85a6dd25] PositiveFactorizations v0.2.4
  [d236fae5] PreallocationTools v0.4.13
  [aea7be01] PrecompileTools v1.2.0
  [21216c6a] Preferences v1.4.1
  [08abe8d2] PrettyTables v2.3.1
  [27ebfcd6] Primes v0.5.5
  [33c8b6b6] ProgressLogging v0.1.4
  [92933f4c] ProgressMeter v1.9.0
  [4b34888f] QOI v1.0.0
  [1fd47b50] QuadGK v2.9.1
  [8a4e6c94] QuasiMonteCarlo v0.3.3
  [94ee1d12] Quaternions v0.7.5
⌃ [74087812] Random123 v1.6.1
  [fb686558] RandomExtensions v0.4.4
  [e6cf234a] RandomNumbers v1.5.3
  [b3c3ace0] RangeArrays v0.3.2
  [c84ed2f1] Ratios v0.4.5
  [c1ae055f] RealDot v0.1.0
  [3cdcf5f2] RecipesBase v1.3.4
  [01d81517] RecipesPipeline v0.6.12
⌅ [731186ca] RecursiveArrayTools v2.38.10
  [f2c3362d] RecursiveFactorization v0.2.21
  [189a3867] Reexport v1.2.2
  [2792f1a3] RegistryInstances v0.1.0
  [d1eb7eb1] RegistryTools v2.2.3
  [05181044] RelocatableFolders v1.0.1
  [ae029012] Requires v1.3.0
  [ae5879a3] ResettableStacks v1.1.1
  [295af30f] Revise v3.5.10
  [286e9d63] RingLists v0.2.8
  [79098fc4] Rmath v0.7.1
  [6038ab10] Rotations v1.6.1
  [5eaf0fd0] RoundingEmulator v0.2.1
  [7e49a35a] RuntimeGeneratedFunctions v0.5.12
  [fdea26ae] SIMD v3.4.6
  [94e857df] SIMDTypes v0.1.0
  [476501e8] SLEEFPirates v0.6.42
  [0aa819cd] SQLite v1.6.0
  [322a6be2] Sass v0.2.0
⌃ [0bca4576] SciMLBase v2.10.0
  [e9a6253c] SciMLNLSolve v0.1.9
  [c0aeaf25] SciMLOperators v0.3.7
  [6c6a2e73] Scratch v1.2.1
  [340e8cb6] SearchLight v2.10.0
  [21a827c4] SearchLightSQLite v2.2.2
  [91c51154] SentinelArrays v1.4.1
  [3cc68bcd] SetRounding v0.2.1
  [efcf1570] Setfield v1.1.1
  [65257c39] ShaderAbstractions v0.4.0
  [992d4aef] Showoff v1.0.3
  [73760f76] SignedDistanceFields v0.4.0
  [777ac1f9] SimpleBufferStream v1.1.0
  [3fc8e3da] SimpleEuler v0.1.0 `C:\Work\Packages\SimpleEuler.jl`
  [55797a34] SimpleGraphs v0.8.6
⌅ [727e6d20] SimpleNonlinearSolve v0.1.25
  [ec83eff0] SimplePartitions v0.3.1
  [cc47b68c] SimplePolynomials v0.2.17
  [a6525b86] SimpleRandom v0.3.1
  [699a6c99] SimpleTraits v0.9.4
  [ce78b400] SimpleUnPack v1.1.0
  [45858cf5] Sixel v0.1.3
  [ed01d8cd] Sobol v1.5.0
  [a2af1166] SortingAlgorithms v1.2.0
  [47a9eef4] SparseDiffTools v2.15.0
⌃ [dc90abb0] SparseInverseSubset v0.1.1
  [e56a9233] Sparspak v0.3.9
  [276daf66] SpecialFunctions v2.3.1
  [c5dd0088] StableHashTraits v1.1.3
  [cae243ae] StackViews v0.1.1
  [aedffcd0] Static v0.8.8
  [0d7ed370] StaticArrayInterface v1.5.0
  [90137ffa] StaticArrays v1.8.1
  [1e83bf80] StaticArraysCore v1.4.2
  [82ae8749] StatsAPI v1.7.0
  [2913bbd2] StatsBase v0.34.2
  [4c63d2b9] StatsFuns v1.3.0
⌅ [9672c7b4] SteadyStateDiffEq v1.16.1
  [789caeaf] StochasticDiffEq v6.64.0
⌃ [7792a7ef] StrideArraysCore v0.4.17
  [69024149] StringEncodings v0.3.7
  [892a3eda] StringManipulation v0.3.4
  [09ab397b] StructArrays v0.6.16
  [856f2bd8] StructTypes v1.10.0
  [46d4f523] Structures v0.6.3 `C:\Work\Packages\Structures.jl`
⌃ [c3572dad] Sundials v4.22.1
⌅ [2efcf032] SymbolicIndexingInterface v0.2.2
⌃ [d1185830] SymbolicUtils v1.4.0
⌃ [0c5d862f] Symbolics v5.11.0
  [f2d4222d] SystemData v0.8.2 `C:\Work\Packages\SystemData.jl`
  [dc5dba14] TZJData v1.0.0+2023c
  [3783bdb8] TableTraits v1.0.1
  [bd369af6] Tables v1.11.1
  [62fd8b95] TensorCore v0.1.1
  [5d786b92] TerminalLoggers v0.1.7
  [1e6cf692] TestEnv v1.101.1
  [8290d209] ThreadingUtilities v0.5.2
⌅ [731e570b] TiffImages v0.6.8
  [f269a46b] TimeZones v1.13.0
  [a759f4b9] TimerOutputs v0.5.23
  [0796e94c] Tokenize v0.5.26
  [3bb67fe8] TranscodingStreams v0.10.2
  [d5829a12] TriangularSolve v0.1.20
  [410a4b4d] Tricks v0.1.8
  [981d1d27] TriplotBase v0.1.0
  [781d530d] TruncatedStacktraces v1.4.0
  [9d95972d] TupleTools v1.4.3
  [5c2747f8] URIs v1.5.1
  [3a884ed6] UnPack v1.0.2
  [1cfade01] UnicodeFun v0.4.1
  [1986cc42] Unitful v1.19.0
  [45397f5d] UnitfulLatexify v1.6.3
⌃ [a7c27f48] Unityper v0.1.5
  [41fe7b60] Unzip v0.2.0
  [3d5dd08c] VectorizationBase v0.21.65
  [19fa3120] VertexSafeGraphs v0.2.0
  [ea10d353] WeakRefStrings v1.4.2
  [44d3d7a6] Weave v0.10.12
⌅ [efce3f68] WoodburyMatrices v0.5.6
  [fdbf4ff8] XLSX v0.10.0
  [ddb6d928] YAML v0.4.9
  [c2297ded] ZMQ v1.2.2
  [a5390f91] ZipFile v0.10.1
  [6e34b625] Bzip2_jll v1.0.8+0
  [4e9b3aee] CRlibm_jll v1.0.1+0
  [83423d85] Cairo_jll v1.16.1+1
  [5ae413db] EarCut_jll v2.2.4+0
  [2702e6a9] EpollShim_jll v0.0.20230411+0
  [2e619515] Expat_jll v2.5.0+0
⌃ [b22a6f82] FFMPEG_jll v4.4.2+2
  [f5851436] FFTW_jll v3.3.10+0
  [a3f928ae] Fontconfig_jll v2.13.93+0
  [d7e528f0] FreeType2_jll v2.13.1+0
  [559328eb] FriBidi_jll v1.0.10+0
⌃ [0656b61e] GLFW_jll v3.3.8+0
⌅ [d2c73de3] GR_jll v0.72.10+0
  [78b55507] Gettext_jll v0.21.0+0
⌃ [f8c6e375] Git_jll v2.36.1+2
  [7746bdde] Glib_jll v2.76.5+0
  [3b182d85] Graphite2_jll v1.3.14+0
  [528830af] Gumbo_jll v0.10.2+0
  [2e76f6c2] HarfBuzz_jll v2.8.1+1
  [905a6f67] Imath_jll v3.1.7+0
⌃ [1d5cc7b8] IntelOpenMP_jll v2024.0.0+0
  [aacddb02] JpegTurbo_jll v3.0.1+0
  [c1c5ebd0] LAME_jll v3.100.1+0
  [88015f11] LERC_jll v3.0.0+1
⌃ [1d63c593] LLVMOpenMP_jll v15.0.4+0
  [dd4b983a] LZO_jll v2.10.1+0
⌅ [e9f186c6] Libffi_jll v3.2.2+1
  [d4300ac3] Libgcrypt_jll v1.8.7+0
  [7e76a0d4] Libglvnd_jll v1.6.0+0
  [7add5ba3] Libgpg_error_jll v1.42.0+0
  [94ce4f54] Libiconv_jll v1.17.0+0
  [4b2f31a3] Libmount_jll v2.35.0+0
⌅ [89763e89] Libtiff_jll v4.5.1+1
  [38a345b3] Libuuid_jll v2.36.0+0
  [856f044c] MKL_jll v2024.0.0+0
  [e7412a2a] Ogg_jll v1.3.5+1
  [18a262bb] OpenEXR_jll v3.1.4+0
⌅ [9bd350c2] OpenSSH_jll v8.9.0+1
⌅ [458c3c95] OpenSSL_jll v1.1.23+0
  [efe28fd5] OpenSpecFun_jll v0.5.5+0
  [91d4177d] Opus_jll v1.3.2+0
  [36c8627f] Pango_jll v1.50.14+0
  [30392449] Pixman_jll v0.42.2+0
⌃ [c0090381] Qt6Base_jll v6.5.2+2
  [f50d1b31] Rmath_jll v0.4.0+0
  [76ed43ae] SQLite_jll v3.43.0+0
⌅ [fb77eaff] Sundials_jll v5.2.1+0
  [a44049a8] Vulkan_Loader_jll v1.3.243+0
  [a2964d1f] Wayland_jll v1.21.0+1
  [2381bf8a] Wayland_protocols_jll v1.25.0+0
  [02c8fc9c] XML2_jll v2.12.2+0
  [aed1982a] XSLT_jll v1.1.34+0
  [ffd25f8a] XZ_jll v5.4.5+0
  [f67eecfb] Xorg_libICE_jll v1.0.10+1
  [c834827a] Xorg_libSM_jll v1.2.3+0
  [4f6342f7] Xorg_libX11_jll v1.8.6+0
  [0c0b7dd1] Xorg_libXau_jll v1.0.11+0
  [935fb764] Xorg_libXcursor_jll v1.2.0+4
  [a3789734] Xorg_libXdmcp_jll v1.1.4+0
  [1082639a] Xorg_libXext_jll v1.3.4+4
  [d091e8ba] Xorg_libXfixes_jll v5.0.3+4
  [a51aa0fd] Xorg_libXi_jll v1.7.10+4
  [d1454406] Xorg_libXinerama_jll v1.1.4+4
  [ec84b674] Xorg_libXrandr_jll v1.5.2+4
  [ea2f1a96] Xorg_libXrender_jll v0.9.10+4
  [14d82f49] Xorg_libpthread_stubs_jll v0.1.1+0
  [c7cfdc94] Xorg_libxcb_jll v1.15.0+0
  [cc61e674] Xorg_libxkbfile_jll v1.1.2+0
  [e920d4aa] Xorg_xcb_util_cursor_jll v0.1.4+0
  [12413925] Xorg_xcb_util_image_jll v0.4.0+1
  [2def613f] Xorg_xcb_util_jll v0.4.0+1
  [975044d2] Xorg_xcb_util_keysyms_jll v0.4.0+1
  [0d47668e] Xorg_xcb_util_renderutil_jll v0.3.9+1
  [c22f9ab0] Xorg_xcb_util_wm_jll v0.4.1+1
  [35661453] Xorg_xkbcomp_jll v1.4.6+0
  [33bec58e] Xorg_xkeyboard_config_jll v2.39.0+0
  [c5fb5394] Xorg_xtrans_jll v1.5.0+0
  [8f1865be] ZeroMQ_jll v4.3.4+0
  [3161d3a3] Zstd_jll v1.5.5+0
  [35ca27e7] eudev_jll v3.2.9+0
  [214eeab7] fzf_jll v0.43.0+0
  [1a1c6b14] gperf_jll v3.1.1+0
  [9a68df92] isoband_jll v0.2.3+0
  [a4ae2306] libaom_jll v3.4.0+0
  [0ac62f75] libass_jll v0.15.1+0
  [2db6ffa8] libevdev_jll v1.11.0+0
  [f638f0a6] libfdk_aac_jll v2.0.2+0
  [36db933b] libinput_jll v1.18.0+0
  [b53b4c65] libpng_jll v1.6.40+0
  [47bcb7c8] libsass_jll v3.6.4+0
  [075b6546] libsixel_jll v1.10.3+0
  [a9144af2] libsodium_jll v1.0.20+0
  [f27f6e37] libvorbis_jll v1.3.7+1
  [009596ad] mtdev_jll v1.1.6+0
  [1270edf5] x264_jll v2021.5.5+0
  [dfaa095f] x265_jll v3.5.0+0
  [d8fb68d0] xkbcommon_jll v1.4.1+1
  [0dad84c5] ArgTools v1.1.1
  [56f22d72] Artifacts
  [2a0f44e3] Base64
  [8bf52ea8] CRC32c
  [ade2ca70] Dates
  [8ba89e20] Distributed
  [f43a241f] Downloads v1.6.0
  [7b1f6079] FileWatching
  [9fa8497b] Future
  [b77e0a4c] InteractiveUtils
  [4af54fe1] LazyArtifacts
  [b27032c2] LibCURL v0.6.3
  [76f85450] LibGit2
  [8f399da3] Libdl
  [37e2e46d] LinearAlgebra
  [56ddb016] Logging
  [d6f4376e] Markdown
  [a63ad114] Mmap
  [ca575930] NetworkOptions v1.2.0
  [44cfe95a] Pkg v1.9.2
  [de0858da] Printf
  [9abbd945] Profile
  [3fa0cd96] REPL
  [9a3f8284] Random
  [ea8e919c] SHA v0.7.0
  [9e88b42a] Serialization
  [1a1011a3] SharedArrays
  [6462fe0b] Sockets
  [2f01184e] SparseArrays
  [10745b16] Statistics v1.9.0
  [4607b0f0] SuiteSparse
  [fa267f1f] TOML v1.0.3
  [a4e569a6] Tar v1.10.0
  [8dfed614] Test
  [cf7118a7] UUIDs
  [4ec0a83e] Unicode
  [e66e0078] CompilerSupportLibraries_jll v1.0.5+0
  [deac9b47] LibCURL_jll v7.84.0+0
  [29816b5a] LibSSH2_jll v1.10.2+0
  [c8ffd9c3] MbedTLS_jll v2.28.2+0
  [14a3606d] MozillaCACerts_jll v2022.10.11
  [4536629a] OpenBLAS_jll v0.3.21+4
  [05823500] OpenLibm_jll v0.8.1+0
  [efcefdf7] PCRE2_jll v10.42.0+0
  [bea87d4a] SuiteSparse_jll v5.10.1+6
  [83775a58] Zlib_jll v1.2.13+0
  [8e850b90] libblastrampoline_jll v5.8.0+0
  [8e850ede] nghttp2_jll v1.48.0+0
  [3f19e933] p7zip_jll v17.4.0+0
ChrisRackauckas commented 6 months ago
using OrdinaryDiffEq

dt = 1e-6
abstol = 1e-7
d=1
k=1000
F = 100
autodiff=false

function f2(du,u,p,t)
    F, k, d = p
    x, dx, ddx = u

    du[1] = dx
    du[2] = ddx
    du[3] = (d*dx + k*x^2) - (F)
end

fmm2 = ODEFunction(f2; mass_matrix=[1 0 0;0 1 0;0 0 0])
prob2 = ODEProblem(fmm2, [0.0, F/d, 0.0], (0.0, 0.01), [F, k, d])
ref1 = solve(prob2, Rodas5P(;autodiff); abstol, dt, initializealg=NoInit())
plot(ref1)
ref2 = solve(prob2, ImplicitEuler(;autodiff, nlsolve=NLNewton(check_div = false, always_new=true)); abstol, dt, adaptive=false, initializealg=NoInit())
plot(ref2)

The solution is fine with that. If adaptivity is turned off then the nonlinear solver needs to be tweaked in order to not easily give up. It easily gives up on purpose because the quickest thing to do is just change dt. It's a common strategy that all stiff ODE solvers do, and it's also why most software doesn't allow you to set adaptive=false.

We should when adaptive=false set those two options. But instead of doing that, I want to just complete https://github.com/SciML/OrdinaryDiffEq.jl/issues/1570 and https://github.com/SciML/NonlinearSolve.jl/issues/241, in which case I would propose a very different handling. Since that's scheduled for the next two weeks, no reason to do anything here and just finish the real answer.

bradcarman commented 6 months ago

Thanks Chris, that sounds good. A couple points:

I would assume that if ImplicitEuler worked with non-adaptive (with any size time step), then it should work with adaptive mode. This is what leads me to post this as a "bug".

using OrdinaryDiffEq
using SimpleEuler: BackwardEuler
using Plots

dt = 1e-4
abstol = 1e-3
d=100
k=1000
F = 100
autodiff=true
always_new=false

function f3(du,u,p,t)
    F, k, d = p
    x, dx, ddx, dddx = u

    du[1] = dx
    du[2] = ddx
    du[3] = dddx
    du[4] = (d*dx + k*x^2) - (F)
end

fmm3 = ODEFunction(f3; mass_matrix=[1 0 0 0;0 1 0 0;0 0 1 0;0 0 0 0])
prob3 = ODEProblem(fmm3, [0.0, F/d, 0.0, 0.0], (0.0, 2), [F, k, d])
ref3 = solve(prob3, ImplicitEuler(;autodiff, nlsolve=NLNewton(;always_new, check_div=false)); abstol) #always fails: DtLessThanMin
ref3 = solve(prob3, ImplicitEuler(;autodiff, nlsolve=NLNewton(;always_new, check_div=false)); abstol, dt, adaptive=false) #works

sol3 = solve(prob3, BackwardEuler(;autodiff, always_new); abstol, dt, adaptive=false) #works

plot(ref3; idxs=3)
plot!(sol3; idxs=3)

image

ChrisRackauckas commented 6 months ago

ImplicitEuler with adaptivity on still doesn't work, gives DtLessThanMin. I need to set reltol very high to get a solution which is then not stable.

Yes ImplicitEuler is first order so solving to a low tolerance is pretty infeasible and requires a really small dt.

sol3 = solve(prob3, BackwardEuler(;autodiff, always_new); abstol, dt, adaptive=false) #works

That's kind of a misnomer since it "works" because it's ignoring the error and not actually solving to tolerance. Only the nonlinear solver iterations are bounded, not the truncation error.

mtiller-jh commented 6 months ago

Just as a point of reference, I'd just like to present a different example as a different perspective on this issue. The problem that Brad is proposing is effectively:

$$\dot{x}+1000 x^2 = 100$$

From this equation (and this equation alone), we can determine what $x(t)$ is. My point is not that we can arrive at a closed form solution (at least I'm not aware of a close form solution for this form but it's possible one exists) but rather that all the information necessary is provided. Now, generally speaking, to arrive at a solution, we need to use a differential equation solver.

But what I'd just like to introduce mostly as a thought experiment is the idea that imagine there was a closed form solution here (that we could derive from the equation above) such that:

$$x(t) = f(x)$$

If that were the case and we could skip the numerical solution altogether, then what are the implications of adding the following relations:

$$ \begin{array} \ x(t) & = & f(x) \ xd(t) & = & \dot{x}(t) \ x{dd}(t) & = & \dot{x_d}(t) \end{array} $$

Because we know $x(t) = f(t)$, then we get:

$$ \begin{array} \ x(t) & = & f(x) \ xd(t) & = & f'(t) \ x{dd}(t) & = & f''(t) \end{array} $$

The key thing I want to point out here is that we aren't actually integrating anything, we are only differentiating. Now, imagine you plugged the equations above into ImplicitEuler. What would you expect it to do? There is nothing to integrate here. It seems to me that this is really no different than the problem @bradcarman is trying to solve. The key point here is that this is an index 2 DAE and in order to solve it you need to differentiate one of the equations (twice) in order to solve for all variables. As far as I know, ImplicitEuler is designed for semi-explicit DAEs at best (which are index 1).

The fact that @bradcarman can solve this by doing a backward Euler substitution seems to me just evidence that such a substitution is actually being used to differentiate in his case, not to integrate. In other words, it leads to this:

$$ \begin{array} \ x(t{i+1}) & = & f(x{i+1}) \ xd(t{i+1}) & = & \frac{x(t{i+1})-x(t)}{\delta t} \ x{dd}(t_{i+1}) & = & \frac{xd(t{i+1})-x_d(t)}{\delta t} \end{array} $$

...which is equivalent to:

$$ \begin{array} \ x(t{i+1}) & = & f(x{i+1}) \ xd(t{i+1}) & = & \frac{f(t_{i+1})-f(ti)}{\delta t} \ x{dd}(t{i+1}) & = & \frac{\frac{f(t{i+1})-f(t_i)}{\delta t}-\frac{f(ti)-f(t{i-1})}{\delta t}}{\delta t} \end{array} $$

My point here is that substituting backward Euler into an equation system isn't necessarily solving any differential equations. I'm not saying it doesn't "work", I'm just pointing out that it isn't necessarily accomplishing the same thing that ImplicitEuler is trying to accomplish.

bradcarman commented 4 months ago

As of DifferentialEquations v7.12.0 this is now working... Works with both ImplicitEuler() and default Rodas5P() and all others I tried.

Code with analytical comparison...

using DifferentialEquations

# F = d*dx + k*x^2 
function f(du,u,p,t)
    F, k, d = p
    x, dx, ddx = u

    du[1] = dx #D(x) ~ dx
    du[2] = ddx #D(dx) ~ ddx
    du[3] = (F) - (d*dx + k*x^2)
end

abstol = 1e-3
d=1
k=1000
F = 100

odef = ODEFunction(f; mass_matrix=[1 0 0;0 1 0;0 0 0])
prob = ODEProblem(odef, [0.0, F/d, 0], (0.0, 0.01), [F, k, d])
sol = solve(prob; abstol) # Success
sol′ = solve(prob, ImplicitEuler(); abstol) # Success

c₁ = 0.0
t = 0:0.0001:0.01
x(t) = (sqrt(F)/sqrt(k))*tanh((c₁*d*sqrt(F)*sqrt(k)+ sqrt(F)*sqrt(k)*t)/d)
dx(t) = ForwardDiff.derivative(x, t)
ddx(t) = ForwardDiff.derivative(dx, t)

fig = Figure(resolution=(1600,400))
ax = Axis(fig[1,1]; ylabel="x(t)", xlabel="t")
lines!(ax, t, x.(t))
scatter!(ax, sol.t, sol[1,:])

ax = Axis(fig[1,2]; ylabel="dx(t)", xlabel="t")
lines!(ax, t, dx.(t))
scatter!(ax, sol.t, sol[2,:])

ax = Axis(fig[1,3]; ylabel="ddx(t)", xlabel="t")
lines!(ax, t, ddx.(t))
scatter!(ax, sol.t, sol[3,:])
fig

image