Skip to content

Commit a867ee6

Browse files
authored
Merge pull request #1 from aytekinar/5-base-patch
Fix `c2d` for the new type system
2 parents e7c1a55 + 101af65 commit a867ee6

File tree

1 file changed

+88
-34
lines changed

1 file changed

+88
-34
lines changed

src/c2d.jl

+88-34
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,18 @@ module Discretization
22

33
using Compat
44
using SystemsBase
5-
import SystemsBase: LtiSystem, StateSpace, RationalTF
5+
using SystemsBase: LtiSystem, StateSpace, RationalTF
66

7+
# Method abstraction
78
abstract Method
89

10+
# Zero-Order-Hold
911
immutable ZOH <: Method
1012
end
1113

12-
@compat function (m::ZOH){T}(s::StateSpace{Val{T}}, Ts::Real)
13-
A, B, C, D = s.A, s.B, s.C, s.D
14-
ny, nu = size(s)
14+
@compat function (m::ZOH)(A::AbstractMatrix, B::AbstractMatrix, C::AbstractMatrix,
15+
D::AbstractMatrix, Ts::Real)
16+
ny, nu = size(D)
1517
nx = size(A,1)
1618
M = expm([A*Ts B*Ts;
1719
zeros(nu, nx + nu)])
@@ -20,16 +22,28 @@ end
2022
Cd = C
2123
Dd = D
2224
x0map = [speye(nx) spzeros(nx, nu)]
25+
Ad, Bd, Cd, Dd, Ts, x0map
26+
end
27+
@compat function (m::ZOH)(s::StateSpace{Val{:siso},Val{:cont}}, Ts::Real)
28+
Ad, Bd, Cd, Dd, Ts, x0map = m(s.A, s.B, s.C, s.D, Ts)
29+
ss(Ad, Bd, Cd, Dd[1], Ts), x0map
30+
end
31+
@compat function (m::ZOH)(s::StateSpace{Val{:mimo},Val{:cont}}, Ts::Real)
32+
Ad, Bd, Cd, Dd, Ts, x0map = m(s.A, s.B, s.C, s.D, Ts)
2333
ss(Ad, Bd, Cd, Dd, Ts), x0map
2434
end
25-
@compat (m::ZOH)(s::LtiSystem, Ts::Real) = (m::ZOH)(ss(s), Ts)[1]
35+
@compat (m::ZOH){T}(s::RationalTF{Val{T},Val{:cont}}, Ts::Real) =
36+
tf(m(ss(s), Ts)[1])
37+
@compat (m::ZOH){T}(s::LtiSystem{Val{T},Val{:cont}}, Ts::Real) =
38+
m(ss(s), Ts)[1]
2639

40+
# First-Order-Hold
2741
immutable FOH <: Method
2842
end
2943

30-
@compat function (m::FOH){T}(s::StateSpace{Val{T}}, Ts::Real)
31-
A, B, C, D = s.A, s.B, s.C, s.D
32-
ny, nu = size(s)
44+
@compat function (m::FOH)(A::AbstractMatrix, B::AbstractMatrix, C::AbstractMatrix,
45+
D::AbstractMatrix, Ts::Real)
46+
ny, nu = size(D)
3347
nx = size(A,1)
3448
M = expm([A*Ts B*Ts zeros(nx, nu);
3549
zeros(nu, nx + nu) eye(nu);
@@ -41,68 +55,112 @@ end
4155
Cd = C
4256
Dd = D + C*M2
4357
x0map = [speye(nx) -M2]
58+
Ad, Bd, Cd, Dd, Ts, x0map
59+
end
60+
@compat function (m::FOH)(s::StateSpace{Val{:siso},Val{:cont}}, Ts::Real)
61+
Ad, Bd, Cd, Dd, Ts, x0map = m(s.A, s.B, s.C, s.D, Ts)
62+
ss(Ad, Bd, Cd, Dd[1], Ts), x0map
63+
end
64+
@compat function (m::FOH)(s::StateSpace{Val{:mimo},Val{:cont}}, Ts::Real)
65+
Ad, Bd, Cd, Dd, Ts, x0map = m(s.A, s.B, s.C, s.D, Ts)
4466
ss(Ad, Bd, Cd, Dd, Ts), x0map
4567
end
46-
@compat (m::FOH)(s::LtiSystem, Ts::Real) = (m::FOH)(ss(s), Ts)[1]
68+
@compat (m::FOH){T}(s::RationalTF{Val{T},Val{:cont}}, Ts::Real) =
69+
tf(m(ss(s), Ts)[1])
70+
@compat (m::FOH){T}(s::LtiSystem{Val{T},Val{:cont}}, Ts::Real) =
71+
m(ss(s), Ts)[1]
4772

48-
49-
immutable GeneralizedBilinear{T} <: Method
73+
# Generalized Bilinear Transformation
74+
immutable Bilinear{T<:Real} <: Method
5075
α::T
51-
@compat function (::Type{GeneralizedBilinear}){T}(α::T = 0.5)
52-
@assert α 0. && α 1. "GeneralizedBilinear: α must be between 0 and 1"
76+
@compat function (::Type{Bilinear}){T}(α::T = 0.5)
77+
@assert α 0. && α 1. "Bilinear: α must be between 0 and 1"
5378
new{T}(α)
5479
end
5580
end
5681

57-
@compat function (m::GeneralizedBilinear){T}(s::StateSpace{Val{T}}, Ts::Real)
58-
A, B, C, D = s.A, s.B, s.C, s.D
59-
ny, nu = size(s)
82+
@compat function (m::Bilinear)(A::AbstractMatrix, B::AbstractMatrix,
83+
C::AbstractMatrix, D::AbstractMatrix, Ts::Real)
84+
ny, nu = size(D)
6085
nx = size(A,1)
6186
α = m.α
6287
ima = I - α*Ts*A
6388
Ad = ima\(I + (1.0-α)*Ts*A)
6489
Bd = ima\(Ts*B)
6590
Cd = (ima.'\C.').'
6691
Dd = D + α*(C*Bd)
67-
x0map = [speye(nx) zeros(nx, nu)]
92+
x0map = [speye(nx) spzeros(nx, nu)]
93+
Ad, Bd, Cd, Dd, Ts, x0map
94+
end
95+
@compat function (m::Bilinear)(s::StateSpace{Val{:siso},Val{:cont}}, Ts::Real)
96+
Ad, Bd, Cd, Dd, Ts, x0map = m(s.A, s.B, s.C, s.D, Ts)
97+
ss(Ad, Bd, Cd, Dd[1], Ts), x0map
98+
end
99+
@compat function (m::Bilinear)(s::StateSpace{Val{:mimo},Val{:cont}}, Ts::Real)
100+
Ad, Bd, Cd, Dd, Ts, x0map = m(s.A, s.B, s.C, s.D, Ts)
68101
ss(Ad, Bd, Cd, Dd, Ts), x0map
69102
end
70-
@compat (m::GeneralizedBilinear)(s::LtiSystem, Ts::Real) =
71-
(m::GeneralizedBilinear)(sys(s), Ts)[1]
72-
103+
@compat (m::Bilinear){T}(s::RationalTF{Val{T},Val{:cont}}, Ts::Real) =
104+
tf(m(ss(s), Ts)[1])
105+
@compat (m::Bilinear){T}(s::LtiSystem{Val{T},Val{:cont}}, Ts::Real) =
106+
m(ss(s), Ts)[1]
73107

108+
# Forward Euler
74109
immutable ForwardEuler <: Method
75110
end
76111

77-
@compat function (m::ForwardEuler){T}(s::StateSpace{Val{T}}, Ts::Real)
78-
A, B, C, D = s.A, s.B, s.C, s.D
79-
ny, nu = size(s)
112+
@compat function (m::ForwardEuler)(A::AbstractMatrix, B::AbstractMatrix,
113+
C::AbstractMatrix, D::AbstractMatrix, Ts::Real)
114+
ny, nu = size(D)
80115
nx = size(A,1)
81116
Ad = I + Ts*A
82117
Bd = Ts*B
83118
Cd = C
84119
Dd = D
85-
x0map = [eye(nx) zeros(nx, nu)]
120+
x0map = [speye(nx) spzeros(nx, nu)]
121+
Ad, Bd, Cd, Dd, Ts, x0map
122+
end
123+
@compat function (m::ForwardEuler)(s::StateSpace{Val{:siso},Val{:cont}}, Ts::Real)
124+
Ad, Bd, Cd, Dd, Ts, x0map = m(s.A, s.B, s.C, s.D, Ts)
125+
ss(Ad, Bd, Cd, Dd[1], Ts), x0map
126+
end
127+
@compat function (m::ForwardEuler)(s::StateSpace{Val{:mimo},Val{:cont}}, Ts::Real)
128+
Ad, Bd, Cd, Dd, Ts, x0map = m(s.A, s.B, s.C, s.D, Ts)
86129
ss(Ad, Bd, Cd, Dd, Ts), x0map
87130
end
88-
@compat (m::ForwardEuler)(s::LtiSystem, Ts::Real) = (m::ForwardEuler)(ss(s), Ts)[1]
131+
@compat (m::ForwardEuler){T}(s::RationalTF{Val{T},Val{:cont}}, Ts::Real) =
132+
tf(m(ss(s), Ts)[1])
133+
@compat (m::ForwardEuler){T}(s::LtiSystem{Val{T},Val{:cont}}, Ts::Real) =
134+
m(ss(s), Ts)[1]
89135

136+
# Backward Euler
90137
immutable BackwardEuler <: Method
91138
end
92139

93-
@compat function (m::BackwardEuler){T}(s::StateSpace{Val{T}}, Ts::Real)
94-
A, B, C, D = s.A, s.B, s.C, s.D
95-
ny, nu = size(s)
140+
@compat function (m::BackwardEuler)(A::AbstractMatrix, B::AbstractMatrix,
141+
C::AbstractMatrix, D::AbstractMatrix, Ts::Real)
142+
ny, nu = size(D)
96143
nx = size(A,1)
97144
ima = I - Ts*A
98145
Ad = ima\eye(nx)
99146
Bd = ima\(Ts*B)
100147
Cd = (ima.'\C.').'
101148
Dd = D + C*Bd
102-
x0map = [eye(nx) zeros(nx, nu)]
149+
x0map = [speye(nx) spzeros(nx, nu)]
150+
Ad, Bd, Cd, Dd, Ts, x0map
151+
end
152+
@compat function (m::BackwardEuler)(s::StateSpace{Val{:siso},Val{:cont}}, Ts::Real)
153+
Ad, Bd, Cd, Dd, Ts, x0map = m(s, Ts)
154+
ss(Ad, Bd, Cd, Dd[1], Ts), x0map
155+
end
156+
@compat function (m::BackwardEuler)(s::StateSpace{Val{:mimo},Val{:cont}}, Ts::Real)
157+
Ad, Bd, Cd, Dd, Ts, x0map = m(s, Ts)
103158
ss(Ad, Bd, Cd, Dd, Ts), x0map
104159
end
105-
@compat (m::BackwardEuler)(s::LtiSystem, Ts::Real) = (m::BackwardEuler)(ss(s), Ts)[1]
160+
@compat (m::BackwardEuler){T}(s::RationalTF{Val{T},Val{:cont}}, Ts::Real) =
161+
tf(m(ss(s), Ts)[1])
162+
@compat (m::BackwardEuler){T}(s::LtiSystem{Val{T},Val{:cont}}, Ts::Real) =
163+
m(ss(s), Ts)[1]
106164

107165
end
108166

@@ -153,7 +211,3 @@ function c2d{T}(s::LtiSystem{T,Val{:cont}}, Ts::Real,
153211
method(s, Ts)::LtiSystem{T,Val{:disc}}
154212
end
155213
c2d{T}(method::Function, s::LtiSystem{T,Val{:cont}}, Ts::Real) = c2d(s, Ts, method)
156-
157-
# Zhai, Guisheng, et al. "An extension of generalized bilinear transformation for digital redesign."
158-
# International Journal of Innovative Computing, Information and Control 8.6 (2012): 4071-4081.
159-
# http://www.ijicic.org/icmic10-ijicic-03.pdf

0 commit comments

Comments
 (0)