def test_frequency_mismatch(self, recwarn): # recwarn: there may be a warning before the error! # Overlapping but non-equal frequency ranges sys1 = FRD([1, 2, 3], [4, 5, 6]) sys2 = FRD([2, 3, 4], [5, 6, 7]) with pytest.raises(NotImplementedError): FRD.__add__(sys1, sys2) # One frequency range is a subset of another sys1 = FRD([1, 2, 3], [4, 5, 6]) sys2 = FRD([2, 3], [4, 5]) with pytest.raises(NotImplementedError): FRD.__add__(sys1, sys2)
def test_size_mismatch(self): sys1 = FRD(ct.rss(2, 2, 2), np.logspace(-1, 1, 10)) # Different number of inputs sys2 = FRD(ct.rss(3, 1, 2), np.logspace(-1, 1, 10)) with pytest.raises(ValueError): FRD.__add__(sys1, sys2) # Different number of outputs sys2 = FRD(ct.rss(3, 2, 1), np.logspace(-1, 1, 10)) with pytest.raises(ValueError): FRD.__add__(sys1, sys2) # Inputs and outputs don't match with pytest.raises(ValueError): FRD.__mul__(sys2, sys1) # Feedback mismatch with pytest.raises(ValueError): FRD.feedback(sys2, sys1)
def test_operator_conversion(self): sys_tf = ct.tf([1], [1, 2, 1]) frd_tf = FRD(sys_tf, np.logspace(-1, 1, 10)) frd_2 = FRD(2 * np.ones(10), np.logspace(-1, 1, 10)) # Make sure that we can add, multiply, and feedback constants sys_add = frd_tf + 2 chk_add = frd_tf + frd_2 np.testing.assert_array_almost_equal(sys_add.omega, chk_add.omega) np.testing.assert_array_almost_equal(sys_add.fresp, chk_add.fresp) sys_radd = 2 + frd_tf chk_radd = frd_2 + frd_tf np.testing.assert_array_almost_equal(sys_radd.omega, chk_radd.omega) np.testing.assert_array_almost_equal(sys_radd.fresp, chk_radd.fresp) sys_sub = frd_tf - 2 chk_sub = frd_tf - frd_2 np.testing.assert_array_almost_equal(sys_sub.omega, chk_sub.omega) np.testing.assert_array_almost_equal(sys_sub.fresp, chk_sub.fresp) sys_rsub = 2 - frd_tf chk_rsub = frd_2 - frd_tf np.testing.assert_array_almost_equal(sys_rsub.omega, chk_rsub.omega) np.testing.assert_array_almost_equal(sys_rsub.fresp, chk_rsub.fresp) sys_mul = frd_tf * 2 chk_mul = frd_tf * frd_2 np.testing.assert_array_almost_equal(sys_mul.omega, chk_mul.omega) np.testing.assert_array_almost_equal(sys_mul.fresp, chk_mul.fresp) sys_rmul = 2 * frd_tf chk_rmul = frd_2 * frd_tf np.testing.assert_array_almost_equal(sys_rmul.omega, chk_rmul.omega) np.testing.assert_array_almost_equal(sys_rmul.fresp, chk_rmul.fresp) sys_rdiv = 2 / frd_tf chk_rdiv = frd_2 / frd_tf np.testing.assert_array_almost_equal(sys_rdiv.omega, chk_rdiv.omega) np.testing.assert_array_almost_equal(sys_rdiv.fresp, chk_rdiv.fresp) sys_pow = frd_tf**2 chk_pow = FRD(sys_tf**2, np.logspace(-1, 1, 10)) np.testing.assert_array_almost_equal(sys_pow.omega, chk_pow.omega) np.testing.assert_array_almost_equal(sys_pow.fresp, chk_pow.fresp) sys_pow = frd_tf**-2 chk_pow = FRD(sys_tf**-2, np.logspace(-1, 1, 10)) np.testing.assert_array_almost_equal(sys_pow.omega, chk_pow.omega) np.testing.assert_array_almost_equal(sys_pow.fresp, chk_pow.fresp) # Assertion error if we try to raise to a non-integer power with pytest.raises(ValueError): FRD.__pow__(frd_tf, 0.5) # Selected testing on transfer function conversion sys_add = frd_2 + sys_tf chk_add = frd_2 + frd_tf np.testing.assert_array_almost_equal(sys_add.omega, chk_add.omega) np.testing.assert_array_almost_equal(sys_add.fresp, chk_add.fresp) # Input/output mismatch size mismatch in rmul sys1 = FRD(ct.rss(2, 2, 2), np.logspace(-1, 1, 10)) with pytest.raises(ValueError): FRD.__rmul__(frd_2, sys1) # Make sure conversion of something random generates exception with pytest.raises(TypeError): FRD.__add__(frd_tf, 'string')