1
+ # markov.py
2
+ # Johannes Kaisinger, 4 July 2024
3
+ #
4
+ # Demonstrate estimation of markov parameters.
5
+ # SISO, SIMO, MISO, MIMO case
6
+
7
+ import numpy as np
8
+ import matplotlib .pyplot as plt
9
+ import os
10
+
11
+ import control as ct
12
+
13
+ # set up a mass spring damper system (2dof, MIMO case)
14
+ # m q_dd + c q_d + k q = u
15
+ m1 , k1 , c1 = 1. , 1. , .1
16
+ m2 , k2 , c2 = 2. , .5 , .1
17
+ k3 , c3 = .5 , .1
18
+
19
+ A = np .array ([
20
+ [0. , 0. , 1. , 0. ],
21
+ [0. , 0. , 0. , 1. ],
22
+ [- (k1 + k2 )/ m1 , (k2 )/ m1 , - (c1 + c2 )/ m1 , c2 / m1 ],
23
+ [(k2 )/ m2 , - (k2 + k3 )/ m2 , c2 / m2 , - (c2 + c3 )/ m2 ]
24
+ ])
25
+ B = np .array ([[0. ,0. ],[0. ,0. ],[1 / m1 ,0. ],[0. ,1 / m2 ]])
26
+ C = np .array ([[1.0 , 0.0 , 0.0 , 0.0 ],[0.0 , 1.0 , 0.0 , 0.0 ]])
27
+ D = np .zeros ((2 ,2 ))
28
+
29
+
30
+ xixo_list = ["SISO" ,"SIMO" ,"MISO" ,"MIMO" ]
31
+ xixo = xixo_list [3 ] # choose a system for estimation
32
+ match xixo :
33
+ case "SISO" :
34
+ sys = ct .StateSpace (A , B [:,0 ], C [0 ,:], D [0 ,0 ])
35
+ case "SIMO" :
36
+ sys = ct .StateSpace (A , B [:,:1 ], C , D [:,:1 ])
37
+ case "MISO" :
38
+ sys = ct .StateSpace (A , B , C [:1 ,:], D [:1 ,:])
39
+ case "MIMO" :
40
+ sys = ct .StateSpace (A , B , C , D )
41
+
42
+ dt = 0.5
43
+ sysd = sys .sample (dt , method = 'zoh' )
44
+
45
+ t = np .arange (0 ,5000 ,dt )
46
+ u = np .random .randn (sysd .B .shape [- 1 ], len (t )) # random forcing input
47
+
48
+ response = ct .forced_response (sysd , U = u )
49
+ response .plot ()
50
+ plt .show ()
51
+
52
+ markov_true = ct .impulse_response (sysd ,T = dt * 100 )
53
+ markov_est = ct .markov (response ,m = 100 ,dt = dt )
54
+
55
+ markov_true .plot (title = xixo )
56
+ markov_est .plot (color = 'orange' ,linestyle = 'dashed' )
57
+ plt .show ()
58
+
59
+ if 'PYCONTROL_TEST_EXAMPLES' not in os .environ :
60
+ plt .show ()
0 commit comments