Skip to content

Commit 01bff6e

Browse files
authored
PredefinedDynamicalSystems jacobian fixes (#21)
* fixed predefined system constructors, removed @smatrix macros and corrected jacobian names * changed to more efficient SMatrix constructor * increment minor version
1 parent b803cd6 commit 01bff6e

File tree

3 files changed

+65
-93
lines changed

3 files changed

+65
-93
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "PredefinedDynamicalSystems"
22
uuid = "31e2f376-db9e-427a-b76e-a14f56347a14"
33
repo = "https://github.com/JuliaDynamics/PredefinedDynamicalSystems.jl.git"
4-
version = "1.1.1"
4+
version = "1.2"
55

66
[deps]
77
DynamicalSystemsBase = "6e36e845-645a-534a-86f2-f5d4aa5a06b4"

src/continuous_famous_systems.jl

Lines changed: 45 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ function's documentation string.
7676
7777
"""
7878
function chua(u0 = [0.7, 0.0, 0.0]; a = 15.6, b = 25.58, m0 = -8/7, m1 = -5/7)
79-
return CoupledODEs(chua_rule, u0, [a, b, m0, m1], chua_jacob)
79+
return CoupledODEs(chua_rule, u0, [a, b, m0, m1])
8080
end
8181
@inbounds function chua_rule(u, p, t)
8282
du1 = p[1] * (u[2] - u[1] - chua_element(u[1], p[3], p[4]))
@@ -85,9 +85,7 @@ end
8585
return SVector{3}(du1, du2, du3)
8686
end
8787
function chua_jacob(u, p, t)
88-
return SMatrix{3,3}(-p[1]*(1 + chua_element_derivative(u[1], p[3], p[4])), p[1], 0.0,
89-
1.0, -1.0, 1.0,
90-
0.0, -p[2], 0.0)
88+
return SMatrix{3,3}(-p[1]*(1 + chua_element_derivative(u[1], p[3], p[4])),1.0,0.0,p[1],-1.0,-p[2],0.0,1.0,0.0)
9189
end
9290
# Helper functions for Chua's circuit.
9391
function chua_element(x, m0, m1)
@@ -123,7 +121,7 @@ function's documentation string.
123121
[^Rössler1976]: O. E. Rössler, Phys. Lett. **57A**, pp 397 (1976)
124122
"""
125123
function roessler(u0=[1.0, -2.0, 0.1]; a = 0.2, b = 0.2, c = 5.7)
126-
return CoupledODEs(roessler_rule, u0, [a, b, c], roessler_jacob)
124+
return CoupledODEs(roessler_rule, u0, [a, b, c])
127125
end
128126
@inbounds function roessler_rule(u, p, t)
129127
du1 = -u[2]-u[3]
@@ -132,9 +130,7 @@ end
132130
return SVector{3}(du1, du2, du3)
133131
end
134132
function roessler_jacob(u, p, t)
135-
return SMatrix{3,3}(0.0, -1.0, -1.0,
136-
1.0, p[1], 0.0,
137-
u[3], 0.0, u[1]-p[3])
133+
return SMatrix{3,3}(0.0,1.0,u[3],-1.0,p[1],0.0,-1.0,0.0,u[1]-p[3])
138134
end
139135

140136
"""
@@ -392,7 +388,7 @@ function's documentation string.
392388
[^Gissinger2012]: C. Gissinger, Eur. Phys. J. B **85**, 4, pp 1-12 (2012)
393389
"""
394390
function gissinger(u0 = [3, 0.5, 1.5]; μ = 0.119, ν = 0.1, Γ = 0.9)
395-
return CoupledODEs(gissinger_rule, u0, [μ, ν, Γ], gissinger_jacob)
391+
return CoupledODEs(gissinger_rule, u0, [μ, ν, Γ])
396392
end
397393
function gissinger_rule(u, p, t)
398394
μ, ν, Γ = p
@@ -402,10 +398,8 @@ function gissinger_rule(u, p, t)
402398
return SVector{3}(du1, du2, du3)
403399
end
404400
function gissinger_jacob(u, p, t)
405-
μ, ν, Γ = p
406-
return @SMatrix-u[3] -u[2];
407-
u[3] -ν u[1];
408-
u[2] u[1] -1]
401+
μ, ν, Γ = p
402+
return SMatrix{3,3}(μ,u[3],u[2],-u[3],-ν,u[1],-u[2],u[1],-1)
409403
end
410404

411405
"""
@@ -425,7 +419,7 @@ reversal events by means of a double-disk dynamo system.
425419
[^Rikitake1958]: T. Rikitake Math. Proc. Camb. Phil. Soc. **54**, pp 89–105, (1958)
426420
"""
427421
function rikitake(u0 = [1, 0, 0.6]; μ = 1.0, α = 1.0)
428-
return CoupledODEs(rikitake_rule, u0, [μ, α], rikitake_jacob)
422+
return CoupledODEs(rikitake_rule, u0, [μ, α])
429423
end
430424
function rikitake_rule(u, p, t)
431425
μ, α = p
@@ -438,12 +432,8 @@ end
438432
function rikitake_jacob(u, p, t)
439433
μ, α = p
440434
x,y,z = u
441-
xdot = -μ*x + y*z
442-
ydot = -μ*y + x*(z - α)
443-
zdot = 1 - x*y
444-
return @SMatrix [-μ z y;
445-
z-α -μ x;
446-
-y -x 0]
435+
436+
return SMatrix{3,3}(-μ,z-α,-y,z,-μ,-x,y,x,0)
447437
end
448438

449439
"""
@@ -472,7 +462,7 @@ See Chapter 4 of "Elegant Chaos" by J. C. Sprott. [^Sprott2010]
472462
Sprott, J. C. (2010). *Elegant chaos: algebraically simple chaotic flows*.
473463
World Scientific.
474464
"""
475-
nosehoover(u0 = [0, 0.1, 0]) = CoupledODEs(nosehoover_rule, u0, nothing, nosehoover_jacob)
465+
nosehoover(u0 = [0, 0.1, 0]) = CoupledODEs(nosehoover_rule, u0, nothing)
476466
function nosehoover_rule(u, p, t)
477467
x,y,z = u
478468
xdot = y
@@ -482,9 +472,8 @@ function nosehoover_rule(u, p, t)
482472
end
483473
function nosehoover_jacob(u, p, t)
484474
x,y,z = u
485-
return @SMatrix [0 1 0;
486-
-1 z y;
487-
0 -2y 0]
475+
476+
return SMatrix{3,3}(0,-1,0,1,z,-2y,0,y,0)
488477
end
489478

490479
"""
@@ -521,7 +510,7 @@ diameter is 1.
521510
"""
522511
function antidots(u0 = [0.5, 0.5, 0.25, 0.25];
523512
d0 = 0.5, c = 0.2, B = 1.0)
524-
return CoupledODEs(antidot_rule, u0, [B, d0, c], antidot_jacob)
513+
return CoupledODEs(antidot_rule, u0, [B, d0, c])
525514
end
526515

527516
function antidot_rule(u, p, t)
@@ -612,7 +601,7 @@ J. C. Sprott. [^Sprott2010]
612601
World Scientific.
613602
"""
614603
function ueda(u0 = [3.0, 0]; k = 0.1, B = 12.0)
615-
return CoupledODEs(ueda_rule, u0, [k, B], ueda_jacob)
604+
return CoupledODEs(ueda_rule, u0, [k, B])
616605
end
617606
function ueda_rule(u, p, t)
618607
x,y = u
@@ -624,8 +613,7 @@ end
624613
function ueda_jacob(u, p, t)
625614
x,y = u
626615
k, B = p
627-
return @SMatrix [0 1;
628-
-3*x^2 -k]
616+
return SMatrix{2,2}(0,-3*x^2,1,-k)
629617
end
630618

631619

@@ -777,8 +765,7 @@ between the boxes (polar and equatorial ocean basins) and ``\\eta_i`` are parame
777765
Stommel, Thermohaline convection with two stable regimes of flow. Tellus, 13(2)
778766
"""
779767
function stommel_thermohaline(u = [0.3, 0.2]; η1 = 3.0, η2 = 1, η3 = 0.3)
780-
ds = CoupledODEs(stommel_thermohaline_rule, u, [η1, η2, η3],
781-
stommel_thermohaline_jacob)
768+
ds = CoupledODEs(stommel_thermohaline_rule, u, [η1, η2, η3])
782769
end
783770
function stommel_thermohaline_rule(x, p, t)
784771
T, S = x
@@ -791,11 +778,9 @@ function stommel_thermohaline_jacob(x, p, t)
791778
η1, η2, η3 = p
792779
q = abs(T-S)
793780
if T S
794-
return @SMatrix [(-1 - 2T + S) (T);
795-
(-S) (-η3 - T + 2S)]
781+
return SMatrix{2,2}((-1 - 2T + S), -S,T,(-η3 - T + 2S))
796782
else
797-
return @SMatrix [(-1 + 2T - S) (-T);
798-
(+S) (-η3 + T - 2S)]
783+
return SMatrix{2,2}((-1 + 2T - S), S,-T,(-η3 + T - 2S))
799784
end
800785
end
801786

@@ -838,10 +823,8 @@ end
838823
end
839824
function lorenz84_rule_jacob(u, p, t)
840825
F, G, a, b = p
841-
x, y, z = u
842-
return @SMatrix [(-a) (-2y) (-2z);
843-
y-b*z x-1 (-b*x);
844-
b*y+z b*x x-1]
826+
x, y, z = u
827+
return SMatrix{3,3}(-a,y-b*z,b*y+z,-2y,x-1,b*x,-2z,-b*x,x-1)
845828
end
846829

847830

@@ -873,8 +856,7 @@ bsn, att = basins_of_attraction((xg, yg), pmap)
873856
Int. Jour. Bifurcation and Chaos 24, 1450009 (2014)
874857
"""
875858
function lorenzdl(u = [0.1, 0.1, 0.1]; R=4.7)
876-
return CoupledODEs(lorenzdl_rule, u, R,
877-
lorenzdl_rule_jacob)
859+
return CoupledODEs(lorenzdl_rule, u, R)
878860
end
879861
@inline @inbounds function lorenzdl_rule(u, p, t)
880862
R = p
@@ -885,10 +867,8 @@ end
885867
return SVector{3}(dx, dy, dz)
886868
end
887869
function lorenzdl_rule_jacob(u, p, t)
888-
x, y, z = u
889-
return @SMatrix [-1 1 0;
890-
-z 0 -x;
891-
y x 0]
870+
x, y, z = u
871+
return SMatrix{3,3}(-1,-z,y,1,0,x,0,-x,0)
892872
end
893873

894874
"""
@@ -983,8 +963,7 @@ In the original paper there were no parameters, which are added here for explora
983963
"""
984964
function sprott_dissipative_conservative(u0 = [1.0, 0, 0]; a = 2, b = 1, c = 1)
985965
return CoupledODEs(
986-
sprott_dissipative_conservative_f, u0, [a, b, c], sprott_dissipative_conservative_J
987-
)
966+
sprott_dissipative_conservative_f, u0, [a, b, c])
988967
end
989968

990969
function sprott_dissipative_conservative_f(u, p, t)
@@ -995,12 +974,11 @@ function sprott_dissipative_conservative_f(u, p, t)
995974
dz = c*x - x^2 - y^2
996975
return SVector(dx, dy, dz)
997976
end
998-
function sprott_dissipative_conservative_J(u, p, t)
977+
function sprott_dissipative_conservative_jacob(u, p, t)
999978
a, b, c = p
1000979
x, y, z = u
1001-
return @SMatrix [a*y + z 1 + a*x +x;
1002-
-4x b*z b*y;
1003-
(c - 2x) (-2y) 0]
980+
981+
return SMatrix{3,3}(a*y + z,-4x,c - 2x,1 + a*x,b*z,-2y,x,b*y,0)
1004982
end
1005983

1006984
"""
@@ -1105,7 +1083,7 @@ oscillations. Setting ``\\mu=8.53`` generates chaotic oscillations.
11051083
The London, Edinburgh and Dublin Phil. Mag. & J. of Sci., 2(7), 978–992.
11061084
"""
11071085
function vanderpol(u0=[0.5, 0.0]; μ=1.5, F=1.2, T=10)
1108-
return CoupledODEs(vanderpol_rule, u0, [μ, F, T], vanderpol_jac)
1086+
return CoupledODEs(vanderpol_rule, u0, [μ, F, T])
11091087
end
11101088
function vanderpol_rule(u, p, t)
11111089
@inbounds begin
@@ -1115,11 +1093,11 @@ function vanderpol_rule(u, p, t)
11151093
return SVector{2}(du1, du2)
11161094
end
11171095
end
1118-
function vanderpol_jac(u, p, t)
1096+
function vanderpol_jacob(u, p, t)
11191097
@inbounds begin
11201098
μ = p[1]
1121-
J = @SMatrix [0 1;
1122-
(-μ*(2*u[1]-1)*u[2]-1) (μ*(1 - u[1]^2))]
1099+
J = SMatrix{2,2}( [0 1;
1100+
(-μ*(2*u[1]-1)*u[2]-1) (μ*(1 - u[1]^2))])
11231101
return J
11241102
end
11251103
end
@@ -1153,7 +1131,7 @@ oscillations.
11531131
https://mathworld.wolfram.com/Lotka-VolterraEquations.html
11541132
"""
11551133
function lotkavolterra(u0=[10.0, 5.0]; α = 1.5, β = 1, δ=1, γ=3)
1156-
return CoupledODEs(lotkavolterra_rule, u0, [α, β, δ, γ], lotkavolterra_jac)
1134+
return CoupledODEs(lotkavolterra_rule, u0, [α, β, δ, γ])
11571135
end
11581136
function lotkavolterra_rule(u, p, t)
11591137
@inbounds begin
@@ -1163,12 +1141,10 @@ function lotkavolterra_rule(u, p, t)
11631141
return SVector{2}(du1, du2)
11641142
end
11651143
end
1166-
function lotkavolterra_jac(u, p, t)
1144+
function lotkavolterra_jacob(u, p, t)
11671145
@inbounds begin
11681146
α, β, δ, γ = p
1169-
J = @SMatrix [(α - β*u[2]) (-β*u[1]);
1170-
*u[2]) (δ*u[1] - γ)]
1171-
return J
1147+
return SMatrix{2,2}- β*u[2], δ*u[2],-β*u[1],δ*u[1] - γ)
11721148
end
11731149
end
11741150

@@ -1199,7 +1175,7 @@ periodic bursting.
11991175
Proc. R. Soc. Lond. B 221, 87-102.
12001176
"""
12011177
function hindmarshrose(u0=[-1.0, 0.0, 0.0]; a=1, b=3, c=1, d=5, r=0.001, s=4, xr=-8/5, I=2.0)
1202-
return CoupledODEs(hindmarshrose_rule, u0, [a,b,c,d,r,s,xr, I], hindmarshrose_jac)
1178+
return CoupledODEs(hindmarshrose_rule, u0, [a,b,c,d,r,s,xr, I])
12031179
end
12041180
function hindmarshrose_rule(u, p, t)
12051181
@inbounds begin
@@ -1210,13 +1186,10 @@ function hindmarshrose_rule(u, p, t)
12101186
return SVector{3}(du1, du2, du3)
12111187
end
12121188
end
1213-
function hindmarshrose_jac(u, p, t)
1189+
function hindmarshrose_jacob(u, p, t)
12141190
@inbounds begin
1215-
a,b,c,d,r,s, xr, I = p
1216-
J = @SMatrix [(-3*a*u[1]^2 + 2*b*u[1]) 1 -1;
1217-
-2*d*u[1] -1 0;
1218-
r*s 0 -r]
1219-
return J
1191+
a,b,c,d,r,s, xr, I = p
1192+
return SMatrix{3,3}(-3*a*u[1]^2 + 2*b*u[1],-2*d*u[1],r*s,1,-1,0,-1,0,-r)
12201193
end
12211194
end
12221195

@@ -1302,7 +1275,7 @@ radius `\\sqrt(\\mu)`.
13021275
Boulder, CO :Westview Press, a member of the Perseus Books Group (2015).
13031276
"""
13041277
function stuartlandau_oscillator(u0=[1.0, 0.0]; μ=1.0, ω=1.0, b=1)
1305-
return CoupledODEs(stuartlandau_rule, u0, [μ, ω, b], stuartlandau_jac)
1278+
return CoupledODEs(stuartlandau_rule, u0, [μ, ω, b])
13061279
end
13071280
function stuartlandau_rule(u, p, t)
13081281
@inbounds begin
@@ -1312,12 +1285,12 @@ function stuartlandau_rule(u, p, t)
13121285
return SVector{2}(du1, du2)
13131286
end
13141287
end
1315-
function stuartlandau_jac(u, p, t)
1288+
function stuartlandau_jacob(u, p, t)
13161289
@inbounds begin
13171290
μ, ω, b = p
1318-
J = @SMatrix [(μ - 3*u[1]^2 -u[2]^2 -2*b*u[1]*u[2]) (-2*u[1]*u[2] -ω -b*u[1]^2 -3*b*u[2]^2);
1319-
(-2*u[1]*u[2] +ω +b*u[2]^2 +3*b*u[1]^2) (μ -u[1]^2 -3*u[2]^2 +2*b*u[1]*u[2])]
1320-
return J
1291+
1292+
return SMatrix{2,2}- 3*u[1]^2 -u[2]^2 -2*b*u[1]*u[2],-2*u[1]*u[2] +ω +b*u[2]^2 +3*b*u[1]^2,
1293+
-2*u[1]*u[2] -ω -b*u[1]^2 -3*b*u[2]^2-u[1]^2 -3*u[2]^2 +2*b*u[1]*u[2])
13211294
end
13221295
end
13231296

@@ -2158,4 +2131,4 @@ end
21582131
du3 = x*y - b*z
21592132
du4 = -d*x - d*y
21602133
return SVector{4}(du1, du2, du3, du4)
2161-
end
2134+
end

0 commit comments

Comments
 (0)