Skip to content

Commit 21576c0

Browse files
committed
Add up to NC5
1 parent d96b8c1 commit 21576c0

File tree

1 file changed

+306
-1
lines changed

1 file changed

+306
-1
lines changed

src/ode/enright_pryce.jl

Lines changed: 306 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
using ModelingToolkit
2-
using DiffEqBase, StaticArrays
2+
using DiffEqBase, StaticArrays, LinearAlgebra
33

44
@variables t y(t)[1:10]
55
y = collect(y)
66
D = Differential(t)
77

8+
# Stiff
89
sa1sys = let
910
sa1eqs = [D(y[1]) ~ -0.5 * y[1], D(y[2]) ~ -y[2], D(y[3]) ~ -100*y[3], D(y[4]) ~ -90*y[4]]
1011
ODESystem(sa1eqs, t, name = :sa1)
@@ -162,3 +163,307 @@ sd6sys = let
162163
end
163164

164165
sd6prob = ODEProblem{false}(sd6sys, [y[1] => 1.0; y[2:3] .=> 0.0], (0, 1.0), dt = 3.3e-8, cse = true)
166+
167+
se1sys = let
168+
Γ = 100
169+
se1eqs = [D(y[1]) ~ y[2],
170+
D(y[2]) ~ y[3],
171+
D(y[3]) ~ y[4],
172+
D(y[4]) ~ (y[1]^2 - sin(y[1]) - Γ^4) * y[1] + (y[2] * y[3] / (y[1]^2 + 1) - 4 * Γ^3) * y[2] + (1 - 6 * Γ^2) * y[3] + (10 * exp(-y[4]^2) - 4Γ) * y[4] + 1
173+
]
174+
175+
ODESystem(se1eqs, t, name = :se1)
176+
end
177+
178+
se1prob = ODEProblem{false}(se1sys, y .=> 0.0, (0, 1.0), dt = 6.8e-3, cse = true)
179+
180+
se2sys = let
181+
se2eqs = [D(y[1]) ~ y[2],
182+
D(y[2]) ~ 5 * (1 - y[1]^2) * y[2] - y[1]
183+
]
184+
185+
ODESystem(se2eqs, t, name = :se2)
186+
end
187+
188+
se2prob = ODEProblem{false}(se2sys, [y[1] => 2.0, y[2] => 0.0], (0, 1.0), dt = 1e-3, cse = true)
189+
190+
se3sys = let
191+
se3eqs = [D(y[1]) ~ -(55 + y[3]) * y[1] + 65 * y[2],
192+
D(y[2]) ~ 0.0785 * (y[1] - y[2]),
193+
D(y[3]) ~ 0.1 * y[1]
194+
]
195+
196+
ODESystem(se3eqs, t, name = :se3)
197+
end
198+
199+
se3prob = ODEProblem{false}(se3sys, [y[1:2] .=> 1.0; y[3] => 0.0], (0, 500.0), dt = 0.02, cse = true)
200+
201+
se4sys = let y = y
202+
y = y[1:4]
203+
U = ones(4, 4)
204+
U[diagind(U)] .= -1
205+
U ./= 2
206+
Z = U * y
207+
G = U' * [(Z[1]^2 - Z[2]^2) / 2, Z[1] * Z[2], Z[3]^2, Z[4]^2]
208+
A = [-10 -10 0 0; 10 -10 0 0; 0 0 1000 0; 0 0 0 0.01]
209+
se4eqs = D.(y) .~ -(U' * A * Z) + G
210+
211+
ODESystem(se4eqs, t, name = :se4)
212+
end
213+
214+
se4prob = ODEProblem{false}(se4sys, [y[1] => 0.0; y[2] => -2.0; y[3:4] .=> -1.0], (0, 1000.0), dt = 1e-3, cse = true)
215+
216+
se5sys = let
217+
se5eqs = [
218+
D(y[1]) ~ -7.89e-10 * y[1] - 1.1e7 * y[1] * y[3],
219+
D(y[2]) ~ 7.89e-10 * y[1] - 1.13e9 * y[2] * y[3],
220+
D(y[3]) ~ 7.89e-10 * y[1] - 1.1e7 * y[1] * y[3] + 1.13e3 * y[4] - 1.13e9 * y[2] * y[3],
221+
D(y[4]) ~ 1.1e7 * y[1] * y[3] - 1.13e3 * y[4],
222+
]
223+
224+
ODESystem(se5eqs, t, name = :se5)
225+
end
226+
227+
se5prob = ODEProblem{false}(se5sys, [y[1] => 1.76e-3; y[2:4] .=> 0.0], (0, 1000.0), dt = 1e-3, cse = true)
228+
229+
sf1sys = let
230+
k = exp(20.7 - 1500 / y[1])
231+
sf1eqs = [
232+
D(y[1]) ~ 1.3 * (y[3] - y[1]) + 10400 * k * y[2],
233+
D(y[2]) ~ 1880 * [y[4] - y[2] * (1 + k)],
234+
D(y[3]) ~ 1752 - 269 * y[3] + 267 * y[1],
235+
D(y[4]) ~ 0.1 + 320 * y[2] - 321 * y[4],
236+
]
237+
238+
ODESystem(sf1eqs, t, name = :sf1)
239+
end
240+
241+
sf1prob = ODEProblem{false}(sf1sys, [y[1] => 761.0; y[2] => 0.0; y[3] => 600.0; y[4] => 0.1], (0, 1000.0), dt = 1e-4, cse = true)
242+
243+
sf2sys = let
244+
sf2eqs = [
245+
D(y[1]) ~ -y[1] - y[1] * y[2] + 294 * y[2],
246+
D(y[2]) ~ y[1] * (1 - y[2]) / 98 - 3 * y[2]
247+
]
248+
249+
ODESystem(sf2eqs, t, name = :sf2)
250+
end
251+
252+
sf2prob = ODEProblem{false}(sf2sys, [y[1] => 1.0; y[2] => 0.0], (0, 240.0), dt = 1e-2, cse = true)
253+
254+
sf3sys = let
255+
sf3eqs = [
256+
D(y[1]) ~ -1e7 * y[2] * y[1] + 10 * y[3],
257+
D(y[2]) ~ -1e7 * y[2] * y[1] - 1e7 * y[2] * y[5] + 10 * y[3] + 10 * y[4],
258+
D(y[3]) ~ 1e7 * y[2] * y[1] - 1.001e4 * y[3] + 1e-3 * y[4],
259+
D(y[4]) ~ 1e4 * y[3] - 10.001 * y[4] + 1e7 * y[2] * y[5],
260+
D(y[5]) ~ 10 * y[4] - 1e7 * y[2] * y[5],
261+
]
262+
263+
ODESystem(sf3eqs, t, name = :sf3)
264+
end
265+
266+
sf3prob = ODEProblem{false}(sf3sys, [y[1] => 4e-6; y[2] => 1e-6; y[3:5] .=> 0.0], (0, 100.0), dt = 1e-6, cse = true)
267+
268+
sf4sys = let
269+
sf4eqs = [
270+
D(y[1]) ~ 77.27 * (y[2] - y[1] * y[2] + y[1] - 8.375e-6 * y[1]^2),
271+
D(y[2]) ~ (-y[2] - y[1] * y[2] + y[3]) / 77.27,
272+
D(y[3]) ~ 0.161 * (y[1] - y[3]),
273+
]
274+
275+
ODESystem(sf4eqs, t, name = :sf4)
276+
end
277+
278+
sf4prob = ODEProblem{false}(sf4sys, [y[1] => 4.0; y[2] => 1.1; y[3] => 4.0], (0, 300.0), dt = 1e-3, cse = true)
279+
280+
sf5sys = let
281+
sf5eqs = [
282+
D(y[1]) ~ 1e11 * (-3 * y[1] * y[2] + 0.0012 * y[4] - 9 * y[1] * y[3]),
283+
D(y[2]) ~ -3e11 * y[1] * y[2] + 2e7 * y[4],
284+
D(y[3]) ~ 1e11 * (-9 * y[1] * y[3] + 0.001 * y[4]),
285+
D(y[4]) ~ 1e11 * (3 * y[1] * y[2] - 0.0012 * y[4] + 9 * y[1] * y[3]),
286+
]
287+
288+
ODESystem(sf5eqs, t, name = :sf5)
289+
end
290+
291+
sf5prob = ODEProblem{false}(sf5sys, [y[1] => 3.365e-7; y[2] => 8.261e-3; y[3] => 1.642e-3; y[4] => 9.38e-6], (0, 100.0), dt = 1e-7, cse = true)
292+
293+
# Non-stiff
294+
na1sys = let y = y[1]
295+
na1eqs = D(y) ~ -y
296+
297+
ODESystem(na1eqs, t, name = :na1)
298+
end
299+
300+
na1prob = ODEProblem{false}(na1sys, [y[1] => 1], (0, 20.0), cse = true)
301+
302+
na2sys = let y = y[1]
303+
na2eqs = D(y) ~ -y^3/2
304+
305+
ODESystem(na2eqs, t, name = :na2)
306+
end
307+
308+
na2prob = ODEProblem{false}(na2sys, [y[1] => 1], (0, 20.0), cse = true)
309+
310+
na3sys = let y = y[1]
311+
na3eqs = D(y) ~ y * cos(t)
312+
313+
ODESystem(na3eqs, t, name = :na3)
314+
end
315+
316+
na3prob = ODEProblem{false}(na3sys, [y[1] => 1], (0, 20.0), cse = true)
317+
318+
na4sys = let y = y[1]
319+
na4eqs = D(y) ~ y/4 * (1 - y/20)
320+
321+
ODESystem(na4eqs, t, name = :na4)
322+
end
323+
324+
na4prob = ODEProblem{false}(na4sys, [y[1] => 1], (0, 20.0), cse = true)
325+
326+
na5sys = let y = y[1]
327+
na5eqs = D(y) ~ (y - t) / (y + t)
328+
329+
ODESystem(na5eqs, t, name = :na5)
330+
end
331+
332+
na5prob = ODEProblem{false}(na5sys, [y[1] => 4], (0, 20.0), cse = true)
333+
334+
nb1sys = let
335+
nb1eqs = [
336+
D(y[1]) ~ 2 * (y[1] - y[1] * y[2]),
337+
D(y[2]) ~ -(y[2] - y[1] * y[2]),
338+
]
339+
340+
ODESystem(nb1eqs, t, name = :nb1)
341+
end
342+
343+
nb1prob = ODEProblem{false}(nb1sys, [y[1] => 1.0, y[2] => 3], (0, 20.0), cse = true)
344+
345+
nb2sys = let
346+
nb2eqs = [
347+
D(y[1]) ~ -y[1] + y[2],
348+
D(y[2]) ~ y[1] - 2y[2] + y[3],
349+
D(y[3]) ~ y[2] - y[3],
350+
]
351+
352+
ODESystem(nb2eqs, t, name = :nb2)
353+
end
354+
355+
nb2prob = ODEProblem{false}(nb2sys, [y[1] => 2.0, y[2] => 0.0, y[3] => 1.0], (0, 20.0), cse = true)
356+
357+
nb3sys = let
358+
nb3eqs = [
359+
D(y[1]) ~ -y[1],
360+
D(y[2]) ~ y[1] - y[2]^2,
361+
D(y[3]) ~ y[2]^2,
362+
]
363+
364+
ODESystem(nb3eqs, t, name = :nb3)
365+
end
366+
367+
nb3prob = ODEProblem{false}(nb3sys, [y[1] => 1.0; y[2:3] .=> 0.0], (0, 20.0), cse = true)
368+
369+
nb4sys = let
370+
r = sqrt(y[1]^2 + y[2]^2)
371+
nb4eqs = [
372+
D(y[1]) ~ -y[2] - (y[1] * y[3]) / r,
373+
D(y[2]) ~ y[1] - (y[2] * y[3]) / r,
374+
D(y[3]) ~ y[1] / r,
375+
]
376+
377+
ODESystem(nb4eqs, t, name = :nb4)
378+
end
379+
380+
nb4prob = ODEProblem{false}(nb4sys, [y[1] => 3.0; y[2:3] .=> 0.0], (0, 20.0), cse = true)
381+
382+
nb5sys = let
383+
nb5eqs = [
384+
D(y[1]) ~ y[2] * y[3],
385+
D(y[2]) ~ -y[1] * y[3],
386+
D(y[3]) ~ -0.51 * y[1] * y[2],
387+
]
388+
389+
ODESystem(nb5eqs, t, name = :nb5)
390+
end
391+
392+
nb5prob = ODEProblem{false}(nb5sys, [y[1] => 0.0; y[2:3] .=> 1.0], (0, 20.0), cse = true)
393+
394+
nc1sys = let y = y
395+
n = 10
396+
y = y[1:n]
397+
A = Bidiagonal(fill(-1, n), fill(1, n-1), :L)
398+
nc1eqs = D.(y) .~ A * y
399+
ODESystem(nc1eqs, t, name = :nc1)
400+
end
401+
402+
nc1prob = ODEProblem{false}(nc1sys, [y[1] => 1.0; y[2:10] .=> 0.0], (0, 20.0), cse = true)
403+
404+
nc2sys = let y = y
405+
n = 10
406+
y = y[1:n]
407+
A = Bidiagonal([-1:-1:-n+1; 0], collect(1:n-1), :L)
408+
nc2eqs = D.(y) .~ A * y
409+
ODESystem(nc2eqs, t, name = :nc2)
410+
end
411+
412+
nc2prob = ODEProblem{false}(nc2sys, [y[1] => 1.0; y[2:10] .=> 0.0], (0, 20.0), cse = true)
413+
414+
nc3sys = let y = y
415+
n = 10
416+
y = y[1:n]
417+
A = SymTridiagonal(fill(-2, n), fill(1, n - 1))
418+
nc3eqs = D.(y) .~ A * y
419+
ODESystem(nc3eqs, t, name = :nc3)
420+
end
421+
422+
nc3prob = ODEProblem{false}(nc3sys, [y[1] => 1.0; y[2:10] .=> 0.0], (0, 20.0), cse = true)
423+
424+
@variables y(t)[1:51]
425+
y = collect(y)
426+
nc4sys = let y = y
427+
n = 51
428+
y = y[1:n]
429+
A = SymTridiagonal(fill(-2, n), fill(1, n - 1))
430+
nc4eqs = D.(y) .~ A * y
431+
ODESystem(nc4eqs, t, name = :nc4)
432+
end
433+
434+
nc4prob = ODEProblem{false}(nc4sys, [y[1] => 1.0; y[2:51] .=> 0.0], (0, 20.0), cse = true)
435+
436+
@variables y(t)[1:3, 1:5]
437+
y = collect(y)
438+
nc5sys = let
439+
k_2 = 2.95912208286
440+
m_0 = 1.00000597682
441+
ms = [0.000954786104043
442+
0.000285583733151
443+
0.0000437273164546
444+
0.0000517759138449
445+
0.00000277777777778]
446+
447+
r = [sum(i->y[i, j]^2, 1:3) for j in 1:5]
448+
d = [sqrt(sum(i->(y[i, k] - y[i, j])^2, 1:3)) for k in 1:5, j in 1:5]
449+
ssum(i, j) = sum(1:5) do k
450+
k == j && return 0
451+
ms[k] * (y[i, k] - y[i, j]) / d[j, k]^3
452+
end
453+
nc5eqs = [D(D(y[i, j])) .~ k_2 * (-(m_0 + ms[j]) * y[i, j])/r[j]^3 + ssum(i, j) for i in 1:3, j in 1:5]
454+
structural_simplify(ODESystem(nc5eqs, t, name = :nc5))
455+
end
456+
457+
ys = [3.42947415189, 3.35386959711, 1.35494901715,
458+
6.64145542550, 5.97156957878, 2.18231499728,
459+
11.2630437207, 14.6952576794, 6.27960525067,
460+
-30.1552268759, 1.65699966404, 1.43785752721,
461+
-21.1238353380, 28.4465098142, 15.3882659679,]
462+
ys′ = [-0.557160570446, 0.505696783289, 0.230578543901,
463+
-0.415570776342, 0.365682722812, 0.169143213293,
464+
-0.325325669158, 0.189706021964, 0.087726532278,
465+
-0.0240476254170, -0.287659532608, -0.117219543175,
466+
-0.176860753121, -0.216393453025, -0.0148647893090,]
467+
y0 = y .=> reshape(ys, 3, 5)
468+
y0′ = D.(y) .=> reshape(ys′, 3, 5)
469+
nc5prob = ODEProblem{false}(nc5sys, [y0; y0′], (0, 20.0), cse = true)

0 commit comments

Comments
 (0)