Skip to content

Commit 7a66a4f

Browse files
committed
init
1 parent 13ab6d9 commit 7a66a4f

File tree

4 files changed

+429
-52
lines changed

4 files changed

+429
-52
lines changed

src/ModelingToolkit.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,9 @@ export build_function
258258
export modelingtoolkitize
259259
export generate_initializesystem
260260

261+
export alg_equations, diff_equations, has_alg_equations, has_diff_equations
262+
export get_alg_eqs, get_diff_eqs, has_alg_eqs,has_diff_eqs
263+
261264
export @variables, @parameters, @constants, @brownian
262265
export @named, @nonamespace, @namespace, extend, compose, complete
263266
export debug_system

src/systems/abstractsystem.jl

Lines changed: 236 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2384,3 +2384,239 @@ function dump_unknowns(sys::AbstractSystem)
23842384
meta
23852385
end
23862386
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

Comments
 (0)