@@ -1553,9 +1553,66 @@ end
1553
1553
@test all (x -> any (isapprox (x, atol = 1e-6 ), sol2. t), expected_tstops)
1554
1554
end
1555
1555
1556
- let
1556
+ @testset " Validate input types " begin
1557
1557
@parameters p d
1558
1558
@variables X (t):: Int64
1559
1559
eq = D (X) ~ p - d* X
1560
1560
@test_throws Exception @mtkbuild osys = ODESystem ([eq], t)
1561
1561
end
1562
+
1563
+ @testset " dae_order_lowering basic test" begin
1564
+ @parameters a
1565
+ @variables x (t) y (t) z (t)
1566
+ @named dae_sys = ODESystem ([
1567
+ D (x) ~ y,
1568
+ 0 ~ x + z,
1569
+ 0 ~ x - y + z
1570
+ ], t, [z, y, x], [])
1571
+
1572
+ lowered_dae_sys = dae_order_lowering (dae_sys)
1573
+ @variables x1 (t) y1 (t) z1 (t)
1574
+ expected_eqs = [
1575
+ 0 ~ x + z,
1576
+ 0 ~ x - y + z,
1577
+ Differential (t)(x) ~ y
1578
+ ]
1579
+ lowered_eqs = equations (lowered_dae_sys)
1580
+ sorted_lowered_eqs = sort (lowered_eqs, by= string)
1581
+ sorted_expected_eqs = sort (expected_eqs, by= string)
1582
+ @test sorted_lowered_eqs == sorted_expected_eqs
1583
+
1584
+ expected_vars = Set ([z, y, x])
1585
+ lowered_vars = Set (unknowns (lowered_dae_sys))
1586
+ @test lowered_vars == expected_vars
1587
+ end
1588
+
1589
+ @testset " dae_order_lowering test with structural_simplify" begin
1590
+ @variables x (t) y (t) z (t)
1591
+ @parameters M b k
1592
+ eqs = [
1593
+ D (D (x)) ~ - b / M * D (x) - k / M * x,
1594
+ 0 ~ y - D (x),
1595
+ 0 ~ z - x
1596
+ ]
1597
+ ps = [M, b, k]
1598
+ default_u0 = [
1599
+ D (x) => 0.0 , x => 10.0 , y => 0.0 , z => 10.0
1600
+ ]
1601
+ default_p = [M => 1.0 , b => 1.0 , k => 1.0 ]
1602
+ @named dae_sys = ODESystem (eqs, t, [x, y, z], ps; defaults = [default_u0; default_p])
1603
+
1604
+ simplified_dae_sys = structural_simplify (dae_sys)
1605
+
1606
+ lowered_dae_sys = dae_order_lowering (simplified_dae_sys)
1607
+ lowered_dae_sys = complete (lowered_dae_sys)
1608
+
1609
+ tspan = (0.0 , 10.0 )
1610
+ prob = ODEProblem (lowered_dae_sys, nothing , tspan)
1611
+ sol = solve (prob, Tsit5 ())
1612
+
1613
+ @test sol. t[end ] == tspan[end ]
1614
+ @test sum (abs, sol. u[end ]) < 1
1615
+
1616
+ prob = ODEProblem {false} (lowered_dae_sys; u0_constructor = x -> SVector (x... ))
1617
+ @test prob. u0 isa SVector
1618
+ end
0 commit comments