@@ -2384,3 +2384,239 @@ function dump_unknowns(sys::AbstractSystem)
2384
2384
meta
2385
2385
end
2386
2386
end
2387
+
2388
+ # ## Functions for accessing algebraic/differential equations in systems ###
2389
+
2390
+ """
2391
+ is_diff_equation(eq)
2392
+
2393
+ Returns `true` if the input is a differential equation, i.e. is an equatation that contain some
2394
+ form of differential.
2395
+
2396
+ Example:
2397
+ ```julia
2398
+ using ModelingToolkit
2399
+ import ModelingToolkit: t as nounits_t, D as nounits_D
2400
+ @parameters p d
2401
+ @variables X(t)
2402
+ eq1 = D(X) ~ p - d*X
2403
+ eq2 = 0 ~ p - d*X
2404
+
2405
+ is_diff_equation(eq1) # true
2406
+ is_diff_equation(eq2) # false
2407
+ ```
2408
+ """
2409
+ function is_diff_equation (eq)
2410
+ (eq isa Equation) || (return false )
2411
+ isdefined (eq, :lhs ) && occursin (is_derivative, wrap (eq. lhs)) && (return true )
2412
+ isdefined (eq, :rhs ) && occursin (is_derivative, wrap (eq. rhs)) && (return true )
2413
+ return false
2414
+ end
2415
+
2416
+ """
2417
+ is_alg_equation(eq)
2418
+
2419
+ Returns `true` if the input is an algebraic equation, i.e. is an equatation that does not contain
2420
+ any differentials.
2421
+
2422
+ Example:
2423
+ ```julia
2424
+ using ModelingToolkit
2425
+ import ModelingToolkit: t as nounits_t, D as nounits_D
2426
+ @parameters p d
2427
+ @variables X(t)
2428
+ eq1 = D(X) ~ p - d*X
2429
+ eq2 = 0 ~ p - d*X
2430
+
2431
+ is_alg_equation(eq1) # false
2432
+ is_alg_equation(eq2) # true
2433
+ ```
2434
+ """
2435
+ function is_alg_equation (eq)
2436
+ return (eq isa Equation) && ! is_diff_equation (eq)
2437
+ end
2438
+
2439
+ """
2440
+ alg_equations(sys::AbstractSystem)
2441
+
2442
+ For a system, returns a vector of all its algebraic equations (i.e. that does not contain any
2443
+ differentials).
2444
+
2445
+ Example:
2446
+ ```julia
2447
+ using ModelingToolkit
2448
+ import ModelingToolkit: t as nounits_t, D as nounits_D
2449
+ @parameters p d
2450
+ @variables X(t)
2451
+ eq1 = D(X) ~ p - d*X
2452
+ eq2 = 0 ~ p - d*X
2453
+ @named osys = ODESystem([eq1, eq2], t)
2454
+
2455
+ alg_equations(osys) # returns `0 ~ p - d*X(t)`.
2456
+ """
2457
+ alg_equations (sys:: AbstractSystem ) = filter (is_alg_equation, equations (sys))
2458
+
2459
+ """
2460
+ diff_equations(sys::AbstractSystem)
2461
+
2462
+ For a system, returns a vector of all its differential equations (i.e. that does contain a differential).
2463
+
2464
+ Example:
2465
+ ```julia
2466
+ using ModelingToolkit
2467
+ import ModelingToolkit: t as nounits_t, D as nounits_D
2468
+ @parameters p d
2469
+ @variables X(t)
2470
+ eq1 = D(X) ~ p - d*X
2471
+ eq2 = 0 ~ p - d*X
2472
+ @named osys = ODESystem([eq1, eq2], t)
2473
+
2474
+ diff_equations(osys) # returns `Differential(t)(X(t)) ~ p - d*X(t)`.
2475
+ """
2476
+ diff_equations (sys:: AbstractSystem ) = filter (is_diff_equation, equations (sys))
2477
+
2478
+ """
2479
+ has_alg_equations(sys::AbstractSystem)
2480
+
2481
+ For a system, returns true if it contain at least one algebraic equation (i.e. that does not contain any
2482
+ differentials).
2483
+
2484
+ Example:
2485
+ ```julia
2486
+ using ModelingToolkit
2487
+ import ModelingToolkit: t as nounits_t, D as nounits_D
2488
+ @parameters p d
2489
+ @variables X(t)
2490
+ eq1 = D(X) ~ p - d*X
2491
+ eq2 = 0 ~ p - d*X
2492
+ @named osys1 = ODESystem([eq1], t)
2493
+ @named osys2 = ODESystem([eq2], t)
2494
+
2495
+ has_alg_equations(osys1) # returns `false`.
2496
+ has_alg_equations(osys2) # returns `true`.
2497
+ ```
2498
+ """
2499
+ has_alg_equations (sys:: AbstractSystem ) = any (is_alg_equation, equations (sys))
2500
+
2501
+ """
2502
+ has_diff_equations(sys::AbstractSystem)
2503
+
2504
+ For a system, returns true if it contain at least one differential equation (i.e. that contain a differential).
2505
+
2506
+ Example:
2507
+ ```julia
2508
+ using ModelingToolkit
2509
+ import ModelingToolkit: t as nounits_t, D as nounits_D
2510
+ @parameters p d
2511
+ @variables X(t)
2512
+ eq1 = D(X) ~ p - d*X
2513
+ eq2 = 0 ~ p - d*X
2514
+ @named osys1 = ODESystem([eq1], t)
2515
+ @named osys2 = ODESystem([eq2], t)
2516
+
2517
+ has_diff_equations(osys1) # returns `true`.
2518
+ has_diff_equations(osys2) # returns `false`.
2519
+ ```
2520
+ """
2521
+ has_diff_equations (sys:: AbstractSystem ) = any (is_diff_equation, equations (sys))
2522
+
2523
+
2524
+ """
2525
+ get_alg_eqs(sys::AbstractSystem)
2526
+
2527
+ For a system, returns a vector of all algebraic equations (i.e. that does not contain any
2528
+ differentials) in its *top-level system*.
2529
+
2530
+ Example:
2531
+ ```julia
2532
+ using ModelingToolkit
2533
+ import ModelingToolkit: t as nounits_t, D as nounits_D
2534
+ @parameters p d
2535
+ @variables X(t)
2536
+ eq1 = D(X) ~ p - d*X
2537
+ eq2 = 0 ~ p - d*X
2538
+ @named osys1 = ODESystem([eq1], t)
2539
+ @named osys2 = ODESystem([eq2], t)
2540
+ osys12 = compose(osys1, [osys2])
2541
+ osys21 = compose(osys2, [osys1])
2542
+
2543
+ get_alg_eqs(osys12) # returns `Equation[]`.
2544
+ get_alg_eqs(osys21) # returns `[0 ~ p - d*X(t)]`.
2545
+ ```
2546
+ """
2547
+ get_alg_eqs (sys:: AbstractSystem ) = filter (is_alg_equation, get_eqs (sys))
2548
+
2549
+ """
2550
+ get_diff_eqs(sys::AbstractSystem)
2551
+
2552
+ For a system, returns a vector of all differential equations (i.e. that does contain a differential)
2553
+ in its *top-level system*.
2554
+
2555
+ Example:
2556
+ ```julia
2557
+ using ModelingToolkit
2558
+ import ModelingToolkit: t as nounits_t, D as nounits_D
2559
+ @parameters p d
2560
+ @variables X(t)
2561
+ eq1 = D(X) ~ p - d*X
2562
+ eq2 = 0 ~ p - d*X
2563
+ @named osys1 = ODESystem([eq1], t)
2564
+ @named osys2 = ODESystem([eq2], t)
2565
+ osys12 = compose(osys1, [osys2])
2566
+ osys21 = compose(osys2, [osys1])
2567
+
2568
+ get_diff_eqs(osys12) # returns `[Differential(t)(X(t)) ~ p - d*X(t)]`.
2569
+ get_diff_eqs(osys21) # returns `Equation[]``.
2570
+ ```
2571
+ """
2572
+ get_diff_eqs (sys:: AbstractSystem ) = filter (is_diff_equation, get_eqs (sys))
2573
+
2574
+ """
2575
+ has_alg_eqs(sys::AbstractSystem)
2576
+
2577
+ For a system, returns true if it contain at least one algebraic equation (i.e. that does not contain any
2578
+ differentials) in its *top-level system*.
2579
+
2580
+ Example:
2581
+ ```julia
2582
+ using ModelingToolkit
2583
+ import ModelingToolkit: t as nounits_t, D as nounits_D
2584
+ @parameters p d
2585
+ @variables X(t)
2586
+ eq1 = D(X) ~ p - d*X
2587
+ eq2 = 0 ~ p - d*X
2588
+ @named osys1 = ODESystem([eq1], t)
2589
+ @named osys2 = ODESystem([eq2], t)
2590
+ osys12 = compose(osys1, [osys2])
2591
+ osys21 = compose(osys2, [osys1])
2592
+
2593
+ has_alg_eqs(osys12) # returns `false`.
2594
+ has_alg_eqs(osys21) # returns `true`.
2595
+ ```
2596
+ """
2597
+ has_alg_eqs (sys:: AbstractSystem ) = any (is_alg_equation, get_eqs (sys))
2598
+
2599
+ """
2600
+ has_diff_eqs(sys::AbstractSystem)
2601
+
2602
+ For a system, returns true if it contain at least one differential equation (i.e. that contain a
2603
+ differential) in its *top-level system*.
2604
+
2605
+ Example:
2606
+ ```julia
2607
+ using ModelingToolkit
2608
+ import ModelingToolkit: t as nounits_t, D as nounits_D
2609
+ @parameters p d
2610
+ @variables X(t)
2611
+ eq1 = D(X) ~ p - d*X
2612
+ eq2 = 0 ~ p - d*X
2613
+ @named osys1 = ODESystem([eq1], t)
2614
+ @named osys2 = ODESystem([eq2], t)
2615
+ osys12 = compose(osys1, [osys2])
2616
+ osys21 = compose(osys2, [osys1])
2617
+
2618
+ has_diff_eqs(osys12) # returns `true`.
2619
+ has_diff_eqs(osys21) # returns `false`.
2620
+ ```
2621
+ """
2622
+ has_diff_eqs (sys:: AbstractSystem ) = any (is_diff_equation, get_eqs (sys))
0 commit comments