You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardexpand all lines: lib/ControlSystemsBase/src/discrete.jl
+3-3
Original file line number
Diff line number
Diff line change
@@ -21,7 +21,7 @@ ZoH sampling is exact for linear systems with piece-wise constant inputs (step i
21
21
22
22
FoH sampling is exact for linear systems with piece-wise linear inputs (ramp invariant), this is a good choice for simulation of systems with smooth continuous inputs.
23
23
24
-
To approximate the behavior of a continuous-time system well in the frequency domain, the `:tustin` (trapezoidal / bilinear) method may be most appropriate. In this case, the pre-warping argument can be used to ensure that the frequency response of the discrete-time system matches the continuous-time system at a given frequency. The tustin transformation alters the meaning of the state components, while ZoH and FoH preserve the meaning of the state components. The Tustin method is commonly used to discretize a continuous-tiem controller.
24
+
To approximate the behavior of a continuous-time system well in the frequency domain, the `:tustin` (trapezoidal / bilinear) method may be most appropriate. In this case, the pre-warping argument can be used to ensure that the frequency response of the discrete-time system matches the continuous-time system at a given frequency. The tustin transformation alters the meaning of the state components, while ZoH and FoH preserve the meaning of the state components. The Tustin method is commonly used to discretize a continuous-time controller.
25
25
26
26
The forward-Euler method generally requires the sample time to be very small
27
27
relative to the time constants of the system, and its use is generally discouraged.
@@ -99,8 +99,8 @@ function d2c(sys::AbstractStateSpace{<:Discrete}, method::Symbol=:zoh; w_prewarp
Compute `sys1 / sys2 = sys1 * inv(sys2)` in a way that tries to handle situations in which the inverse `sys2` is non-proper, but the resulting system `sys1 / sys2` is proper.
387
+
388
+
See `ControlSystemsBase.MatrixPencils.isregular` for keyword arguments `atol`, `atol1`, `atol2`, and `rtol`.
389
+
"""
390
+
function Base.:(/)(sys1::AbstractStateSpace{TE}, sys2::AbstractStateSpace{TE};
rtol::Real=max(size(sys1.A,1),size(sys2.A,1))*eps(real(float(one(numeric_type(sys1)))))*iszero(min(atol1,atol2))) where {TE<:ControlSystemsBase.TimeEvolution}
393
+
T1 =float(numeric_type(sys1))
394
+
T2 =float(numeric_type(sys2))
395
+
T =promote_type(T1,T2)
396
+
timeevol =common_timeevol(sys1, sys2)
397
+
ny2, nu2 = sys2.ny, sys2.nu
398
+
nu2 == ny2 ||error("The system sys2 must be square")
399
+
ny1, nu1 = sys1.ny, sys1.nu
400
+
nu1 == nu2 ||error("The systems sys1 and sys2 must have the same number of inputs")
401
+
nx1 = sys1.nx
402
+
nx2 = sys2.nx
403
+
if nx2 >0
404
+
A, B, C, D =ssdata([sys2; sys1])
405
+
Ai = [A B; C[1:ny2,:] D[1:ny2,:]]
406
+
Ei = [I zeros(T,nx1+nx2,ny2); zeros(T,ny2,nx1+nx2+ny2)] |> Matrix #TODO: rm call to Matrix when type piracy in https://github.com/JuliaLinearAlgebra/LinearMaps.jl/issues/219 is fixed
Bi = [zeros(T,nx1+nx2,nu1); -I] |> Matrix #TODO: rm call to Matrix when type piracy in https://github.com/JuliaLinearAlgebra/LinearMaps.jl/issues/219 is fixed
411
+
Di =zeros(T,ny1,nu1)
412
+
Ai, Ei, Bi, Ci, Di = MatrixPencils.lsminreal(Ai, Ei, Bi, Ci, Di; fast =true, atol1 =0, atol2, rtol, contr =true, obs =true, noseig =true)
413
+
if Ei != I
414
+
luE =lu!(Ei, check=false)
415
+
issuccess(luE) ||throw(ArgumentError("The system sys2 is not invertible"))
function/(n::Number, sys::ST) where ST <:AbstractStateSpace
384
432
# Ensure s.D is invertible
385
433
A, B, C, D =ssdata(sys)
434
+
size(D, 1) ==size(D, 2) ||error("The inverted system must have the same number of inputs and outputs")
386
435
Dinv =try
387
436
inv(D)
388
437
catch
389
-
error("D isn't invertible")
438
+
error("D isn't invertible. If you are trying to form a quotient between two systems `N(s) / D(s)` where the quotient is proper but the inverse of `D(s)` isn't, consider calling `N / D` instead of `N * inv(D)")
0 commit comments