DiffEqNoiseProcess.jl: Noise Processes for Stochastic Modeling
Noise processes are essential in continuous stochastic modeling. The NoiseProcess
types are distributionally-exact, meaning they are not solutions of stochastic differential equations but instead are directly generated according to their analytical distributions. These processes are used as the noise term in the SDE and RODE solvers. Additionally, the noise processes themselves can be simulated and solved using the DiffEq common interface (including the Monte Carlo interface).
Installation
To install DiffEqNoiseProcess.jl, use the Julia package manager:
using Pkg
Pkg.add("DiffEqNoiseProcess")
Using Noise Processes
Passing a Noise Process to a Problem Type
AbstractNoiseProcess
es can be passed directly to the problem types to replace the standard Wiener process (Brownian motion) with your choice of noise. To do this, simply construct the noise and pass it to the noise
keyword argument:
using DiffEqNoiseProcess, SciMLBase
μ = 1.0
σ = 2.0
W = GeometricBrownianMotionProcess(μ, σ, 0.0, 1.0, 1.0)
# ...
# Define f,g,u0,tspan for a SDEProblem
# ...
# prob = SDEProblem(f, g, u0, tspan, noise = W)
t: 1-element Vector{Float64}:
0.0
u: 1-element Vector{Float64}:
1.0
Basic Interface
The NoiseProcess
acts like a DiffEq solution. For some noise process W
, you can get its i
th timepoint like W[i]
and the associated time W.t[i]
. If the NoiseProcess
has a bridging distribution defined, it can be interpolated to arbitrary time points using W(t)
. Note that every interpolated value is saved to the NoiseProcess
so that way it can stay distributionally correct. A plot recipe is provided that plots the timeseries.
Direct Simulation of the Noise Process
Since the NoiseProcess
types are distribution-exact and do not require the stochastic differential equation solvers, many times one would like to directly simulate trajectories from these processes. The NoiseProcess
has a NoiseProblem
type:
NoiseProblem(noise, tspan)
for which solve
works. For example, we can simulate a distributionally-exact Geometric Brownian Motion solution by:
μ = 1.0
σ = 2.0
W = GeometricBrownianMotionProcess(μ, σ, 0.0, 1.0, 1.0)
prob = NoiseProblem(W, (0.0, 1.0))
sol = solve(prob; dt = 0.1)
t: 11-element Vector{Float64}:
0.0
0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7
0.7999999999999999
0.8999999999999999
0.9999999999999999
u: 11-element Vector{Float64}:
1.0
0.35780197326522667
0.4348999339664691
0.863095976540253
0.721343883676095
0.9918015328349641
1.5322519972377155
2.3633665747003687
2.2858217549713307
3.7992226530702067
3.3100935963748013
solve
requires that the dt
is given, and that the solution it returns is a NoiseProcess
which has stepped through the timespan. Because this follows the common interface, all of the normal functionality works. For example, we can use the Monte Carlo functionality as follows:
enprob = EnsembleProblem(prob)
sol = solve(enprob; dt = 0.1, trajectories = 100)
EnsembleSolution Solution of length 100 with uType:
NoiseProcess{Float64, 1, Float64, Float64, Float64, Vector{Float64}, DiffEqNoiseProcess.GeometricBrownianMotion{Float64, Float64}, DiffEqNoiseProcess.var"#34#35"{DiffEqNoiseProcess.GeometricBrownianMotion{Float64, Float64}}, Nothing, false, ResettableStacks.ResettableStack{Tuple{Float64, Float64, Float64}, false}, ResettableStacks.ResettableStack{Tuple{Float64, Float64, Float64}, false}, RSWM{Float64}, Nothing, RandomNumbers.Xorshifts.Xoroshiro128Plus}
simulates 100 Geometric Brownian Motions.
Direct Interface
Most of the time, a NoiseProcess
is received from the solution of a stochastic or random differential equation, in which case sol.W
gives the NoiseProcess
and it is already defined along some timeseries. In other cases, NoiseProcess
types are directly simulated (see below). However, NoiseProcess
types can also be directly acted on. The basic functionality is given by calculate_step!
to calculate a future time point, and accept_step!
to accept the step. If steps are rejected, the Rejection Sampling with Memory algorithm is applied to keep the solution distributionally exact. This kind of stepping is done via:
W = WienerProcess(0.0, 1.0, 1.0)
dt = 0.1
W.dt = dt
u = nothing;
p = nothing; # for state-dependent distributions
calculate_step!(W, dt, u, p)
for i in 1:10
accept_step!(W, dt, u, p)
end
Contributing
Please refer to the SciML ColPrac: Contributor's Guide on Collaborative Practices for Community Packages for guidance on PRs, issues, and other matters relating to contributing to SciML.
See the SciML Style Guide for common coding practices and other style decisions.
There are a few community forums:
- The #diffeq-bridged and #sciml-bridged channels in the Julia Slack
- The #diffeq-bridged and #sciml-bridged channels in the Julia Zulip
- On the Julia Discourse forums
- See also SciML Community page
Reproducibility
The documentation of this SciML package was built using these direct dependencies,
Status `~/work/DiffEqNoiseProcess.jl/DiffEqNoiseProcess.jl/docs/Project.toml`
[77a26b50] DiffEqNoiseProcess v5.24.1 `~/work/DiffEqNoiseProcess.jl/DiffEqNoiseProcess.jl`
[e30172f5] Documenter v1.10.2
[0bca4576] SciMLBase v2.86.2
and using this machine and Julia version.
Julia Version 1.11.5
Commit 760b2e5b739 (2025-04-14 06:53 UTC)
Build Info:
Official https://julialang.org/ release
Platform Info:
OS: Linux (x86_64-linux-gnu)
CPU: 4 × AMD EPYC 7763 64-Core Processor
WORD_SIZE: 64
LLVM: libLLVM-16.0.6 (ORCJIT, znver3)
Threads: 1 default, 0 interactive, 1 GC (on 4 virtual cores)
A more complete overview of all dependencies and their versions is also provided.
Status `~/work/DiffEqNoiseProcess.jl/DiffEqNoiseProcess.jl/docs/Manifest.toml`
[47edcb42] ADTypes v1.14.0
[a4c015fc] ANSIColoredPrinters v0.0.1
[1520ce14] AbstractTrees v0.4.5
[7d9f7c33] Accessors v0.1.42
[79e6a3ab] Adapt v4.3.0
[66dad0bd] AliasTables v1.1.3
[4fba245c] ArrayInterface v7.18.0
[62783981] BitTwiddlingConvenienceFunctions v0.1.6
[2a0fbf3d] CPUSummary v0.2.6
[fb6a15b2] CloseOpenIntervals v0.1.13
[944b1d66] CodecZlib v0.7.8
[38540f10] CommonSolve v0.2.4
[bbf7d656] CommonSubexpressions v0.3.1
[f70d9fcc] CommonWorldInvalidations v1.0.0
[34da2185] Compat v4.16.0
[a33af91c] CompositionsBase v0.1.2
[2569d6c7] ConcreteStructs v0.2.3
[187b0558] ConstructionBase v1.5.8
[adafc99b] CpuId v0.3.1
[a8cc5b0e] Crayons v4.1.1
[9a962f9c] DataAPI v1.16.0
[864edb3b] DataStructures v0.18.22
[e2d170a0] DataValueInterfaces v1.0.0
[2b5f629d] DiffEqBase v6.171.0
[77a26b50] DiffEqNoiseProcess v5.24.1 `~/work/DiffEqNoiseProcess.jl/DiffEqNoiseProcess.jl`
[163ba53b] DiffResults v1.1.0
[b552c78f] DiffRules v1.15.1
[a0c0ee7d] DifferentiationInterface v0.6.52
[31c24e10] Distributions v0.25.119
[ffbed154] DocStringExtensions v0.9.4
[e30172f5] Documenter v1.10.2
[4e289a0a] EnumX v1.0.5
[f151be2c] EnzymeCore v0.8.8
[e2ba6199] ExprTools v0.1.10
[55351af7] ExproniconLite v0.10.14
[7034ab61] FastBroadcast v0.3.5
[9aa1b823] FastClosures v0.3.2
[a4df4552] FastPower v1.1.2
[1a297f60] FillArrays v1.13.0
[6a86dc24] FiniteDiff v2.27.0
[f6369f11] ForwardDiff v1.0.1
[069b7b12] FunctionWrappers v1.1.3
[77dc65aa] FunctionWrappersWrappers v0.1.3
[46192b85] GPUArraysCore v0.2.0
[d7ba0133] Git v1.3.1
[34004b35] HypergeometricFunctions v0.3.28
[b5f81e59] IOCapture v0.2.5
[615f187c] IfElse v0.1.1
[3587e190] InverseFunctions v0.1.17
[92d709cd] IrrationalConstants v0.2.4
[82899510] IteratorInterfaceExtensions v1.0.0
[692b3bcd] JLLWrappers v1.7.0
[682c06a0] JSON v0.21.4
[ae98c720] Jieko v0.2.1
[b964fa9f] LaTeXStrings v1.4.0
[10f19ff3] LayoutPointers v0.1.17
[0e77f7df] LazilyInitializedFields v1.3.0
[d3d80556] LineSearches v7.3.0
[2ab3a3ac] LogExpFunctions v0.3.29
[1914dd2f] MacroTools v0.5.16
[d125e4d3] ManualMemory v0.1.8
[d0879d2d] MarkdownAST v0.1.2
[e1d29d7a] Missings v1.2.0
[2e0e35c7] Moshi v0.3.5
[46d2c3a1] MuladdMacro v0.2.4
[d41bc354] NLSolversBase v7.9.1
[77ba4419] NaNMath v1.1.3
[429524aa] Optim v1.12.0
[bac558e1] OrderedCollections v1.8.0
[90014a1f] PDMats v0.11.34
[d96e819e] Parameters v0.12.3
[69de0a69] Parsers v2.8.3
[e409e4f3] PoissonRandom v0.4.4
[f517fe37] Polyester v0.7.16
[1d0040c9] PolyesterWeave v0.2.2
[85a6dd25] PositiveFactorizations v0.2.4
⌅ [aea7be01] PrecompileTools v1.2.1
[21216c6a] Preferences v1.4.3
[08abe8d2] PrettyTables v2.4.0
[43287f4e] PtrArrays v1.3.0
[1fd47b50] QuadGK v2.11.2
[74087812] Random123 v1.7.0
[e6cf234a] RandomNumbers v1.6.0
[3cdcf5f2] RecipesBase v1.3.4
[731186ca] RecursiveArrayTools v3.33.0
[189a3867] Reexport v1.2.2
[2792f1a3] RegistryInstances v0.1.0
[ae029012] Requires v1.3.1
[ae5879a3] ResettableStacks v1.1.1
[79098fc4] Rmath v0.8.0
[7e49a35a] RuntimeGeneratedFunctions v0.5.14
[94e857df] SIMDTypes v0.1.0
[0bca4576] SciMLBase v2.86.2
[c0aeaf25] SciMLOperators v0.3.14
[53ae85a6] SciMLStructures v1.7.0
[efcf1570] Setfield v1.1.2
[a2af1166] SortingAlgorithms v1.2.1
[276daf66] SpecialFunctions v2.5.1
[aedffcd0] Static v1.2.0
[0d7ed370] StaticArrayInterface v1.8.0
[90137ffa] StaticArrays v1.9.13
[1e83bf80] StaticArraysCore v1.4.3
[10745b16] Statistics v1.11.1
[82ae8749] StatsAPI v1.7.0
[2913bbd2] StatsBase v0.34.5
[4c63d2b9] StatsFuns v1.5.0
[7792a7ef] StrideArraysCore v0.5.7
[892a3eda] StringManipulation v0.4.1
[2efcf032] SymbolicIndexingInterface v0.3.40
[3783bdb8] TableTraits v1.0.1
[bd369af6] Tables v1.12.0
[8290d209] ThreadingUtilities v0.5.3
[3bb67fe8] TranscodingStreams v0.11.3
[781d530d] TruncatedStacktraces v1.4.0
[3a884ed6] UnPack v1.0.2
[2e619515] Expat_jll v2.6.5+0
[f8c6e375] Git_jll v2.49.0+0
[94ce4f54] Libiconv_jll v1.18.0+0
[458c3c95] OpenSSL_jll v3.5.0+0
[efe28fd5] OpenSpecFun_jll v0.5.6+0
[f50d1b31] Rmath_jll v0.5.1+0
[0dad84c5] ArgTools v1.1.2
[56f22d72] Artifacts v1.11.0
[2a0f44e3] Base64 v1.11.0
[ade2ca70] Dates v1.11.0
[8ba89e20] Distributed v1.11.0
[f43a241f] Downloads v1.6.0
[7b1f6079] FileWatching v1.11.0
[9fa8497b] Future v1.11.0
[b77e0a4c] InteractiveUtils v1.11.0
[b27032c2] LibCURL v0.6.4
[76f85450] LibGit2 v1.11.0
[8f399da3] Libdl v1.11.0
[37e2e46d] LinearAlgebra v1.11.0
[56ddb016] Logging v1.11.0
[d6f4376e] Markdown v1.11.0
[a63ad114] Mmap v1.11.0
[ca575930] NetworkOptions v1.2.0
[44cfe95a] Pkg v1.11.0
[de0858da] Printf v1.11.0
[3fa0cd96] REPL v1.11.0
[9a3f8284] Random v1.11.0
[ea8e919c] SHA v0.7.0
[9e88b42a] Serialization v1.11.0
[6462fe0b] Sockets v1.11.0
[2f01184e] SparseArrays v1.11.0
[f489334b] StyledStrings v1.11.0
[4607b0f0] SuiteSparse
[fa267f1f] TOML v1.0.3
[a4e569a6] Tar v1.10.0
[8dfed614] Test v1.11.0
[cf7118a7] UUIDs v1.11.0
[4ec0a83e] Unicode v1.11.0
[e66e0078] CompilerSupportLibraries_jll v1.1.1+0
[deac9b47] LibCURL_jll v8.6.0+0
[e37daf67] LibGit2_jll v1.7.2+0
[29816b5a] LibSSH2_jll v1.11.0+1
[c8ffd9c3] MbedTLS_jll v2.28.6+0
[14a3606d] MozillaCACerts_jll v2023.12.12
[4536629a] OpenBLAS_jll v0.3.27+1
[05823500] OpenLibm_jll v0.8.5+0
[efcefdf7] PCRE2_jll v10.42.0+1
[bea87d4a] SuiteSparse_jll v7.7.0+0
[83775a58] Zlib_jll v1.2.13+1
[8e850b90] libblastrampoline_jll v5.11.0+0
[8e850ede] nghttp2_jll v1.59.0+0
[3f19e933] p7zip_jll v17.4.0+2
Info Packages marked with ⌅ have new versions available but compatibility constraints restrict them from upgrading. To see why use `status --outdated -m`
You can also download the manifest file and the project file.