@@ -51,10 +51,24 @@ function liouville_transform(sys::AbstractODESystem; kwargs...)
51
51
end
52
52
53
53
function change_independent_variable (sys:: AbstractODESystem , iv, eq = nothing ; verbose = false , simplify = true , dummies = false , kwargs... )
54
+ if ! iscomplete (sys)
55
+ error (" Cannot change independent variable of incomplete system $(nameof (sys)) " )
56
+ elseif isscheduled (sys)
57
+ error (" Cannot change independent variable of structurally simplified system $(nameof (sys)) " )
58
+ elseif ! isempty (get_systems (sys))
59
+ error (" Cannot change independent variable of hierarchical system $(nameof (sys)) . Flatten it first." ) # TODO : implement
60
+ end
61
+
62
+ iv = unwrap (iv)
54
63
iv1 = get_iv (sys) # e.g. t
55
- iv2name = nameof (operation (unwrap (iv))) # TODO : handle namespacing?
64
+
65
+ if ! iscall (iv) || ! isequal (only (arguments (iv)), iv1)
66
+ error (" New independent variable $iv is not a function of the independent variable $iv1 of the system $(nameof (sys)) " )
67
+ end
68
+
69
+ iv2func = iv # e.g. a(t)
70
+ iv2name = nameof (operation (iv))
56
71
iv2, = @independent_variables $ iv2name # e.g. a
57
- iv2func, = @variables $ iv2name (iv1) # e.g. a(t)
58
72
D1 = Differential (iv1)
59
73
D2 = Differential (iv2)
60
74
@@ -98,8 +112,12 @@ function change_independent_variable(sys::AbstractODESystem, iv, eq = nothing; v
98
112
end
99
113
end
100
114
101
- isnothing (div2_div1) && error (" No equation for $D1 ($iv2func ) was specified." )
102
115
verbose && println (" Found $div2 = $div2_div1 " )
116
+ if isnothing (div2_div1)
117
+ error (" No equation for $D1 ($iv2func ) was specified." )
118
+ elseif isequal (div2_div1, 0 )
119
+ error (" Cannot change independent variable from $iv1 to $iv2 with singular transformation $(div2 ~ div2_div1) ." )
120
+ end
103
121
104
122
# 3) Add equations for dummy variables
105
123
div1_div2 = 1 / div2_div1
0 commit comments