From 207a059e2763e43e0823bcc43ad6f19fa5416c3a Mon Sep 17 00:00:00 2001 From: Ben Greiner Date: Mon, 1 Nov 2021 12:50:20 +0100 Subject: [PATCH 1/6] ease test tolerance on timeseries --- control/tests/flatsys_test.py | 5 +++-- control/tests/timeresp_test.py | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/control/tests/flatsys_test.py b/control/tests/flatsys_test.py index 373af8dae..6f4ef7cef 100644 --- a/control/tests/flatsys_test.py +++ b/control/tests/flatsys_test.py @@ -339,8 +339,9 @@ def test_point_to_point_errors(self): traj_kwarg = fs.point_to_point( flat_sys, timepts, x0, u0, xf, uf, cost=cost_fcn, basis=fs.PolyFamily(8), minimize_kwargs={'method': 'slsqp'}) - np.testing.assert_almost_equal( - traj_method.eval(timepts)[0], traj_kwarg.eval(timepts)[0]) + np.testing.assert_allclose( + traj_method.eval(timepts)[0], traj_kwarg.eval(timepts)[0], + atol=1e-5) # Unrecognized keywords with pytest.raises(TypeError, match="unrecognized keyword"): diff --git a/control/tests/timeresp_test.py b/control/tests/timeresp_test.py index c74c0c06d..d9cb065f6 100644 --- a/control/tests/timeresp_test.py +++ b/control/tests/timeresp_test.py @@ -681,7 +681,8 @@ def test_forced_response_T_U(self, tsystem, fr_kwargs, refattr): fr_kwargs['X0'] = tsystem.X0 t, y = forced_response(tsystem.sys, **fr_kwargs) np.testing.assert_allclose(t, tsystem.t) - np.testing.assert_allclose(y, getattr(tsystem, refattr), rtol=1e-3) + np.testing.assert_allclose(y, getattr(tsystem, refattr), + rtol=1e-3, atol=1e-5) @pytest.mark.parametrize("tsystem", ["siso_ss1"], indirect=True) def test_forced_response_invalid_c(self, tsystem): From feb88154c82327370b59dcbadf8133e7f2eb5af8 Mon Sep 17 00:00:00 2001 From: Ben Greiner Date: Mon, 1 Nov 2021 13:48:40 +0100 Subject: [PATCH 2/6] debug noslycot solve error --- control/statesp.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/control/statesp.py b/control/statesp.py index 6b3a1dff3..21f09f3d5 100644 --- a/control/statesp.py +++ b/control/statesp.py @@ -909,7 +909,9 @@ def horner(self, x, warn_infinite=True): self.C, solve(x_idx * eye(self.nstates) - self.A, self.B)) \ + self.D - except LinAlgError: + except LinAlgError as e: + print(self) + raise e # Issue a warning messsage, for consistency with xferfcn if warn_infinite: warn("singular matrix in frequency response", From 73062d94874e6ca8fd59a5d1758fa2a863157092 Mon Sep 17 00:00:00 2001 From: Ben Greiner Date: Mon, 1 Nov 2021 14:00:53 +0100 Subject: [PATCH 3/6] debug noslycot solve error: don't raise but print --- control/statesp.py | 1 - 1 file changed, 1 deletion(-) diff --git a/control/statesp.py b/control/statesp.py index 21f09f3d5..b05f47732 100644 --- a/control/statesp.py +++ b/control/statesp.py @@ -911,7 +911,6 @@ def horner(self, x, warn_infinite=True): + self.D except LinAlgError as e: print(self) - raise e # Issue a warning messsage, for consistency with xferfcn if warn_infinite: warn("singular matrix in frequency response", From 6a8b62f6fd1f903d5446800f279569ac561b9eaa Mon Sep 17 00:00:00 2001 From: Ben Greiner Date: Mon, 1 Nov 2021 14:07:09 +0100 Subject: [PATCH 4/6] debug noslycot solve error: don't raise but print nan --- control/statesp.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/control/statesp.py b/control/statesp.py index b05f47732..cde8cb42f 100644 --- a/control/statesp.py +++ b/control/statesp.py @@ -910,7 +910,6 @@ def horner(self, x, warn_infinite=True): solve(x_idx * eye(self.nstates) - self.A, self.B)) \ + self.D except LinAlgError as e: - print(self) # Issue a warning messsage, for consistency with xferfcn if warn_infinite: warn("singular matrix in frequency response", @@ -922,6 +921,9 @@ def horner(self, x, warn_infinite=True): out[:, :, idx] = complex(np.nan, np.nan) else: out[:, :, idx] = complex(np.inf, np.nan) + if np.any(np.isnan(out)): + print(self) + print(out) return out From d163e1523781f5c01ab42f11068cd23afc44c1a6 Mon Sep 17 00:00:00 2001 From: Ben Greiner Date: Mon, 1 Nov 2021 15:29:05 +0100 Subject: [PATCH 5/6] debug noslycot solve error: don't raise but print nan, when created --- control/statesp.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/control/statesp.py b/control/statesp.py index cde8cb42f..0ceacbd9f 100644 --- a/control/statesp.py +++ b/control/statesp.py @@ -921,9 +921,10 @@ def horner(self, x, warn_infinite=True): out[:, :, idx] = complex(np.nan, np.nan) else: out[:, :, idx] = complex(np.inf, np.nan) - if np.any(np.isnan(out)): - print(self) - print(out) + else: + if np.any(np.isnan(out[:, :, idx])): + print(idx, x_idx, self.A, self.B) + print(out[:, :, idx]) return out From 8f368483bf30c223784b1b90eaea368d3d358dba Mon Sep 17 00:00:00 2001 From: Ben Greiner Date: Mon, 1 Nov 2021 21:27:29 +0100 Subject: [PATCH 6/6] Update control/statesp.py --- control/statesp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/control/statesp.py b/control/statesp.py index 0ceacbd9f..ffd579247 100644 --- a/control/statesp.py +++ b/control/statesp.py @@ -909,7 +909,7 @@ def horner(self, x, warn_infinite=True): self.C, solve(x_idx * eye(self.nstates) - self.A, self.B)) \ + self.D - except LinAlgError as e: + except LinAlgError: # Issue a warning messsage, for consistency with xferfcn if warn_infinite: warn("singular matrix in frequency response",