Skip to content

Commit 498d95a

Browse files
author
RBdC
committed
update: control, GBN and validation
updated file functionset (GBN and validation) updated models (solved issues about version of control) updated examples accordingly
1 parent 0669ec0 commit 498d95a

12 files changed

+237
-89
lines changed

.travis.yml

+1
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,4 @@ script:
1919
- python ARMAX.py
2020
- python ARX_MIMO.py
2121
- python SS.py
22+
- python example_CST.py

Examples/ARMAX.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
# ## Define pseudo random binary sequence as input signal and white noise as noise signal
2525

2626
switch_probability = 0.08 # [0..1]
27-
Usim = fset.GBN_seq(npts, switch_probability)
27+
[Usim,_,_] = fset.GBN_seq(npts, switch_probability)
2828
white_noise_variance = [0.005]
2929
e_t = fset.white_noise_var(Usim.size, white_noise_variance)[0]
3030

@@ -139,7 +139,7 @@
139139

140140
switch_probability = 0.07 # [0..1]
141141
input_range = [0.5, 1.5]
142-
U_valid = fset.GBN_seq(npts, switch_probability, input_range)
142+
[U_valid,_,_] = fset.GBN_seq(npts, switch_probability, Range = input_range)
143143
white_noise_variance = [0.01]
144144
e_valid = fset.white_noise_var(U_valid.size, white_noise_variance)[0]
145145

Examples/ARMAX_MIMO.py

+10-10
Original file line numberDiff line numberDiff line change
@@ -109,10 +109,10 @@
109109
# #INPUT#
110110
Usim = np.zeros((4, npts))
111111
Usim_noise = np.zeros((4, npts))
112-
Usim[0, :] = fset.GBN_seq(npts, 0.03, [-0.33, 0.1])
113-
Usim[1, :] = fset.GBN_seq(npts, 0.03)
114-
Usim[2, :] = fset.GBN_seq(npts, 0.03, [2.3, 5.7])
115-
Usim[3, :] = fset.GBN_seq(npts, 0.03, [8., 11.5])
112+
[Usim[0, :],_,_] = fset.GBN_seq(npts, 0.03, Range = [-0.33, 0.1])
113+
[Usim[1, :],_,_] = fset.GBN_seq(npts, 0.03)
114+
[Usim[2, :],_,_] = fset.GBN_seq(npts, 0.03, Range = [2.3, 5.7])
115+
[Usim[3, :],_,_] = fset.GBN_seq(npts, 0.03, Range = [8., 11.5])
116116

117117
# Adding noise
118118
err_inputH = np.zeros((4, npts))
@@ -207,7 +207,7 @@
207207
plt.grid()
208208
plt.ylabel("Input 1 GBN")
209209
plt.xlabel("Time")
210-
plt.title("Input (Switch probability=0.03)")
210+
plt.title("Input (Switch probability=0.03) (identification data)")
211211

212212
plt.subplot(4, 1, 2)
213213
plt.plot(Time, Usim[1, :])
@@ -325,10 +325,10 @@
325325
# #INPUT#
326326
Usim = np.zeros((4, npts))
327327
Usim_noise = np.zeros((4, npts))
328-
Usim[0, :] = fset.GBN_seq(npts, 0.03, [0.33, 0.7])
329-
Usim[1, :] = fset.GBN_seq(npts, 0.03, [-2., -1.])
330-
Usim[2, :] = fset.GBN_seq(npts, 0.03, [1.3, 2.7])
331-
Usim[3, :] = fset.GBN_seq(npts, 0.03, [1., 5.2])
328+
[Usim[0, :],_,_] = fset.GBN_seq(npts, 0.03, Range = [0.33, 0.7])
329+
[Usim[1, :],_,_] = fset.GBN_seq(npts, 0.03, Range = [-2., -1.])
330+
[Usim[2, :],_,_] = fset.GBN_seq(npts, 0.03, Range = [1.3, 2.7])
331+
[Usim[3, :],_,_] = fset.GBN_seq(npts, 0.03, Range = [1., 5.2])
332332
err_inputH = np.zeros((4, npts))
333333

334334
err_inputH = fset.white_noise_var(npts, var_list)
@@ -470,7 +470,7 @@
470470
plt.grid()
471471
plt.ylabel("Input 1 GBN")
472472
plt.xlabel("Time")
473-
plt.title("Input (Switch probability=0.03)")
473+
plt.title("Input (Switch probability=0.03) (validation data)")
474474

475475
plt.subplot(4, 1, 2)
476476
plt.plot(Time, Usim[1, :])

Examples/ARX_MIMO.py

+22-34
Original file line numberDiff line numberDiff line change
@@ -21,20 +21,9 @@
2121
from sippy import *
2222

2323
import numpy as np
24-
import control
2524
import control.matlab as cnt
2625
from sippy import functionset as fset
27-
from distutils.version import StrictVersion
28-
29-
if StrictVersion(control.__version__) >= StrictVersion('0.8.2'):
30-
lsim = cnt.lsim
31-
else:
32-
def lsim(sys, U = 0.0, T = None, X0 = 0.0):
33-
U_ = U
34-
if isinstance(U_, (np.ndarray, list)):
35-
U_ = U_.T
36-
return cnt.lsim(sys, U_, T, X0)
37-
26+
3827

3928
# generating transfer functions in z-transf.
4029
var_list = [50., 100., 1.]
@@ -119,33 +108,33 @@ def lsim(sys, U = 0.0, T = None, X0 = 0.0):
119108
# #INPUT#
120109
Usim = np.zeros((4, npts))
121110
Usim_noise = np.zeros((4, npts))
122-
Usim[0, :] = fset.GBN_seq(npts, 0.03, [-0.33, 0.1])
123-
Usim[1, :] = fset.GBN_seq(npts, 0.03)
124-
Usim[2, :] = fset.GBN_seq(npts, 0.03, [2.3, 5.7])
125-
Usim[3, :] = fset.GBN_seq(npts, 0.03, [8., 11.5])
111+
[Usim[0, :],_,_] = fset.GBN_seq(npts, 0.03, Range = [-0.33, 0.1])
112+
[Usim[1, :],_,_] = fset.GBN_seq(npts, 0.03)
113+
[Usim[2, :],_,_] = fset.GBN_seq(npts, 0.03, Range = [2.3, 5.7])
114+
[Usim[3, :],_,_] = fset.GBN_seq(npts, 0.03, Range = [8., 11.5])
126115

127116
# Adding noise
128117
err_inputH = np.zeros((4, npts))
129118

130119
err_inputH = fset.white_noise_var(npts, var_list)
131120

132121
err_outputH = np.ones((3, npts))
133-
err_outputH1, Time, Xsim = lsim(H_sample1, err_inputH[0, :], Time)
134-
err_outputH2, Time, Xsim = lsim(H_sample2, err_inputH[1, :], Time)
135-
err_outputH3, Time, Xsim = lsim(H_sample3, err_inputH[2, :], Time)
136-
137-
Yout11, Time, Xsim = lsim(g_sample11, Usim[0, :], Time)
138-
Yout12, Time, Xsim = lsim(g_sample12, Usim[1, :], Time)
139-
Yout13, Time, Xsim = lsim(g_sample13, Usim[2, :], Time)
140-
Yout14, Time, Xsim = lsim(g_sample14, Usim[3, :], Time)
141-
Yout21, Time, Xsim = lsim(g_sample21, Usim[0, :], Time)
142-
Yout22, Time, Xsim = lsim(g_sample22, Usim[1, :], Time)
143-
Yout23, Time, Xsim = lsim(g_sample23, Usim[2, :], Time)
144-
Yout24, Time, Xsim = lsim(g_sample24, Usim[3, :], Time)
145-
Yout31, Time, Xsim = lsim(g_sample31, Usim[0, :], Time)
146-
Yout32, Time, Xsim = lsim(g_sample32, Usim[1, :], Time)
147-
Yout33, Time, Xsim = lsim(g_sample33, Usim[2, :], Time)
148-
Yout34, Time, Xsim = lsim(g_sample34, Usim[3, :], Time)
122+
err_outputH1, Time, Xsim = cnt.lsim(H_sample1, err_inputH[0, :], Time)
123+
err_outputH2, Time, Xsim = cnt.lsim(H_sample2, err_inputH[1, :], Time)
124+
err_outputH3, Time, Xsim = cnt.lsim(H_sample3, err_inputH[2, :], Time)
125+
126+
Yout11, Time, Xsim = cnt.lsim(g_sample11, Usim[0, :], Time)
127+
Yout12, Time, Xsim = cnt.lsim(g_sample12, Usim[1, :], Time)
128+
Yout13, Time, Xsim = cnt.lsim(g_sample13, Usim[2, :], Time)
129+
Yout14, Time, Xsim = cnt.lsim(g_sample14, Usim[3, :], Time)
130+
Yout21, Time, Xsim = cnt.lsim(g_sample21, Usim[0, :], Time)
131+
Yout22, Time, Xsim = cnt.lsim(g_sample22, Usim[1, :], Time)
132+
Yout23, Time, Xsim = cnt.lsim(g_sample23, Usim[2, :], Time)
133+
Yout24, Time, Xsim = cnt.lsim(g_sample24, Usim[3, :], Time)
134+
Yout31, Time, Xsim = cnt.lsim(g_sample31, Usim[0, :], Time)
135+
Yout32, Time, Xsim = cnt.lsim(g_sample32, Usim[1, :], Time)
136+
Yout33, Time, Xsim = cnt.lsim(g_sample33, Usim[2, :], Time)
137+
Yout34, Time, Xsim = cnt.lsim(g_sample34, Usim[3, :], Time)
149138

150139
Ytot1 = Yout11 + Yout12 + Yout13 + Yout14 + err_outputH1
151140
Ytot2 = Yout21 + Yout22 + Yout23 + Yout24 + err_outputH2
@@ -157,7 +146,6 @@ def lsim(sys, U = 0.0, T = None, X0 = 0.0):
157146
Ytot[1, :] = Ytot2.squeeze()
158147
Ytot[2, :] = Ytot3.squeeze()
159148

160-
Ytot = np.column_stack([Ytot, np.ones((3, 1))])
161149
##identification parameters
162150
ordersna = [na1, na2, na3]
163151
ordersnb = [[nb11, nb12, nb13, nb14], [nb21, nb22, nb23, nb24], [nb31, nb32, nb33, nb34]]
@@ -169,7 +157,7 @@ def lsim(sys, U = 0.0, T = None, X0 = 0.0):
169157
# output of the identified model
170158
# you can build g11, g12, etc. separately using the NUMERATOR and DENOMINATOR attributes
171159
# see how in the armax_MIMO example
172-
Yout_id, Time, Xsim = lsim(Id_sys.G, Usim, Time)
160+
Yout_id, Time, Xsim = cnt.lsim(Id_sys.G, Usim, Time)
173161

174162
######plot
175163
#

Examples/SS.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040

4141
# Input sequence
4242
U = np.zeros((1, npts))
43-
U[0] = fset.GBN_seq(npts, 0.05)
43+
[U[0],_,_] = fset.GBN_seq(npts, 0.05)
4444

4545
##Output
4646
x, yout = fsetSIM.SS_lsim_process_form(A, B, C, D, U)

Examples/example_CST.py

+111-17
Original file line numberDiff line numberDiff line change
@@ -17,26 +17,11 @@
1717
from sippy import functionsetSIM as fsetSIM
1818
from sippy import *
1919
#
20-
# import functionset as fset
21-
# import functionsetSIM as fsetSIM
22-
# from __init__ import *
2320
#
2421
import numpy as np
25-
import control
2622
import control.matlab as cnt
2723
import matplotlib.pyplot as plt
2824

29-
from distutils.version import StrictVersion
30-
31-
if StrictVersion(control.__version__) >= StrictVersion('0.8.2'):
32-
lsim = cnt.lsim
33-
else:
34-
def lsim(sys, U = 0.0, T = None, X0 = 0.0):
35-
U_ = U
36-
if isinstance(U_, (np.ndarray, list)):
37-
U_ = U_.T
38-
return cnt.lsim(sys, U_, T, X0)
39-
4025
# sampling time
4126
ts = 1. # [min]
4227

@@ -104,13 +89,13 @@ def Fdyn(X,U):
10489
F_min = 0.4
10590
F_max = 0.6
10691
Range_GBN_1 = [F_min,F_max]
107-
U[0,:] = fset.GBN_seq(npts, prob_switch_1, Range = Range_GBN_1)
92+
[U[0,:],_,_] = fset.GBN_seq(npts, prob_switch_1, Range = Range_GBN_1)
10893
# Steam Flow rate W = U[1] [kg/min]
10994
prob_switch_2 = 0.05
11095
W_min = 20
11196
W_max = 40
11297
Range_GBN_2 = [W_min,W_max]
113-
U[1,:] = fset.GBN_seq(npts, prob_switch_2, Range = Range_GBN_2)
98+
[U[1,:],_,_] = fset.GBN_seq(npts, prob_switch_2, Range = Range_GBN_2)
11499

115100
# disturbance inputs as RW (random-walk)
116101

@@ -226,4 +211,113 @@ def Fdyn(X,U):
226211
plt.xlabel("Time")
227212
if i == 0:
228213
plt.title('identification')
214+
215+
216+
#### VALIDATION STAGE
217+
218+
# Build new input sequences
219+
U_val = np.zeros((m,npts))
220+
221+
# manipulated inputs as GBN
222+
# Input Flow rate Fin = F = U[0] [m^3/min]
223+
prob_switch_1 = 0.05
224+
F_min = 0.4
225+
F_max = 0.6
226+
Range_GBN_1 = [F_min,F_max]
227+
[U_val[0,:],_,_] = fset.GBN_seq(npts, prob_switch_1, Range = Range_GBN_1)
228+
# Steam Flow rate W = U[1] [kg/min]
229+
prob_switch_2 = 0.05
230+
W_min = 20
231+
W_max = 40
232+
Range_GBN_2 = [W_min,W_max]
233+
[U_val[1,:],_,_] = fset.GBN_seq(npts, prob_switch_2, Range = Range_GBN_2)
234+
235+
# disturbance inputs as RW (random-walk)
236+
# Input Concentration Ca_in = U[2] [kg salt/m^3 solution]
237+
Ca_0 = 10.0 # initial condition
238+
sigma_Ca = 0.02 # variation
239+
U_val[2,:] = fset.RW_seq(npts, Ca_0, sigma = sigma_Ca)
240+
# Input Temperature T_in [°C]
241+
Tin_0 = 25.0 # initial condition
242+
sigma_T = 0.1 # variation
243+
U_val[3,:] = fset.RW_seq(npts, Tin_0, sigma = sigma_T)
244+
245+
#### COLLECT DATA
229246

247+
# Output Initial conditions
248+
Caout_0 = Ca_0
249+
Tout_0 = (ro*cp*U[0,0]*Tin_0 + U[1,0]*Lam)/(ro*cp*U[0,0])
250+
Xo1 = Caout_0*np.ones((1,npts))
251+
Xo2 = Tout_0*np.ones((1,npts))
252+
X_val = np.vstack((Xo1,Xo2))
253+
254+
# Run Simulation
255+
for j in range(npts-1):
256+
# Explicit Runge-Kutta 4 (TC dynamics is integrateed by hand)
257+
Mx = 5 # Number of elements in each time step
258+
dt = ts/Mx # integration step
259+
# Output & Input
260+
X0k = X_val[:,j]
261+
Uk = U_val[:,j]
262+
# Integrate the model
263+
for i in range(Mx):
264+
k1 = Fdyn(X0k, Uk)
265+
k2 = Fdyn(X0k + dt/2.0*k1, Uk)
266+
k3 = Fdyn(X0k + dt/2.0*k2, Uk)
267+
k4 = Fdyn(X0k + dt*k3, Uk)
268+
Xk_1 = X0k + (dt/6.0)*(k1 + 2.0*k2 + 2.0*k3 + k4)
269+
X_val[:,j+1] = Xk_1
270+
271+
# Add noise (with assigned variances)
272+
var = [0.01, 0.05]
273+
noise_val = fset.white_noise_var(npts,var)
274+
275+
# Build Output
276+
Y_val = X_val + noise_val
277+
278+
279+
# MODEL VALIDATION
280+
281+
# ARX
282+
Yv_arx = fset.validation(Id_ARX,U_val,Y_val,Time)
283+
284+
# ARMAX
285+
Yv_armax = fset.validation(Id_ARMAX,U_val,Y_val,Time)
286+
287+
288+
# SS
289+
x_ss, Yv_ss = fsetSIM.SS_lsim_process_form(Id_SS.A,Id_SS.B,Id_SS.C,Id_SS.D,U_val,Id_SS.x0)
290+
291+
292+
##### PLOTS
293+
294+
# Input
295+
plt.figure(3)
296+
str_input = ['F [m$^3$/min]', 'W [kg/min]', 'Ca$_{in}$ [kg/m$^3$]', 'T$_{in}$ [$^o$C]']
297+
for i in range(m):
298+
plt.subplot(m,1,i+1)
299+
plt.plot(Time,U_val[i,:])
300+
# plt.ylabel("Input " + str(i+1))
301+
plt.ylabel(str_input[i])
302+
plt.grid()
303+
plt.xlabel("Time")
304+
plt.axis([0, tfin, 0.95*np.amin(U_val[i,:]), 1.05*np.amax(U_val[i,:])])
305+
if i == 0:
306+
plt.title('validation')
307+
308+
# Output
309+
plt.figure(4)
310+
str_output = ['Ca [kg/m$^3$]', 'T [$^o$C]']
311+
for i in range(p):
312+
plt.subplot(p,1,i+1)
313+
plt.plot(Time,Y_val[i,:],'b')
314+
plt.plot(Time,Yv_arx[i,:],'g')
315+
plt.plot(Time,Yv_armax[i,:],'r')
316+
plt.plot(Time,Yv_ss[i,:],'m')
317+
# plt.ylabel("Output " + str(i+1))
318+
plt.ylabel(str_output[i])
319+
plt.legend(['Data','ARX','ARMAX','SS'])
320+
plt.grid()
321+
plt.xlabel("Time")
322+
if i == 0:
323+
plt.title('validation')

sippy/armax.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
@author: Giuseppe Armenise
66
"""
77
from __future__ import absolute_import, division, print_function
8-
import control as cnt
8+
import control.matlab as cnt
99
from builtins import object
1010
import warnings
1111

sippy/armaxMIMO.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
@author: Giuseppe Armenise
66
"""
77
from __future__ import absolute_import, division, print_function
8-
import control as cnt
8+
import control.matlab as cnt
99
import sys
1010
from builtins import object
1111

sippy/arx.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
import sys
1010
from builtins import object
11-
import control as cnt
11+
import control.matlab as cnt
1212
from .functionset import *
1313
# from functionset import *
1414

sippy/arxMIMO.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
@author: Giuseppe Armenise
66
"""
77
from __future__ import absolute_import, division, print_function
8-
import control as cnt
8+
import control.matlab as cnt
99
import sys
1010
from builtins import object
1111

0 commit comments

Comments
 (0)