@@ -609,3 +609,49 @@ def test_frequency_response():
609609 assert mag_nosq_sq .shape == mag_default .shape
610610 assert phase_nosq_sq .shape == phase_default .shape
611611 assert omega_nosq_sq .shape == omega_default .shape
612+
613+
614+ def test_signal_labels ():
615+ # Create a system response for a SISO system
616+ sys = ct .rss (4 , 1 , 1 )
617+ fresp = ct .frequency_response (sys )
618+
619+ # Make sure access via strings works
620+ np .testing .assert_equal (
621+ fresp .magnitude ['y[0]' ], fresp .magnitude [0 ])
622+ np .testing .assert_equal (
623+ fresp .phase ['y[0]' ], fresp .phase [0 ])
624+
625+ # Make sure errors are generated if key is unknown
626+ with pytest .raises (ValueError , match = "unknown signal name 'bad'" ):
627+ fresp .magnitude ['bad' ]
628+
629+ # Create a system response for a MIMO system
630+ sys = ct .rss (4 , 2 , 2 )
631+ fresp = ct .frequency_response (sys )
632+
633+ # Make sure access via strings works
634+ np .testing .assert_equal (
635+ fresp .magnitude ['y[0]' , 'u[1]' ],
636+ fresp .magnitude [0 , 1 ])
637+ np .testing .assert_equal (
638+ fresp .phase ['y[0]' , 'u[1]' ],
639+ fresp .phase [0 , 1 ])
640+ np .testing .assert_equal (
641+ fresp .response ['y[0]' , 'u[1]' ],
642+ fresp .response [0 , 1 ])
643+
644+ # Make sure access via lists of strings works
645+ np .testing .assert_equal (
646+ fresp .response [['y[1]' , 'y[0]' ], 'u[0]' ],
647+ fresp .response [[1 , 0 ], 0 ])
648+
649+ # Make sure errors are generated if key is unknown
650+ with pytest .raises (ValueError , match = "unknown signal name 'bad'" ):
651+ fresp .magnitude ['bad' ]
652+
653+ with pytest .raises (ValueError , match = "unknown signal name 'bad'" ):
654+ fresp .response [['y[1]' , 'bad' ]]
655+
656+ with pytest .raises (ValueError , match = r"unknown signal name 'y\[0\]'" ):
657+ fresp .response ['y[1]' , 'y[0]' ] # second index = input name
0 commit comments