test_SISO_conversion

wield.control.SISO.test.test_SISO_conversion

This is a pytest module needing documentation

pytest-html report

Functions

bode(xfer, axm, axp, *[, deg])

This is a pytest needing documentation

test_conversion()

Test the conversions to and from ZPK representation and statespace representation using a delay filter

Details

bode(xfer, axm, axp, *, deg=True, **kw)[source][github]

This is a pytest needing documentation

code
 1def bode(xfer, axm, axp, *, deg=True, **kw):
 2    if axm is not None:
 3        line, = axm.plot(
 4            xfer.f,
 5            abs(xfer.tf),
 6            **kw
 7        )
 8        kw.setdefault('color', line.get_color())
 9
10    if axp is not None:
11        line, = axp.plot(
12            xfer.f,
13            np.angle(xfer.tf, deg=deg),
14            **kw
15        )
16    return
pytest information

This code is wrapped in a pytest function using conventions detailed in Pytest Conventions. The full name of this test, as known by the documentation, is:

wield.control.SISO.test.test_SISO_conversion.bode

The full name is useful when building documentation, to link a reference to this page using :func:`name`, or directly include it with an autofunction directive. The collapse nodes below show every instance of the test run. There may only be one, but if the test was run multiple times through pytest parametrizations, the list can be longer.

test_conversion()[source][github]

Test the conversions to and from ZPK representation and statespace representation using a delay filter

code
docstring
"""
Test the conversions to and from ZPK representation and statespace representation
using a delay filter
"""
 1def test_conversion():
 2
 3    axB = mplfigB(Nrows=2, Ncols=2)
 4    F_Hz = logspaced(.000001, 100, 1000)
 5
 6    F_p = [-0.001 - 10j, -0.001 + 10j, -10]
 7    F_z = [0, 0, 0]
 8    F_k = 1
 9
10    filt = SISO.zpk((F_z, F_p, F_k), fiducial_rtol=1, angular=False)
11
12    print(filt)
13
14    xfer1 = filt.fresponse(f=F_Hz).tf
15    axB.ax0.loglog(F_Hz, abs(xfer1), label="Direct ZPK")
16    axB.ax1.semilogx(F_Hz, np.angle(xfer1, deg=True))
17
18    #xfer2 = (filt * filt).fresponse(f=F_Hz).tf
19    #axB.ax0.loglog(F_Hz, abs(xfer2), label="ZPK self product")
20    #axB.ax1.semilogx(F_Hz, np.angle(xfer2, deg=True))
21
22    filt_ss = filt.asSS * 4
23    filt_ssi = 1/filt_ss
24    xfer3 = filt_ss.fresponse(f=F_Hz).tf
25    xfer3b = filt_ssi.fresponse(f=F_Hz).tf
26    axB.ax0.loglog(F_Hz, abs(xfer3) / 4, label="ZPK2SS")
27    axB.ax1.semilogx(F_Hz, np.angle(xfer3, deg=True))
28    axB.ax0.loglog(F_Hz, abs(1/xfer3b) / 4, label="ZPK2SS inv")
29    axB.ax1.semilogx(F_Hz, np.angle(1/xfer3b, deg=True))
30
31    axB.ax0_1.semilogx(F_Hz, abs(xfer3/xfer1) / 4, label="ZPK2SS")
32    axB.ax1_1.semilogx(F_Hz, np.angle(xfer3/xfer1, deg=True))
33    axB.ax0_1.semilogx(F_Hz, abs(1/xfer3b/xfer1) / 4, label="ZPK2SS inv")
34    axB.ax1_1.semilogx(F_Hz, np.angle(1/xfer3b/xfer1, deg=True))
35
36    filt_zpk = filt_ss.asZPK
37    filt_zpki = filt_ssi.asZPK
38    xfer4 = filt_zpk.fresponse(f=F_Hz).tf
39    xfer4b = (1/filt_zpk).fresponse(f=F_Hz).tf
40    xfer4c = (filt_zpki).fresponse(f=F_Hz).tf
41    axB.ax0.loglog(F_Hz, abs(xfer4) / 4, label="SS2ZPK")
42    axB.ax1.semilogx(F_Hz, np.angle(xfer3, deg=True))
43    axB.ax0.loglog(F_Hz, abs(1/xfer4b) / 4, label="SS2ZPK inv")
44    axB.ax1.semilogx(F_Hz, np.angle(1/xfer4b, deg=True))
45    axB.ax0.loglog(F_Hz, abs(1/xfer4c) / 4, label="SS2ZPK ss inv")
46    axB.ax1.semilogx(F_Hz, np.angle(1/xfer4c, deg=True))
47
48    axB.ax0_1.semilogx(F_Hz, abs(xfer4/xfer1) / 4, label="SS2ZPK")
49    axB.ax1_1.semilogx(F_Hz, np.angle(xfer3/xfer1, deg=True))
50    axB.ax0_1.semilogx(F_Hz, abs(1/xfer4b/xfer1) / 4, label="SS2ZPK inv")
51    axB.ax1_1.semilogx(F_Hz, np.angle(1/xfer4b/xfer1, deg=True))
52    axB.ax0_1.semilogx(F_Hz, abs(1/xfer4c/xfer1) / 4, label="SS2ZPK ss inv")
53    axB.ax1_1.semilogx(F_Hz, np.angle(1/xfer4c/xfer1, deg=True))
54
55    axB.ax0.legend()
56    axB.save(tjoin("test_ZPK"))
57
58    np.testing.assert_almost_equal(xfer3, 4 * xfer1)
59    np.testing.assert_almost_equal(xfer4, 4 * xfer1)
60    np.testing.assert_almost_equal(xfer3, 1/xfer3b)
61    np.testing.assert_almost_equal(xfer4, 1/xfer4b)
62    np.testing.assert_almost_equal(xfer4, 1/xfer4c)
pytest information

This code is wrapped in a pytest function using conventions detailed in Pytest Conventions. The full name of this test, as known by the documentation, is:

wield.control.SISO.test.test_SISO_conversion.test_conversion

The full name is useful when building documentation, to link a reference to this page using :func:`name`, or directly include it with an autofunction directive. The collapse nodes below show every instance of the test run. There may only be one, but if the test was run multiple times through pytest parametrizations, the list can be longer.

test_conversion
output
zpk(z=2π·[0.0, 0.0, 0.0], p=2π·[-10.0, -0.001 ± 10.0j], k=1)
captured errors:
args = (array([-1.95399252e-14, -2.04281037e-14, -2.22044605e-14, -2.30926389e-14,
       -2.30926389e-14, -2.39808173e-14, -...265e+00,  4.00056873e+00,  4.00052795e+00,
        4.00049009e+00,  4.00045492e+00,  4.00042227e+00,  4.00039196e+00]))
kwds = {'decimal': 7}

    @wraps(func)
    def inner(*args, **kwds):
        with self._recreate_cm():
>           return func(*args, **kwds)

/opt/conda/lib/python3.12/contextlib.py:81: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/opt/conda/lib/python3.12/contextlib.py:81: in inner
    return func(*args, **kwds)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

args = (<function assert_array_almost_equal.<locals>.compare at 0x7fc789e6c220>, array([-1.95399252e-14, -2.04281037e-14, -2....265e+00,  4.00056873e+00,  4.00052795e+00,
        4.00049009e+00,  4.00045492e+00,  4.00042227e+00,  4.00039196e+00]))
kwds = {'err_msg': '', 'header': 'Arrays are not almost equal to 7 decimals', 'precision': 7, 'verbose': True}

    @wraps(func)
    def inner(*args, **kwds):
        with self._recreate_cm():
>           return func(*args, **kwds)
E           AssertionError: 
E           Arrays are not almost equal to 7 decimals
E           
E           Mismatched elements: 570 / 1000 (57%)
E           Max absolute difference: 207.14894733
E           Max relative difference: 4.88400456e+13
E            x: array([-1.9539925e-14, -2.0428104e-14, -2.2204460e-14, -2.3092639e-14,
E                  -2.3092639e-14, -2.3980817e-14, -2.4868996e-14, -2.5757174e-14,
E                  -2.6645353e-14, -2.8421709e-14, -2.9309888e-14, -3.0198066e-14,...
E            y: array([-4.0008000e-28, -4.3070396e-28, -4.6367203e-28, -4.9916363e-28,
E                  -5.3737192e-28, -5.7850484e-28, -6.2278627e-28, -6.7045720e-28,
E                  -7.2177709e-28, -7.7702524e-28, -8.3650233e-28, -9.0053208e-28,...

/opt/conda/lib/python3.12/contextlib.py:81: AssertionError

During handling of the above exception, another exception occurred:

    def test_conversion():
        """
        Test the conversions to and from ZPK representation and statespace representation
        using a delay filter
        """
        axB = mplfigB(Nrows=2, Ncols=2)
        F_Hz = logspaced(.000001, 100, 1000)

        F_p = [-0.001 - 10j, -0.001 + 10j, -10]
        F_z = [0, 0, 0]
        F_k = 1

        filt = SISO.zpk((F_z, F_p, F_k), fiducial_rtol=1, angular=False)

        print(filt)

        xfer1 = filt.fresponse(f=F_Hz).tf
        axB.ax0.loglog(F_Hz, abs(xfer1), label="Direct ZPK")
        axB.ax1.semilogx(F_Hz, np.angle(xfer1, deg=True))

        #xfer2 = (filt * filt).fresponse(f=F_Hz).tf
        #axB.ax0.loglog(F_Hz, abs(xfer2), label="ZPK self product")
        #axB.ax1.semilogx(F_Hz, np.angle(xfer2, deg=True))

        filt_ss = filt.asSS * 4
        filt_ssi = 1/filt_ss
        xfer3 = filt_ss.fresponse(f=F_Hz).tf
        xfer3b = filt_ssi.fresponse(f=F_Hz).tf
        axB.ax0.loglog(F_Hz, abs(xfer3) / 4, label="ZPK2SS")
        axB.ax1.semilogx(F_Hz, np.angle(xfer3, deg=True))
        axB.ax0.loglog(F_Hz, abs(1/xfer3b) / 4, label="ZPK2SS inv")
        axB.ax1.semilogx(F_Hz, np.angle(1/xfer3b, deg=True))

        axB.ax0_1.semilogx(F_Hz, abs(xfer3/xfer1) / 4, label="ZPK2SS")
        axB.ax1_1.semilogx(F_Hz, np.angle(xfer3/xfer1, deg=True))
        axB.ax0_1.semilogx(F_Hz, abs(1/xfer3b/xfer1) / 4, label="ZPK2SS inv")
        axB.ax1_1.semilogx(F_Hz, np.angle(1/xfer3b/xfer1, deg=True))

        filt_zpk = filt_ss.asZPK
        filt_zpki = filt_ssi.asZPK
        xfer4 = filt_zpk.fresponse(f=F_Hz).tf
        xfer4b = (1/filt_zpk).fresponse(f=F_Hz).tf
        xfer4c = (filt_zpki).fresponse(f=F_Hz).tf
        axB.ax0.loglog(F_Hz, abs(xfer4) / 4, label="SS2ZPK")
        axB.ax1.semilogx(F_Hz, np.angle(xfer3, deg=True))
        axB.ax0.loglog(F_Hz, abs(1/xfer4b) / 4, label="SS2ZPK inv")
        axB.ax1.semilogx(F_Hz, np.angle(1/xfer4b, deg=True))
        axB.ax0.loglog(F_Hz, abs(1/xfer4c) / 4, label="SS2ZPK ss inv")
        axB.ax1.semilogx(F_Hz, np.angle(1/xfer4c, deg=True))

        axB.ax0_1.semilogx(F_Hz, abs(xfer4/xfer1) / 4, label="SS2ZPK")
        axB.ax1_1.semilogx(F_Hz, np.angle(xfer3/xfer1, deg=True))
        axB.ax0_1.semilogx(F_Hz, abs(1/xfer4b/xfer1) / 4, label="SS2ZPK inv")
        axB.ax1_1.semilogx(F_Hz, np.angle(1/xfer4b/xfer1, deg=True))
        axB.ax0_1.semilogx(F_Hz, abs(1/xfer4c/xfer1) / 4, label="SS2ZPK ss inv")
        axB.ax1_1.semilogx(F_Hz, np.angle(1/xfer4c/xfer1, deg=True))

        axB.ax0.legend()
        axB.save(tjoin("test_ZPK"))

>       np.testing.assert_almost_equal(xfer3, 4 * xfer1)

../../src/wield/control/SISO/test/test_SISO_conversion.py:110: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

args = (array([-1.95399252e-14-4.44089210e-16j, -2.04281037e-14-2.22044605e-16j,
       -2.22044605e-14-4.44089210e-16j, -2.3...88656e-01j,  4.00045492e+00+4.15158695e-01j,
        4.00042227e+00+4.07570288e-01j,  4.00039196e+00+4.00120820e-01j]))
kwds = {}

    @wraps(func)
    def inner(*args, **kwds):
        with self._recreate_cm():
>           return func(*args, **kwds)
E           AssertionError: 
E           Arrays are not almost equal to 7 decimals
E            ACTUAL: array([-1.95399252e-14-4.44089210e-16j, -2.04281037e-14-2.22044605e-16j,
E                  -2.22044605e-14-4.44089210e-16j, -2.30926389e-14-2.22044605e-16j,
E                  -2.30926389e-14-2.22044605e-16j, -2.39808173e-14+0.00000000e+00j,...
E            DESIRED: array([-4.00079996e-28-3.99999996e-21j, -4.30703964e-28-4.22750384e-21j,
E                  -4.63672033e-28-4.46794723e-21j, -4.99163629e-28-4.72206607e-21j,
E                  -5.37371916e-28-4.99063816e-21j, -5.78504841e-28-5.27448555e-21j,...

/opt/conda/lib/python3.12/contextlib.py:81: AssertionError