|
27 | 27 | class TestVRFT(TestCase): |
28 | 28 | def test_vrft(self): |
29 | 29 | t_start = 0 |
30 | | - t_end = 10 |
31 | 30 | t_step = 1e-2 |
32 | | - t = np.arange(t_start, t_end, t_step) |
33 | | - u = np.ones(len(t)).tolist() |
| 31 | + t_ends = [10, 10 + t_step] |
34 | 32 |
|
35 | | - num = [0.1] |
36 | | - den = [1, -0.9] |
37 | | - sys = scipysig.TransferFunction(num, den, dt=t_step) |
38 | | - t, y = scipysig.dlsim(sys, u, t) |
39 | | - y = y[:,0] |
40 | | - data = iddata(y,u,t_step,[0]) |
| 33 | + expected_theta = np.array([1.93220784, -1.05808206, 1.26623764, 0.0088772]) |
| 34 | + expected_loss = 0.00064687904235295 |
| 35 | + |
| 36 | + for t_end in t_ends: |
| 37 | + t = np.arange(t_start, t_end, t_step) |
| 38 | + u = np.ones(len(t)).tolist() |
41 | 39 |
|
42 | | - refModel = ExtendedTF([0.2], [1, -0.8], dt=t_step) |
43 | | - prefilter = refModel * (1-refModel) |
| 40 | + num = [0.1] |
| 41 | + den = [1, -0.9] |
| 42 | + sys = scipysig.TransferFunction(num, den, dt=t_step) |
| 43 | + t, y = scipysig.dlsim(sys, u, t) |
| 44 | + y = y[:,0] |
| 45 | + data = iddata(y,u,t_step,[0]) |
44 | 46 |
|
45 | | - control = [ExtendedTF([1], [1,0], dt=t_step), |
46 | | - ExtendedTF([1], [1,0,0], dt=t_step), |
47 | | - ExtendedTF([1], [1,0,0,0], dt=t_step), |
48 | | - ExtendedTF([1, 0], [1,1], dt=t_step)] |
| 47 | + refModel = ExtendedTF([0.2], [1, -0.8], dt=t_step) |
| 48 | + prefilter = refModel * (1-refModel) |
49 | 49 |
|
50 | | - theta1, _, loss1, _ = compute_vrft(data, refModel, control, prefilter) |
51 | | - theta2, _, loss2, _ = compute_vrft([data], refModel, control, prefilter) |
52 | | - theta3, _, loss3, _ = compute_vrft([data, data], refModel, control, prefilter) |
53 | | - |
54 | | - self.assertTrue(np.isclose(loss1, loss2)) |
55 | | - self.assertTrue(np.isclose(loss1, loss3)) |
56 | | - self.assertTrue(np.linalg.norm(theta1-theta2)<1e-15) |
57 | | - self.assertTrue(np.linalg.norm(theta1-theta3)<1e-15) |
| 50 | + control = [ExtendedTF([1], [1,0], dt=t_step), |
| 51 | + ExtendedTF([1], [1,0,0], dt=t_step), |
| 52 | + ExtendedTF([1], [1,0,0,0], dt=t_step), |
| 53 | + ExtendedTF([1, 0], [1,1], dt=t_step)] |
| 54 | + |
| 55 | + theta1, _, loss1, _ = compute_vrft(data, refModel, control, prefilter) |
| 56 | + theta2, _, loss2, _ = compute_vrft([data], refModel, control, prefilter) |
| 57 | + theta3, _, loss3, _ = compute_vrft([data, data], refModel, control, prefilter) |
| 58 | + |
| 59 | + self.assertTrue(np.isclose(loss1, loss2)) |
| 60 | + self.assertTrue(np.isclose(loss1, loss3)) |
| 61 | + self.assertTrue(np.linalg.norm(theta1-theta2)<1e-15) |
| 62 | + self.assertTrue(np.linalg.norm(theta1-theta3)<1e-15) |
| 63 | + self.assertTrue(np.linalg.norm(theta1-expected_theta, np.infty) < 1e-5) |
| 64 | + self.assertTrue(abs(expected_loss - loss1) < 1e-5) |
58 | 65 |
|
59 | 66 | def test_iv(self): |
60 | 67 | t_start = 0 |
61 | | - t_end = 10 |
62 | 68 | t_step = 1e-2 |
63 | | - t = np.arange(t_start, t_end, t_step) |
64 | | - u = np.ones(len(t)).tolist() |
| 69 | + t_ends = [10, 10 + t_step] |
65 | 70 |
|
66 | | - num = [0.1] |
67 | | - den = [1, -0.9] |
68 | | - sys = scipysig.TransferFunction(num, den, dt=t_step) |
69 | | - t, y = scipysig.dlsim(sys, u, t) |
70 | | - y = y.flatten() + np.random.normal(size=t.size) |
71 | | - data = iddata(y,u,t_step,[0]) |
72 | | - |
73 | | - refModel = ExtendedTF([0.2], [1, -0.8], dt=t_step) |
74 | | - prefilter = refModel * (1-refModel) |
| 71 | + |
| 72 | + for t_end in t_ends: |
| 73 | + t = np.arange(t_start, t_end, t_step) |
| 74 | + u = np.ones(len(t)).tolist() |
75 | 75 |
|
76 | | - control = [ExtendedTF([1], [1,0], dt=t_step), |
77 | | - ExtendedTF([1], [1,0,0], dt=t_step), |
78 | | - ExtendedTF([1], [1,0,0,0], dt=t_step), |
79 | | - ExtendedTF([1, 0], [1,1], dt=t_step)] |
| 76 | + num = [0.1] |
| 77 | + den = [1, -0.9] |
| 78 | + sys = scipysig.TransferFunction(num, den, dt=t_step) |
| 79 | + t, y = scipysig.dlsim(sys, u, t) |
| 80 | + y = y.flatten() + 1e-2 * np.random.normal(size=t.size) |
| 81 | + data = iddata(y,u,t_step,[0]) |
80 | 82 |
|
81 | | - #import pdb |
82 | | - #pdb.set_trace() |
83 | | - |
84 | | - #theta, _, loss, _ = compute_vrft(data, refModel, control, prefilter, iv=True) |
| 83 | + refModel = ExtendedTF([0.2], [1, -0.8], dt=t_step) |
| 84 | + prefilter = refModel * (1-refModel) |
85 | 85 |
|
| 86 | + control = [ExtendedTF([1], [1,0], dt=t_step), |
| 87 | + ExtendedTF([1], [1,0,0], dt=t_step), |
| 88 | + ExtendedTF([1], [1,0,0,0], dt=t_step), |
| 89 | + ExtendedTF([1, 0], [1,1], dt=t_step)] |
86 | 90 |
|
| 91 | + theta, _, loss, _ = compute_vrft(data, refModel, control, prefilter, iv=True) |
87 | 92 |
|
0 commit comments