1
1
using ModelingToolkit, OrdinaryDiffEq, NonlinearSolve, Test
2
+ using SymbolicIndexingInterface
2
3
using ModelingToolkit: t_nounits as t, D_nounits as D
3
4
4
5
@parameters g
@@ -493,27 +494,69 @@ end
493
494
@test init (prob, Tsit5 ()). ps[sym] ≈ val
494
495
@test solve (prob, Tsit5 ()). ps[sym] ≈ val
495
496
end
497
+ function test_initializesystem (sys, u0map, pmap, p, equation)
498
+ isys = ModelingToolkit. generate_initializesystem (sys; u0map, pmap, guesses = ModelingToolkit. guesses (sys))
499
+ @test is_variable (isys, p)
500
+ @test equation in equations (isys) || (0 ~ - equation. rhs) in equations (isys)
501
+ end
496
502
@variables x (t) y (t)
497
- @parameters p
498
- _p = ModelingToolkit. setdefault (p, missing )
499
- _p = ModelingToolkit. setguess (_p, 0.0 )
500
- @mtkbuild sys = ODESystem ([D (x) ~ x, _p ~ x + y], t)
501
- prob = ODEProblem (sys, [x => 1.0 , y => 1.0 ], (0.0 , 1.0 ))
502
- test_parameter (prob, _p, 2.0 )
503
+ @parameters p q
504
+ u0map = Dict (x => 1.0 , y => 1.0 )
505
+ pmap = Dict ()
506
+ pmap[q] = 1.0
507
+ # `missing` default, equation from ODEProblem
508
+ @mtkbuild sys = ODESystem ([D (x) ~ x * q, D (y) ~ y * p], t; defaults = [p => missing ])
509
+ pmap[p] = 2 q
510
+ prob = ODEProblem (sys, u0map, (0.0 , 1.0 ), pmap)
511
+ test_parameter (prob, p, 2.0 )
512
+ # `missing` default, provided guess
503
513
@mtkbuild sys = ODESystem (
504
514
[D (x) ~ x, p ~ x + y], t; defaults = [p => missing ], guesses = [p => 0.0 ])
505
- prob = ODEProblem (sys, [x => 1.0 , y => 1.0 ] , (0.0 , 1.0 ))
515
+ prob = ODEProblem (sys, u0map , (0.0 , 1.0 ))
506
516
test_parameter (prob, p, 2.0 )
507
- @mtkbuild sys = ODESystem ([D (x) ~ x, p ~ x + y], t; guesses = [p => 0.0 ])
508
- prob = ODEProblem (sys, [x => 1.0 , y => 1.0 ], (0.0 , 1.0 ), [p => missing ])
517
+ test_initializesystem (sys, u0map, pmap, p, 0 ~ p - x - y)
518
+
519
+ # `missing` to ODEProblem, equation from default
520
+ @mtkbuild sys = ODESystem ([D (x) ~ x * q, D (y) ~ y * p], t; defaults = [p => 2 q])
521
+ pmap[p] = missing
522
+ prob = ODEProblem (sys, u0map, (0.0 , 1.0 ), pmap)
523
+ test_parameter (prob, p, 2.0 )
524
+ test_initializesystem (sys, u0map, pmap, p, 0 ~ 2 q - p)
525
+ test_parameter (prob2, p, 2.0 )
526
+ # `missing` to ODEProblem, provided guess
527
+ @mtkbuild sys = ODESystem (
528
+ [D (x) ~ x, p ~ x + y], t; guesses = [p => 0.0 ])
529
+ prob = ODEProblem (sys, u0map, (0.0 , 1.0 ), pmap)
509
530
test_parameter (prob, p, 2.0 )
531
+ test_initializesystem (sys, u0map, pmap, p, 0 ~ x + y - p)
510
532
511
- @mtkbuild sys = ODESystem ([D (x) ~ x, p ~ x + y], t; guesses = [p => 1.0 ])
533
+ # No `missing`, default and guess
534
+ @mtkbuild sys = ODESystem ([D (x) ~ x * q, D (y) ~ y * p], t; defaults = [p => 2 q], guesses = [p => 0.0 ])
535
+ delete! (pmap, p)
536
+ prob = ODEProblem (sys, u0map, (0.0 , 1.0 ), pmap)
537
+ test_parameter (prob, p, 2.0 )
538
+ test_initializesystem (sys, u0map, pmap, p, 0 ~ 2 q - p)
539
+
540
+ # Should not be solved for:
541
+
542
+ # ODEProblem value with guess, no `missing`
543
+ @mtkbuild sys = ODESystem ([D (x) ~ x * q, D (y) ~ y * p], t; guesses = [p => 0.0 ])
544
+ _pmap = merge (pmap, Dict (p => 3 q))
545
+ prob = ODEProblem (sys, u0map, (0.0 , 1.0 ), _pmap)
546
+ @test prob. ps[p] ≈ 3.0
547
+ @test prob. f. initializeprob === nothing
548
+ # Default overridden by ODEProblem, guess provided
549
+ @mtkbuild sys = ODESystem ([D (x) ~ q * x, D (y) ~ y * p], t; defaults = [p => 2 q], guesses = [p => 1.0 ])
550
+ prob = ODEProblem (sys, u0map, (0.0 , 1.0 ), _pmap)
551
+ @test prob. ps[p] ≈ 3.0
552
+ @test prob. f. initializeprob === nothing
553
+
554
+ @mtkbuild sys = ODESystem ([D (x) ~ x, p ~ x + y], t; guesses = [p => 0.0 ])
512
555
@test_throws ModelingToolkit. MissingParametersError ODEProblem (
513
556
sys, [x => 1.0 , y => 1.0 ], (0.0 , 1.0 ))
514
557
@mtkbuild sys = ODESystem ([D (x) ~ x, p ~ x + y], t)
515
- @test_throws [" Invalid setup" , " parameter p" , " guess" ] ODEProblem (
516
- sys, [ x => 1.0 , y => 1.0 ], ( 0.0 , 1.0 ), [ p => missing ] )
558
+ @test_throws [" Invalid setup" , " parameter p" , " guess" ] ModelingToolkit . generate_initializesystem (
559
+ sys; u0map = Dict ( x => 1.0 , y => 1.0 ), pmap = Dict ( p => missing ), check_defguess = true )
517
560
518
561
@testset " Null system" begin
519
562
@variables x (t) y (t) s (t)
@@ -526,14 +569,15 @@ end
526
569
using ModelingToolkitStandardLibrary. Mechanical. TranslationalModelica: Fixed, Mass,
527
570
Spring, Force,
528
571
Damper
572
+ using ModelingToolkitStandardLibrary. Mechanical: TranslationalModelica as TM
529
573
using ModelingToolkitStandardLibrary. Blocks: Constant
530
574
531
- @named mass = Mass (; m = 1.0 , s = 1.0 , v = 0.0 , a = 0.0 )
575
+ @named mass = TM . Mass (; m = 1.0 , s = 1.0 , v = 0.0 , a = 0.0 )
532
576
@named fixed = Fixed (; s0 = 0.0 )
533
- @named spring = Spring (; c = 2.0 )
577
+ @named spring = Spring (; c = 2.0 , s_rel0 = nothing )
534
578
@named gravity = Force ()
535
579
@named constant = Constant (; k = 9.81 )
536
- @named damper = Damper (; d = 0.1 )
580
+ @named damper = TM . Damper (; d = 0.1 )
537
581
@mtkbuild sys = ODESystem (
538
582
[connect (fixed. flange, spring. flange_a), connect (spring. flange_b, mass. flange_a),
539
583
connect (mass. flange_a, gravity. flange), connect (constant. output, gravity. f),
0 commit comments