1
1
using ModelingToolkit
2
+ using IfElse
3
+ using Symbolics
4
+ using Symbolics: unwrap
2
5
using DiffEqBase, StaticArrays, LinearAlgebra
3
6
4
7
@variables t y (t)[1 : 10 ]
@@ -444,13 +447,13 @@ nc5sys = let
444
447
0.0000517759138449
445
448
0.00000277777777778 ]
446
449
447
- r = [sum (i-> y[i, j]^ 2 , 1 : 3 ) for j in 1 : 5 ]
450
+ r = [sqrt ( sum (i-> y[i, j]^ 2 , 1 : 3 ) ) for j in 1 : 5 ]
448
451
d = [sqrt (sum (i-> (y[i, k] - y[i, j])^ 2 , 1 : 3 )) for k in 1 : 5 , j in 1 : 5 ]
449
452
ssum (i, j) = sum (1 : 5 ) do k
450
453
k == j && return 0
451
454
ms[k] * (y[i, k] - y[i, j]) / d[j, k]^ 3
452
455
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 ]
456
+ 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
457
structural_simplify (ODESystem (nc5eqs, t, name = :nc5 ))
455
458
end
456
459
@@ -466,4 +469,118 @@ ys′ = [-0.557160570446, 0.505696783289, 0.230578543901,
466
469
- 0.176860753121 , - 0.216393453025 , - 0.0148647893090 ,]
467
470
y0 = y .=> reshape (ys, 3 , 5 )
468
471
y0′ = D .(y) .=> reshape (ys′, 3 , 5 )
472
+ # The orginal paper has t_f = 20, but 1000 looks way better
469
473
nc5prob = ODEProblem {false} (nc5sys, [y0; y0′], (0 , 20.0 ), cse = true )
474
+
475
+ @variables y (t)[1 : 4 ]
476
+ y = collect (y)
477
+ @parameters ε
478
+ nd1sys = let
479
+ r = sqrt (y[1 ]^ 2 + y[2 ]^ 2 )^ 3
480
+ nd1eqs = [D (y[1 ]) ~ y[3 ],
481
+ D (y[2 ]) ~ y[4 ],
482
+ D (y[3 ]) ~ (- y[1 ]) / r,
483
+ D (y[4 ]) ~ (- y[2 ]) / r,
484
+ ]
485
+ ODESystem (nd1eqs, t, name = :nd1 )
486
+ end
487
+
488
+ function make_ds (nd1sys, e)
489
+ y = collect (@nonamespace nd1sys. y)
490
+ y0 = [y[1 ] => 1 - e; y[2 : 3 ] .=> 0.0 ; y[4 ] => sqrt ((1 + e) / (1 - e))]
491
+ ODEProblem {false} (nd1sys, y0, (0 , 20.0 ), [ε => e], cse = true )
492
+ end
493
+ nd1prob = make_ds (nd1sys, 0.1 )
494
+ nd2prob = make_ds (nd1sys, 0.3 )
495
+ nd3prob = make_ds (nd1sys, 0.5 )
496
+ nd4prob = make_ds (nd1sys, 0.7 )
497
+ nd5prob = make_ds (nd1sys, 0.9 )
498
+
499
+ ne1sys = let
500
+ ne1eqs = [D (y[1 ]) ~ y[2 ],
501
+ D (y[2 ]) ~ - (y[2 ] / (t + 1 ) + (1 - 0.25 / (t + 1 )^ 2 ) * y[1 ]),
502
+ ]
503
+ ODESystem (ne1eqs, t, name = :ne1 )
504
+ end
505
+
506
+ y0 = [y[1 ] => 0.6713967071418030 ; y[2 ] => 0.09540051444747446 ]
507
+ ne1prob = ODEProblem {false} (ne1sys, y0, (0 , 20.0 ), cse = true )
508
+
509
+ ne2sys = let
510
+ ne2eqs = [D (y[1 ]) ~ y[2 ],
511
+ D (y[2 ]) ~ (1 - y[1 ]^ 2 ) * y[2 ] - y[1 ],
512
+ ]
513
+ ODESystem (ne2eqs, t, name = :ne2 )
514
+ end
515
+
516
+ y0 = [y[1 ] => 2.0 ; y[2 ] => 0.0 ]
517
+ ne2prob = ODEProblem {false} (ne2sys, y0, (0 , 20.0 ), cse = true )
518
+
519
+ ne3sys = let
520
+ ne3eqs = [D (y[1 ]) ~ y[2 ],
521
+ D (y[2 ]) ~ y[1 ]^ 3 / 6 - y[1 ] + 2 * sin (2.78535 t),
522
+ ]
523
+ ODESystem (ne3eqs, t, name = :ne3 )
524
+ end
525
+
526
+ ne3prob = ODEProblem {false} (ne3sys, y[1 : 2 ] .=> 0 , (0 , 20.0 ), cse = true )
527
+
528
+ ne4sys = let
529
+ ne4eqs = [D (y[1 ]) ~ y[2 ],
530
+ D (y[2 ]) ~ 0.032 - 0.4 * y[2 ]^ 2 ,
531
+ ]
532
+ ODESystem (ne4eqs, t, name = :ne4 )
533
+ end
534
+
535
+ ne4prob = ODEProblem {false} (ne4sys, [y[1 ] => 30.0 , y[2 ] => 0.0 ], (0 , 20.0 ), cse = true )
536
+
537
+ ne5sys = let
538
+ ne5eqs = [D (y[1 ]) ~ y[2 ],
539
+ D (y[2 ]) ~ sqrt (1 - y[2 ]^ 2 ) / (25 - t),]
540
+ ODESystem (ne5eqs, t, name = :ne5 )
541
+ end
542
+
543
+ ne5prob = ODEProblem {false} (ne5sys, y[1 : 2 ] .=> 0.0 , (0 , 20.0 ), cse = true )
544
+
545
+ nf1sys = let
546
+ a = 0.1
547
+ cond = term (iseven, term (floor, Int, unwrap (t), type = Int), type = Bool)
548
+ b = 2 a * y[2 ] - (pi ^ 2 + a^ 2 ) * y[1 ]
549
+ nf1eqs = [D (y[1 ]) ~ y[2 ],
550
+ D (y[2 ]) ~ b + IfElse. ifelse (cond, 1 , - 1 )]
551
+ ODESystem (nf1eqs, t, name = :nf1 )
552
+ end
553
+
554
+ nf1prob = ODEProblem {false} (nf1sys, y[1 : 2 ] .=> 0.0 , (0 , 20.0 ))
555
+
556
+ nf2sys = let
557
+ cond = term (iseven, term (floor, Int, unwrap (t), type = Int), type = Bool)
558
+ nf2eqs = [D (y[1 ]) ~ 55 - IfElse. ifelse (cond, 2 y[1 ]/ 2 , y[1 ]/ 2 )]
559
+ ODESystem (nf2eqs, t, name = :nf2 )
560
+ end
561
+
562
+ nf2prob = ODEProblem {false} (nf2sys, [y[1 ] .=> 110.0 ], (0 , 20.0 ), cse = true )
563
+
564
+ nf3sys = let
565
+ nf3eqs = [D (y[1 ]) ~ y[2 ],
566
+ D (y[2 ]) ~ 0.01 * y[2 ] * (1 - y[1 ]^ 2 ) - y[1 ] - abs (sin (pi * t))]
567
+ ODESystem (nf3eqs, t, name = :nf3 )
568
+ end
569
+
570
+ nf3prob = ODEProblem {false} (nf3sys, y[1 : 2 ] .=> 0.0 , (0 , 20.0 ), cse = true )
571
+
572
+ nf4sys = let
573
+ nf4eqs = [D (y[1 ]) ~ IfElse. ifelse (t <= 10 , - 2 / 21 - (120 * (t - 5 )) / (1 + 4 * (t - 5 )^ 2 ), - 2 y[1 ])]
574
+ ODESystem (nf4eqs, t, name = :nf4 )
575
+ end
576
+
577
+ nf4prob = ODEProblem {false} (nf4sys, [y[1 ] => 1.0 ], (0 , 20.0 ), cse = true )
578
+
579
+ nf5sys = let
580
+ c = sum (i-> cbrt (i)^ 4 , 1 : 19 )
581
+ p = sum (i-> cbrt (t - i)^ 4 , 1 : 19 )
582
+ nf5eqs = [D (y[1 ]) ~ inv (c) * Symbolics. derivative (p, t) * y[1 ]]
583
+ ODESystem (nf5eqs, t, name = :nf5 )
584
+ end
585
+
586
+ nf5prob = ODEProblem {false} (nf5sys, [y[1 ] => 1.0 ], (0 , 20.0 ), cse = true )
0 commit comments