@@ -2,16 +2,18 @@ module Discretization
2
2
3
3
using Compat
4
4
using SystemsBase
5
- import SystemsBase: LtiSystem, StateSpace, RationalTF
5
+ using SystemsBase: LtiSystem, StateSpace, RationalTF
6
6
7
+ # Method abstraction
7
8
abstract Method
8
9
10
+ # Zero-Order-Hold
9
11
immutable ZOH <: Method
10
12
end
11
13
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 )
15
17
nx = size (A,1 )
16
18
M = expm ([A* Ts B* Ts;
17
19
zeros (nu, nx + nu)])
20
22
Cd = C
21
23
Dd = D
22
24
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)
23
33
ss (Ad, Bd, Cd, Dd, Ts), x0map
24
34
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 ]
26
39
40
+ # First-Order-Hold
27
41
immutable FOH <: Method
28
42
end
29
43
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 )
33
47
nx = size (A,1 )
34
48
M = expm ([A* Ts B* Ts zeros (nx, nu);
35
49
zeros (nu, nx + nu) eye (nu);
41
55
Cd = C
42
56
Dd = D + C* M2
43
57
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)
44
66
ss (Ad, Bd, Cd, Dd, Ts), x0map
45
67
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 ]
47
72
48
-
49
- immutable GeneralizedBilinear{T } <: Method
73
+ # Generalized Bilinear Transformation
74
+ immutable Bilinear{T <: Real } <: Method
50
75
α:: 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"
53
78
new {T} (α)
54
79
end
55
80
end
56
81
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 )
60
85
nx = size (A,1 )
61
86
α = m. α
62
87
ima = I - α* Ts* A
63
88
Ad = ima\ (I + (1.0 - α)* Ts* A)
64
89
Bd = ima\ (Ts* B)
65
90
Cd = (ima.' \ C.' ).'
66
91
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)
68
101
ss (Ad, Bd, Cd, Dd, Ts), x0map
69
102
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 ]
73
107
108
+ # Forward Euler
74
109
immutable ForwardEuler <: Method
75
110
end
76
111
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 )
80
115
nx = size (A,1 )
81
116
Ad = I + Ts* A
82
117
Bd = Ts* B
83
118
Cd = C
84
119
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)
86
129
ss (Ad, Bd, Cd, Dd, Ts), x0map
87
130
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 ]
89
135
136
+ # Backward Euler
90
137
immutable BackwardEuler <: Method
91
138
end
92
139
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 )
96
143
nx = size (A,1 )
97
144
ima = I - Ts* A
98
145
Ad = ima\ eye (nx)
99
146
Bd = ima\ (Ts* B)
100
147
Cd = (ima.' \ C.' ).'
101
148
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)
103
158
ss (Ad, Bd, Cd, Dd, Ts), x0map
104
159
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 ]
106
164
107
165
end
108
166
@@ -153,7 +211,3 @@ function c2d{T}(s::LtiSystem{T,Val{:cont}}, Ts::Real,
153
211
method (s, Ts):: LtiSystem{T,Val{:disc}}
154
212
end
155
213
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