def testMimoW3(self): """MIMO plant with T weighting""" g = ss([[-1., -2], [-3, -4]], [[1., 0.], [0., 1.]], [[1., 0.], [0., 1.]], [[1., 0.], [0., 1.]]) w3 = ss([-2], [2.], [1.], [2.]) p = augw(g, w3=w3) assert p.noutputs == 4 assert p.ninputs == 4 # w->z3 should be 0 self.siso_almost_equal(0, p[0, 0]) self.siso_almost_equal(0, p[0, 1]) self.siso_almost_equal(0, p[1, 0]) self.siso_almost_equal(0, p[1, 1]) # w->v should be I self.siso_almost_equal(1, p[2, 0]) self.siso_almost_equal(0, p[2, 1]) self.siso_almost_equal(0, p[3, 0]) self.siso_almost_equal(1, p[3, 1]) # u->z3 should be w3*g self.siso_almost_equal(w3 * g[0, 0], p[0, 2]) self.siso_almost_equal(w3 * g[0, 1], p[0, 3]) self.siso_almost_equal(w3 * g[1, 0], p[1, 2]) self.siso_almost_equal(w3 * g[1, 1], p[1, 3]) # # u->v should be -g self.siso_almost_equal(-g[0, 0], p[2, 2]) self.siso_almost_equal(-g[0, 1], p[2, 3]) self.siso_almost_equal(-g[1, 0], p[3, 2]) self.siso_almost_equal(-g[1, 1], p[3, 3])
def testSisoW123(self): """SISO plant with all weights""" g = ss([-1.], [1.], [1.], [1.]) w1 = ss([-2.], [2.], [1.], [2.]) w2 = ss([-3.], [3.], [1.], [3.]) w3 = ss([-4.], [4.], [1.], [4.]) p = augw(g, w1, w2, w3) assert p.noutputs == 4 assert p.ninputs == 2 # w->z1 should be w1 self.siso_almost_equal(w1, p[0, 0]) # w->z2 should be 0 self.siso_almost_equal(0, p[1, 0]) # w->z3 should be 0 self.siso_almost_equal(0, p[2, 0]) # w->v should be 1 self.siso_almost_equal(ss([], [], [], [1]), p[3, 0]) # u->z1 should be -w1*g self.siso_almost_equal(-w1 * g, p[0, 1]) # u->z2 should be w2 self.siso_almost_equal(w2, p[1, 1]) # u->z3 should be w3*g self.siso_almost_equal(w3 * g, p[2, 1]) # u->v should be -g self.siso_almost_equal(-g, p[3, 1])
def testMimoW2(self): """MIMO plant with KS weighting""" g = ss([[-1., -2], [-3, -4]], [[1., 0.], [0., 1.]], [[1., 0.], [0., 1.]], [[1., 0.], [0., 1.]]) w2 = ss([-2], [2.], [1.], [2.]) p = augw(g, w2=w2) assert p.outputs == 4 assert p.inputs == 4 # w->z2 should be 0 self.siso_almost_equal(0, p[0, 0]) self.siso_almost_equal(0, p[0, 1]) self.siso_almost_equal(0, p[1, 0]) self.siso_almost_equal(0, p[1, 1]) # w->v should be I self.siso_almost_equal(1, p[2, 0]) self.siso_almost_equal(0, p[2, 1]) self.siso_almost_equal(0, p[3, 0]) self.siso_almost_equal(1, p[3, 1]) # u->z2 should be w2 self.siso_almost_equal(w2, p[0, 2]) self.siso_almost_equal(0, p[0, 3]) self.siso_almost_equal(0, p[1, 2]) self.siso_almost_equal(w2, p[1, 3]) # # u->v should be -g self.siso_almost_equal(-g[0, 0], p[2, 2]) self.siso_almost_equal(-g[0, 1], p[2, 3]) self.siso_almost_equal(-g[1, 0], p[3, 2]) self.siso_almost_equal(-g[1, 1], p[3, 3])
def testMimoW1(self): """MIMO plant with S weighting""" g = ss([[-1., -2], [-3, -4]], [[1., 0.], [0., 1.]], [[1., 0.], [0., 1.]], [[1., 0.], [0., 1.]]) w1 = ss([-2], [2.], [1.], [2.]) p = augw(g, w1) assert p.outputs == 4 assert p.inputs == 4 # w->z1 should be diag(w1,w1) self.siso_almost_equal(w1, p[0, 0]) self.siso_almost_equal(0, p[0, 1]) self.siso_almost_equal(0, p[1, 0]) self.siso_almost_equal(w1, p[1, 1]) # w->v should be I self.siso_almost_equal(1, p[2, 0]) self.siso_almost_equal(0, p[2, 1]) self.siso_almost_equal(0, p[3, 0]) self.siso_almost_equal(1, p[3, 1]) # u->z1 should be -w1*g self.siso_almost_equal(-w1 * g[0, 0], p[0, 2]) self.siso_almost_equal(-w1 * g[0, 1], p[0, 3]) self.siso_almost_equal(-w1 * g[1, 0], p[1, 2]) self.siso_almost_equal(-w1 * g[1, 1], p[1, 3]) # # u->v should be -g self.siso_almost_equal(-g[0, 0], p[2, 2]) self.siso_almost_equal(-g[0, 1], p[2, 3]) self.siso_almost_equal(-g[1, 0], p[3, 2]) self.siso_almost_equal(-g[1, 1], p[3, 3])
def testMimoW123(self): """MIMO plant with all weights""" g = ss([[-1., -2], [-3, -4]], [[1., 0.], [0., 1.]], [[1., 0.], [0., 1.]], [[1., 0.], [0., 1.]]) # this should be expaned to w1*I w1 = ss([-2.], [2.], [1.], [2.]) # diagonal weighting w2 = append(ss([-3.], [3.], [1.], [3.]), ss([-4.], [4.], [1.], [4.])) # full weighting w3 = ss([[-4., -5], [-6, -7]], [[2., 3.], [5., 7.]], [[11., 13.], [17., 19.]], [[23., 29.], [31., 37.]]) p = augw(g, w1, w2, w3) assert p.noutputs == 8 assert p.ninputs == 4 # w->z1 should be w1 self.siso_almost_equal(w1, p[0, 0]) self.siso_almost_equal(0, p[0, 1]) self.siso_almost_equal(0, p[1, 0]) self.siso_almost_equal(w1, p[1, 1]) # w->z2 should be 0 self.siso_almost_equal(0, p[2, 0]) self.siso_almost_equal(0, p[2, 1]) self.siso_almost_equal(0, p[3, 0]) self.siso_almost_equal(0, p[3, 1]) # w->z3 should be 0 self.siso_almost_equal(0, p[4, 0]) self.siso_almost_equal(0, p[4, 1]) self.siso_almost_equal(0, p[5, 0]) self.siso_almost_equal(0, p[5, 1]) # w->v should be I self.siso_almost_equal(1, p[6, 0]) self.siso_almost_equal(0, p[6, 1]) self.siso_almost_equal(0, p[7, 0]) self.siso_almost_equal(1, p[7, 1]) # u->z1 should be -w1*g self.siso_almost_equal(-w1 * g[0, 0], p[0, 2]) self.siso_almost_equal(-w1 * g[0, 1], p[0, 3]) self.siso_almost_equal(-w1 * g[1, 0], p[1, 2]) self.siso_almost_equal(-w1 * g[1, 1], p[1, 3]) # u->z2 should be w2 self.siso_almost_equal(w2[0, 0], p[2, 2]) self.siso_almost_equal(w2[0, 1], p[2, 3]) self.siso_almost_equal(w2[1, 0], p[3, 2]) self.siso_almost_equal(w2[1, 1], p[3, 3]) # u->z3 should be w3*g w3g = w3 * g self.siso_almost_equal(w3g[0, 0], minreal(p[4, 2])) self.siso_almost_equal(w3g[0, 1], minreal(p[4, 3])) self.siso_almost_equal(w3g[1, 0], minreal(p[5, 2])) self.siso_almost_equal(w3g[1, 1], minreal(p[5, 3])) # u->v should be -g self.siso_almost_equal(-g[0, 0], p[6, 2]) self.siso_almost_equal(-g[0, 1], p[6, 3]) self.siso_almost_equal(-g[1, 0], p[7, 2]) self.siso_almost_equal(-g[1, 1], p[7, 3])
def testErrors(self): """Error cases handled""" from control import augw, ss # no weights g1by1 = ss(-1, 1, 1, 0) g2by2 = ss(-np.eye(2), np.eye(2), np.eye(2), np.zeros((2, 2))) with pytest.raises(ValueError): augw(g1by1) # mismatched size of weight and plant with pytest.raises(ValueError): augw(g1by1, w1=g2by2) with pytest.raises(ValueError): augw(g1by1, w2=g2by2) with pytest.raises(ValueError): augw(g1by1, w3=g2by2)
def testSisoW2(self): """SISO plant with KS weighting""" g = ss([-1.], [1.], [1.], [1.]) w2 = ss([-2], [1.], [1.], [2.]) p = augw(g, w2=w2) assert p.noutputs == 2 assert p.ninputs == 2 # w->z2 should be 0 self.siso_almost_equal(ss([], [], [], 0), p[0, 0]) # w->v should be 1 self.siso_almost_equal(ss([], [], [], [1]), p[1, 0]) # u->z2 should be w2 self.siso_almost_equal(w2, p[0, 1]) # u->v should be -g self.siso_almost_equal(-g, p[1, 1])
def testSisoW1(self): """SISO plant with S weighting""" g = ss([-1.], [1.], [1.], [1.]) w1 = ss([-2], [2.], [1.], [2.]) p = augw(g, w1) assert p.noutputs == 2 assert p.ninputs == 2 # w->z1 should be w1 self.siso_almost_equal(w1, p[0, 0]) # w->v should be 1 self.siso_almost_equal(ss([], [], [], [1]), p[1, 0]) # u->z1 should be -w1*g self.siso_almost_equal(-w1 * g, p[0, 1]) # u->v should be -g self.siso_almost_equal(-g, p[1, 1])
def testSisoW3(self): """SISO plant with T weighting""" g = ss([-1.], [1.], [1.], [1.]) w3 = ss([-2], [1.], [1.], [2.]) p = augw(g, w3=w3) assert p.noutputs == 2 assert p.ninputs == 2 # w->z3 should be 0 self.siso_almost_equal(ss([], [], [], 0), p[0, 0]) # w->v should be 1 self.siso_almost_equal(ss([], [], [], [1]), p[1, 0]) # u->z3 should be w3*g self.siso_almost_equal(w3 * g, p[0, 1]) # u->v should be -g self.siso_almost_equal(-g, p[1, 1])
def testSiso(self): """mixsyn with SISO system""" # Skogestad+Postlethwaite, Multivariable Feedback Control, 1st Ed., Example 2.11 s = tf([1, 0], 1) # plant g = 200 / (10 * s + 1) / (0.05 * s + 1)**2 # sensitivity weighting M = 1.5 wb = 10 A = 1e-4 w1 = (s / M + wb) / (s + wb * A) # KS weighting w2 = tf(1, 1) p = augw(g, w1, w2) kref, clref, gam, rcond = hinfsyn(p, 1, 1) ktest, cltest, info = mixsyn(g, w1, w2) # check similar to S+P's example np.testing.assert_allclose(gam, 1.37, atol=1e-2) # mixsyn is a convenience wrapper around augw and hinfsyn, so # results will be exactly the same. Given than, use the lazy # but fragile testing option. np.testing.assert_allclose(ktest.A, kref.A) np.testing.assert_allclose(ktest.B, kref.B) np.testing.assert_allclose(ktest.C, kref.C) np.testing.assert_allclose(ktest.D, kref.D) np.testing.assert_allclose(cltest.A, clref.A) np.testing.assert_allclose(cltest.B, clref.B) np.testing.assert_allclose(cltest.C, clref.C) np.testing.assert_allclose(cltest.D, clref.D) np.testing.assert_allclose(gam, info[0]) np.testing.assert_allclose(rcond, info[1])