Skip to content

Commit 9151cae

Browse files
reykboerneroameye
andauthored
Using new CoupledSDEs from DynamicalSystemsBase (#116)
* load CoupledSDEs from DynamicalSystemsBase v3.11 * worked on compatibility with new CoupledSDEs * updated LDT functions, made om_action require noise_strength input * export functions from StochasticSystemsBase * worked on updating tests * CoupledSDEs test's * try out new format action * turn on all tests * format * fix downgrade compat up JET compat fix downgrade compat? fix downgrade compat? fix downgrade compat? up StochasticDiffEq compat * better format CI try another format github action turn on formatter in PR * update code example in README * fixed Large Deviations tests by normalizing covariance matrix * updated simulation functions * added simulation tests * removed 'simulate', renamed 'relax' to 'deterministic_orbit' * tried to fix docs, still not finding docstrings from DynamicalSystemsBase * add stochasticSystemsBase do docs modules * fixed typo in makedocs * exported missing functions, removed unneeded dep * worked on fixing docs errors * added dependency to docs * added another dep to docs * updated changelog to v0.4.0 * fixed errors in docstrings --------- Co-authored-by: Orjan Ameye <orjan.ameye@hotmail.com>
1 parent 1d610aa commit 9151cae

39 files changed

+377
-716
lines changed

CHANGELOG.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,27 @@
11
# Changelog for `CriticalTransitions.jl`
22

3+
## v0.4.0
4+
New `CoupledSDEs` design
5+
6+
This release upgrades CriticalTransitions.jl to be compatible with the re-design of `CoupledSDEs`, which has now been integrated in [`DynamicalSystemsBase.jl v3.11`](https://juliadynamics.github.io/DynamicalSystemsBase.jl/stable/CoupledSDEs/).
7+
8+
Since we have updated the syntax of defining a `CoupledSDEs` system, this is a breaking change.
9+
10+
#### Changed functions
11+
- `CoupledSDEs` is now constructed with different args and kwargs
12+
- `fw_action`, `geometric_action` and `om_action` now normalize the covariance matrix when computing the action functional
13+
- `noise_strength` is not a function anymore but a kwarg for `CoupledSDEs` and other functions
14+
- `om_action` now requires `noise_strength` as input argument
15+
- `relax` was renamed to `deterministic_orbit`
16+
- `trajectory` has been added to replace `simulate`
17+
18+
#### Deprecations
19+
- `add_noise_strength`, `idfunc` and `idfunc!` are no longer needed and have been removed
20+
- the function `noise_strength(::CoupledSDEs)` has been removed
21+
- `simulate` has been removed
22+
23+
Full changelog [here](https://github.com/JuliaDynamics/CriticalTransitions.jl/compare/v0.3.0...v0.4.0).
24+
325
## v0.3.0
426
Major overhaul introducing `CoupledSDEs`
527

Project.toml

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name = "CriticalTransitions"
22
uuid = "251e6cd3-3112-48a5-99dd-66efcfd18334"
33
authors = ["Reyk Börner, Ryan Deeley, Raphael Römer, Orjan Ameye"]
44
repo = "https://github.com/juliadynamics/CriticalTransitions.jl.git"
5-
version = "0.3.0"
5+
version = "0.4.0"
66

77
[deps]
88
Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"
@@ -29,6 +29,7 @@ StochasticDiffEq = "789caeaf-c7a9-5a7d-9973-96adeb23e2a0"
2929
Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7"
3030

3131
[weakdeps]
32+
StateSpaceSets = "40b095a5-5852-4c12-98c7-d43bf788e795"
3233
Attractors = "f3fd9213-ca85-4dba-9dfd-7fc91308fec7"
3334
ChaosTools = "608a59af-f2a3-5ad4-90b4-758bdf3122a7"
3435

@@ -38,31 +39,32 @@ CoupledSDEsBaisin = ["ChaosTools", "Attractors"]
3839

3940
[compat]
4041
Aqua = "0.8.7"
41-
Attractors = "1.18"
42-
ChaosTools = "3.1"
42+
Attractors = "1.19.12"
43+
ChaosTools = "3.2.1"
4344
Dates = ">=1.9.0"
4445
Dierckx = "0.5.3"
4546
DiffEqNoiseProcess = "5.22"
4647
DocStringExtensions = "0.9.3"
4748
Documenter = "^1.4.1"
48-
DynamicalSystemsBase = "3.7.1"
49+
DynamicalSystemsBase = "3.11.1"
4950
ExplicitImports = "1.9"
5051
Format = "1"
5152
ForwardDiff = "0.10.36"
5253
HDF5 = "0.17.1"
5354
IntervalArithmetic = "0.20"
54-
JET = "0.9"
55+
JET = "0.9.9"
5556
JLD2 = "0.4.46"
5657
Markdown = ">=1.9.0"
5758
ModelingToolkit = "9.25"
5859
Optim = "1.9.3"
59-
OrdinaryDiffEq = "6.82"
60+
OrdinaryDiffEq = "6.89"
6061
ProgressBars = "1.5.1"
6162
ProgressMeter = "1.10.0"
6263
Reexport = "1.2.2"
64+
StateSpaceSets = "2.1.2"
6365
StaticArrays = "1.9.3"
6466
Statistics = ">=1.9"
65-
StochasticDiffEq = "6.65.1"
67+
StochasticDiffEq = "6.69"
6668
Symbolics = "5.32"
6769
julia = "1.9"
6870

README.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,22 +26,22 @@ function fitzhugh_nagumo(u, p, t)
2626
dx = (-α * x^3 + γ * x - κ * y + I) / ϵ
2727
dy = -β * y + x
2828

29-
return SA[dx, dy]
29+
return SVector{2}([dx, dy])
3030
end
3131

3232
# System parameters
33-
p = [1., 3., 1., 1., 1., 0.]
33+
params = [1., 3., 1., 1., 1., 0.]
3434
noise_strength = 0.02
35+
initial_state = zeros(2)
3536

3637
# Define stochastic system
37-
sys = CoupledSDEs(fitzhugh_nagumo, id_func, zeros(2), p, noise_strength)
38+
sys = CoupledSDEs(fitzhugh_nagumo, initial_state, params; noise_strength)
3839

39-
# Get stable fixed points
40-
fps, eigs, stab = fixedpoints(sys, [-2,-2], [2,2])
41-
fp1, fp2 = fps[stab]
40+
# Run a sample trajectory
41+
traj = trajectory(sys, 10.0)
4242

43-
# Generate noise-induced transition from one fixed point to the other
44-
path, times, success = transition(sys, fp1, fp2)
43+
# Compute minimum action path using gMAM algorithm
44+
instanton = geometric_min_action_method(sys, initial_state, current_state(sys))
4545

4646
# ... and more, check out the documentation!
4747
```

docs/Project.toml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
[deps]
22
Attractors = "f3fd9213-ca85-4dba-9dfd-7fc91308fec7"
33
CairoMakie = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0"
4-
Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80"
54
ChaosTools = "608a59af-f2a3-5ad4-90b4-758bdf3122a7"
65
CriticalTransitions = "251e6cd3-3112-48a5-99dd-66efcfd18334"
6+
DiffEqNoiseProcess = "77a26b50-5914-5dd7-bc55-306e6241c503"
77
Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4"
88
DocumenterCitations = "daee34ce-89f3-4625-b898-19384cb65244"
99
DocumenterInterLinks = "d12716ef-a0f6-4df4-a9f1-a5a34e75c656"
10+
DynamicalSystemsBase = "6e36e845-645a-534a-86f2-f5d4aa5a06b4"
11+
Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80"
1012
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
11-
13+
StochasticDiffEq = "789caeaf-c7a9-5a7d-9973-96adeb23e2a0"
1214

1315
[compat]
1416
Documenter = "1"

docs/make.jl

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ using DocumenterInterLinks
44
using Pkg
55

66
using CriticalTransitions, ChaosTools, Attractors
7+
using DynamicalSystemsBase
78

89
project_toml = Pkg.TOML.parsefile(joinpath(@__DIR__, "..", "Project.toml"))
910
package_version = project_toml["version"]
@@ -45,12 +46,14 @@ makedocs(;
4546
CriticalTransitions.DiffEqNoiseProcess,
4647
Base.get_extension(CriticalTransitions, :ChaosToolsExt),
4748
Base.get_extension(CriticalTransitions, :CoupledSDEsBaisin),
49+
DynamicalSystemsBase,
50+
Base.get_extension(DynamicalSystemsBase, :StochasticSystemsBase)
4851
],
4952
doctest=false,
5053
format=Documenter.HTML(; html_options...),
51-
warnonly=[:missing_docs],
54+
warnonly=[:missing_docs, :linkcheck, :cross_references],
5255
pages=pages,
5356
plugins=[bib, links],
5457
)
5558

56-
deploydocs(; repo="github.com/JuliaDynamics/CriticalTransitions.jl.git", push_preview=false)
59+
deploydocs(; repo="github.com/JuliaDynamics/CriticalTransitions.jl.git", push_preview=false)

docs/pages.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ pages = [
55
"Tutorial" => "tutorial.md",
66
"Manual" => Any[
77
"Define a CoupledSDEs system" => "man/CoupledSDEs.md",
8-
"Stability analysis" => "man/systemanalysis.md",
8+
#"Stability analysis" => "man/systemanalysis.md",
99
"Simulating the system" => "man/simulation.md",
1010
"Sampling transitions" => "man/sampling.md",
1111
"Large deviation theory" => "man/largedeviations.md",

docs/src/index.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,9 @@ Building on [DynamicalSystems.jl](https://juliadynamics.github.io/DynamicalSyste
77
![CT.jl infographic](./figs/CTjl_structure_v0.3_small.jpeg)
88

99
!!! info "Current features"
10-
* **Stability analysis**: Fixed points, linear stability, basins of attraction, edge tracking
11-
* **Stochastic simulation**: Gaussian noise, uncorrelated and correlated, additive and multiplicative
12-
* **Transition path sampling**: Ensemble sampling by direct simulation and Pathspace Langevin MCMC
13-
* **Large deviation theory**: Action functionals and minimization algorithms (MAM, gMAM)
10+
* **Stochastic simulation** made easy: Gaussian noise, uncorrelated and correlated, additive and multiplicative
11+
* **Transition path sampling**: Parallelized ensemble rejection sampling
12+
* **Large deviation theory** tools: Action functionals and minimization algorithms (MAM, gMAM)
1413

1514
!!! ukw "Planned features"
1615
* **Rare event simulation**: importance sampling, AMS

docs/src/man/CoupledSDEs.md

Lines changed: 67 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,125 +1,118 @@
11
# Define a CoupledSDEs system
22

3-
A `CoupledSDEs` defines a stochastic dynamical system of the form
4-
5-
```math
6-
\text{d}\vec x = f(\vec x(t); \ p) \text{d}t + \sigma (\vec x(t); \ p) \, \text{d}\mathcal{W} \ ,
3+
```@docs
4+
CoupledSDEs
75
```
8-
where $\vec x \in \mathbb{R}^\text{D}$, $\sigma > 0$ is the noise strength, $\text{d}\mathcal{W}=\Gamma \cdot \text{d}\mathcal{N}$, and $\mathcal N$ denotes a stochastic process. The (positive definite) noise covariance matrix is $\Sigma = \Gamma \Gamma^\top \in \mathbb R^{N\times N}$.
9-
10-
The function $f$ is the deterministic part of the system and follows the syntax of a `ContinuousTimeDynamicalSystem` in [DynamicalSystems.jl](https://juliadynamics.github.io/DynamicalSystems.jl/latest/tutorial/), i.e., `f(u, p, t)` for out-of-place (oop) and `f!(du, u, p, t)` for in-place (iip). The function $g$ allows to specify the stochastic dynamics of the system along with the [noise process](#noise-process) $\mathcal{W}$. It should be of the same type (iip or oop) as $f$.
11-
12-
By combining $\sigma$, $g$ and $\mathcal{W}$, you can define different type of stochastic systems. Examples of different types of stochastic systems can be found on the [StochasticDiffEq.jl tutorial page](https://docs.sciml.ai/DiffEqDocs/stable/tutorials/sde_example/). A quick overview of common types of stochastic systems can be found [below](#Type-of-stochastic-system).
136

147
!!! info
158
Note that nonlinear mixings of the Noise Process $\mathcal{W}$ fall into the class of random ordinary differential equations (RODEs) which have a separate set of solvers. See [this example](https://docs.sciml.ai/DiffEqDocs/stable/tutorials/rode_example/) of DifferentialEquations.jl.
169

17-
```@docs
18-
CoupledSDEs
19-
```
2010

21-
## Defining stochastic dynamics
11+
## [Examples: Defining stochastic dynamics](@id defining-stochastic-dynamics)
12+
2213
Let's look at some examples of the different types of stochastic systems that can be defined.
2314

2415
For simplicity, we choose a slow exponential growth in 2 dimensions as the deterministic dynamics `f`:
2516
```@example type
26-
using CriticalTransitions, Plots
17+
using DynamicalSystemsBase, StochasticDiffEq, DiffEqNoiseProcess
18+
using CairoMakie
2719
import Random # hide
2820
Random.seed!(10) # hide
2921
f!(du, u, p, t) = du .= 1.01u # deterministic part
30-
σ = 0.25 # noise strength
22+
23+
function plot_trajectory(Y, t)
24+
fig = Figure()
25+
ax = Axis(fig[1,1]; xlabel = "time", ylabel = "variable")
26+
for var in columns(Y)
27+
lines!(ax, t, var)
28+
end
29+
fig
30+
end;
3131
```
32-
### Additive noise
33-
When `g \, \text{d}\mathcal{W}` is independent of the state variables `u`, the noise is called additive.
3432

35-
#### Diagonal noise
36-
A system of diagonal noise is the most common type of noise. It is defined by a vector of random numbers `dW` whose size matches the output of `g` where the noise is applied element-wise, i.e. `g.*dW`.
33+
### Additive noise
34+
When $g(u, p, t)$ is independent of the state $u$, the noise is called additive; otherwise, it is multiplicative.
35+
We can define a simple additive noise system as follows:
36+
```@example type
37+
sde = CoupledSDEs(f!, zeros(2));
38+
```
39+
which is equivalent to
3740
```@example type
3841
t0 = 0.0; W0 = zeros(2);
3942
W = WienerProcess(t0, W0, 0.0)
40-
sde = CoupledSDEs(f!, idfunc!, zeros(2), nothing, σ; noise=W)
43+
sde = CoupledSDEs(f!, zeros(2);
44+
noise_process=W, covariance=[1 0; 0 1], noise_strength=1.0
45+
);
4146
```
42-
or equivalently
47+
We defined a Wiener process `W`, whose increments are vectors of normally distributed random numbers of length matching the output of `g`. The noise is applied element-wise, i.e., `g.*dW`. Since the noise processes are uncorrelated, meaning the covariance matrix is diagonal, this type of noise is referred to as diagonal.
48+
49+
We can sample a trajectory from this system using the `trajectory` function also used for the deterministic systems:
4350
```@example type
44-
sde = CoupledSDEs(f!, idfunc!, zeros(2), nothing, σ)
51+
tr = trajectory(sde, 1.0)
52+
plot_trajectory(tr...)
4553
```
46-
where we used the helper function
47-
```@docs
48-
idfunc!
49-
idfunc
54+
55+
#### Correlated noise
56+
In the case of correlated noise, the random numbers in a vector increment `dW` are correlated. This can be achieved by specifying the covariance matrix $\Sigma$ via the `covariance` keyword:
57+
```@example type
58+
ρ = 0.3
59+
Σ = [1 ρ; ρ 1]
60+
diffeq = (alg = LambaEM(), dt=0.1)
61+
sde = CoupledSDEs(f!, zeros(2); covariance=Σ, diffeq=diffeq)
5062
```
51-
The vector `dW` is by default zero mean white gaussian noise $\mathcal{N}(0, \text{d}t)$ where the variance is the timestep $\text{d}t$ unit variance (Wiener Process).
63+
Alternatively, we can parametrise the covariance matrix by defining the diffusion function $g$ ourselves:
5264
```@example type
53-
sol = simulate(sde, 1.0, dt=0.01, alg=SOSRA())
54-
plot(sol)
65+
g!(du, u, p, t) = (du .= [1 p[1]; p[1] 1]; return nothing)
66+
sde = CoupledSDEs(f!, zeros(2), (ρ); g=g!, noise_prototype=zeros(2, 2))
5567
```
68+
Here, we had to provide `noise_prototype` to indicate that the diffusion function `g` will output a 2x2 matrix.
5669

5770
#### Scalar noise
58-
Scalar noise is where a single random variable is applied to all dependent variables. To do this, one has to give the noise process to the `noise` keyword of the `CoupledSDEs` constructor. A common example is the Wiener process starting at `W0=0.0` at time `t0=0.0`.
59-
71+
If all state variables are forced by the same single random variable, we have scalar noise.
72+
To define scalar noise, one has to give an one-dimensional noise process to the `noise_process` keyword of the `CoupledSDEs` constructor.
6073
```@example type
6174
t0 = 0.0; W0 = 0.0;
6275
noise = WienerProcess(t0, W0, 0.0)
63-
sde = CoupledSDEs(f!, idfunc!, rand(2)./10, nothing, σ; noise=noise)
64-
sol = simulate(sde, 1.0, dt=0.01, alg=SOSRA())
65-
plot(sol)
76+
sde = CoupledSDEs(f!, rand(2)/10; noise_process=noise)
77+
78+
tr = trajectory(sde, 1.0)
79+
plot_trajectory(tr...)
6680
```
67-
### Multiplicative noise
68-
Multiplicative Noise is when $g_i(t, u)=a_i u$
81+
We can see that noise applied to each variable is the same.
82+
83+
### Multiplicative and time-dependent noise
84+
In the SciML ecosystem, multiplicative noise is defined through the condition $g_i(t, u)=a_i u$. However, in the literature the name is more broadly used for any situation where the noise is non-additive and depends on the state $u$, possibly also in a non-linear way. When defining a `CoupledSDEs`, we can make the noise term time- and state-dependent by specifying an explicit time- or state-dependence in the noise function `g`, just like we would define `f`. For example, we can define a system with temporally decreasing multiplicative noise as follows:
6985
```@example type
70-
function g(du, u, p, t)
71-
du[1] = σ*u[1]
72-
du[2] = σ*u[2]
86+
function g!(du, u, p, t)
87+
du .= u ./ (1+t)
7388
return nothing
7489
end
75-
sde = CoupledSDEs(f!, g, rand(2)./10)
76-
sol = simulate(sde, 1.0, dt=0.01, alg=SOSRI())
77-
plot(sol)
90+
sde = CoupledSDEs(f!, rand(2)./10; g=g!)
7891
```
7992

8093
#### Non-diagonal noise
81-
Non-diagonal noise allows for the terms to linearly mixed via g being a matrix. Suppose we have two Wiener processes and two dependent random variables such that the output of `g` is a 2x2 matrix. Therefore, we have
94+
Non-diagonal noise allows for the terms to be linearly mixed (correlated) via `g` being a matrix. Suppose we have two Wiener processes and two state variables such that the output of `g` is a 2x2 matrix. Therefore, we have
8295
```math
8396
du_1 = f_1(u,p,t)dt + g_{11}(u,p,t)dW_1 + g_{12}(u,p,t)dW_2 \\
8497
du_2 = f_2(u,p,t)dt + g_{21}(u,p,t)dW_1 + g_{22}(u,p,t)dW_2
8598
```
86-
To indicate the structure that `g` should have, we can use the `noise_rate_prototype` keyword. Let us define a special type of non-diagonal noise called commutative noise. For this we can utilize the `RKMilCommute` algorithm which is designed to utilise the structure of commutative noise.
99+
To indicate the structure that `g` should have, we must use the `noise_prototype` keyword. Let us define a special type of non-diagonal noise called commutative noise. For this we can utilize the `RKMilCommute` algorithm which is designed to utilize the structure of commutative noise.
87100

88101
```@example type
89-
function g(du, u, p, t)
102+
σ = 0.25 # noise strength
103+
function g!(du, u, p, t)
90104
du[1,1] = σ*u[1]
91105
du[2,1] = σ*u[2]
92106
du[1,2] = σ*u[1]
93107
du[2,2] = σ*u[2]
94108
return nothing
95109
end
96-
sde = CoupledSDEs(f!, g, rand(2)./10, noise_rate_prototype = zeros(2, 2))
97-
sol = simulate(sde, 1.0, dt=0.01, alg=RKMilCommute())
98-
plot(sol)
110+
diffeq = (alg = RKMilCommute(), reltol = 1e-3, abstol = 1e-3, dt=0.1)
111+
sde = CoupledSDEs(f!, rand(2)./10; g=g!, noise_prototype = zeros(2, 2), diffeq = diffeq)
99112
```
100113

101114
!!! warning
102-
Non-diagonal problems need specific type of solvers. See the [SciML recommendations](https://docs.sciml.ai/DiffEqDocs/stable/solvers/sde_solve/#sde_solve).
103-
104-
### Correlated noise
105-
```@example type
106-
ρ = 0.3
107-
Σ = [1 ρ; ρ 1]
108-
t0 = 0.0; W0 = zeros(2); Z0 = zeros(2);
109-
W = CorrelatedWienerProcess(Σ, t0, W0, Z0)
110-
sde = CoupledSDEs(f!, idfunc!, zeros(2), nothing, σ; noise=W)
111-
sol = simulate(sde, 1.0, dt=0.01, alg=SOSRA())
112-
plot(sol)
113-
```
114-
115-
## Available noise processes
116-
We provide the noise processes $\mathcal{W}$ that can be used in the stochastic simulations through the [DiffEqNoiseProcess.jl](https://docs.sciml.ai/DiffEqNoiseProcess/stable) package. A complete list of the available processes can be found [here](https://docs.sciml.ai/DiffEqNoiseProcess/stable/noise_processes/). We list some of the most common ones below:
117-
```@docs
118-
WienerProcess
119-
SimpleWienerProcess
120-
OrnsteinUhlenbeckProcess
121-
CorrelatedWienerProcess
122-
```
115+
Non-diagonal problems need specific solvers. See the [SciML recommendations](https://docs.sciml.ai/DiffEqDocs/stable/solvers/sde_solve/#sde_solve).
123116

124117
## Interface to `DynamicalSystems.jl`
125118
#### Converting between `CoupledSDEs` and `CoupledODEs`
@@ -128,8 +121,8 @@ CorrelatedWienerProcess
128121
The deterministic part of a [`CoupledSDEs`](@ref) system can easily be extracted as a
129122
[`CoupledODEs`](https://juliadynamics.github.io/DynamicalSystems.jl/dev/tutorial/#DynamicalSystemsBase.CoupledODEs), a common subtype of a `ContinuousTimeDynamicalSystem` in DynamicalSystems.jl.
130123

131-
- `CoupledODEs(sde::CoupledSDEs)` extracts the deterministic part of `sde` as a `CoupledODEs`
132-
- `CoupledSDEs(ode::CoupledODEs, g)`, with `g` the noise function, turns `ode` into a `CoupledSDEs`
124+
- `CoupledODEs(sde::CoupledSDEs)` extracts the deterministic part of `sde` as a `CoupledODEs`.
125+
- `CoupledSDEs(ode::CoupledODEs; kwargs)` turns `ode` into a `CoupledSDEs`.
133126

134127
```@docs
135128
CoupledODEs
@@ -152,6 +145,8 @@ function fitzhugh_nagumo(u, p, t)
152145
return SA[dx, dy]
153146
end
154147

155-
sys = CoupledSDEs(fitzhugh_nagumo, idfunc, zeros(2), [1.,3.,1.,1.,1.,0.], 0.1)
148+
p = [1.,3.,1.,1.,1.,0.]
149+
150+
sys = CoupledSDEs(fitzhugh_nagumo, zeros(2), p; noise_strength=0.1)
156151
ls = lyapunovspectrum(CoupledODEs(sys), 10000)
157152
```

0 commit comments

Comments
 (0)