Skip to content

Commit 26206dc

Browse files
authored
Merge pull request #482 from bnavigator/skip-impulse-test
skip impulse sampling for old scipy
2 parents daf2536 + 90c564c commit 26206dc

File tree

1 file changed

+33
-26
lines changed

1 file changed

+33
-26
lines changed

control/tests/timeresp_test.py

Lines changed: 33 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,12 @@
99
# specific unit tests will do that.
1010

1111
import unittest
12+
from distutils.version import StrictVersion
13+
1214
import numpy as np
15+
import pytest
16+
import scipy as sp
17+
1318
from control.timeresp import *
1419
from control.timeresp import _ideal_tfinal_and_dt, _default_time_vector
1520
from control.statesp import *
@@ -29,11 +34,11 @@ def setUp(self):
2934
# Create some transfer functions
3035
self.siso_tf1 = TransferFunction([1], [1, 2, 1])
3136
self.siso_tf2 = _convert_to_transfer_function(self.siso_ss1)
32-
37+
3338
# tests for pole cancellation
34-
self.pole_cancellation = TransferFunction([1.067e+05, 5.791e+04],
39+
self.pole_cancellation = TransferFunction([1.067e+05, 5.791e+04],
3540
[10.67, 1.067e+05, 5.791e+04])
36-
self.no_pole_cancellation = TransferFunction([1.881e+06],
41+
self.no_pole_cancellation = TransferFunction([1.881e+06],
3742
[188.1, 1.881e+06])
3843

3944
# Create MIMO system, contains ``siso_ss1`` twice
@@ -177,8 +182,8 @@ def test_step_info(self):
177182
# https://github.com/python-control/python-control/issues/440
178183
step_info_no_cancellation = step_info(self.no_pole_cancellation)
179184
step_info_cancellation = step_info(self.pole_cancellation)
180-
for key in step_info_no_cancellation:
181-
np.testing.assert_allclose(step_info_no_cancellation[key],
185+
for key in step_info_no_cancellation:
186+
np.testing.assert_allclose(step_info_no_cancellation[key],
182187
step_info_cancellation[key], rtol=1e-4)
183188

184189
def test_impulse_response(self):
@@ -218,6 +223,8 @@ def test_impulse_response(self):
218223
np.testing.assert_array_almost_equal(
219224
yy, np.vstack((youttrue, np.zeros_like(youttrue))), decimal=4)
220225

226+
@pytest.mark.skipif(StrictVersion(sp.__version__) < "1.3.0",
227+
reason="requires SciPy 1.3.0 or greater")
221228
def test_discrete_time_impulse(self):
222229
# discrete time impulse sampled version should match cont time
223230
dt = 0.1
@@ -226,7 +233,7 @@ def test_discrete_time_impulse(self):
226233
sysdt = sys.sample(dt, 'impulse')
227234
np.testing.assert_array_almost_equal(impulse_response(sys, t)[1],
228235
impulse_response(sysdt, t)[1])
229-
236+
230237
def test_initial_response(self):
231238
# Test SISO system
232239
sys = self.siso_ss1
@@ -363,7 +370,7 @@ def test_step_robustness(self):
363370
"Unit test: https://github.com/python-control/python-control/issues/240"
364371
# Create 2 input, 2 output system
365372
num = [ [[0], [1]], [[1], [0]] ]
366-
373+
367374
den1 = [ [[1], [1,1]], [[1,4], [1]] ]
368375
sys1 = TransferFunction(num, den1)
369376

@@ -381,47 +388,47 @@ def test_auto_generated_time_vector(self):
381388
ratio = 9.21034*p # taken from code
382389
ratio2 = 25*p
383390
np.testing.assert_array_almost_equal(
384-
_ideal_tfinal_and_dt(TransferFunction(1, [1, .5]))[0],
391+
_ideal_tfinal_and_dt(TransferFunction(1, [1, .5]))[0],
385392
(ratio/p))
386393
np.testing.assert_array_almost_equal(
387-
_ideal_tfinal_and_dt(TransferFunction(1, [1, .5]).sample(.1))[0],
394+
_ideal_tfinal_and_dt(TransferFunction(1, [1, .5]).sample(.1))[0],
388395
(ratio2/p))
389396
# confirm a TF with poles at 0 and p simulates for ratio/p seconds
390397
np.testing.assert_array_almost_equal(
391-
_ideal_tfinal_and_dt(TransferFunction(1, [1, .5, 0]))[0],
398+
_ideal_tfinal_and_dt(TransferFunction(1, [1, .5, 0]))[0],
392399
(ratio2/p))
393400

394-
# confirm a TF with a natural frequency of wn rad/s gets a
401+
# confirm a TF with a natural frequency of wn rad/s gets a
395402
# dt of 1/(ratio*wn)
396403
wn = 10
397404
ratio_dt = 1/(0.025133 * ratio * wn)
398405
np.testing.assert_array_almost_equal(
399-
_ideal_tfinal_and_dt(TransferFunction(1, [1, 0, wn**2]))[1],
406+
_ideal_tfinal_and_dt(TransferFunction(1, [1, 0, wn**2]))[1],
400407
1/(ratio_dt*ratio*wn))
401408
wn = 100
402409
np.testing.assert_array_almost_equal(
403-
_ideal_tfinal_and_dt(TransferFunction(1, [1, 0, wn**2]))[1],
410+
_ideal_tfinal_and_dt(TransferFunction(1, [1, 0, wn**2]))[1],
404411
1/(ratio_dt*ratio*wn))
405412
zeta = .1
406413
np.testing.assert_array_almost_equal(
407-
_ideal_tfinal_and_dt(TransferFunction(1, [1, 2*zeta*wn, wn**2]))[1],
414+
_ideal_tfinal_and_dt(TransferFunction(1, [1, 2*zeta*wn, wn**2]))[1],
408415
1/(ratio_dt*ratio*wn))
409416
# but a smapled one keeps its dt
410417
np.testing.assert_array_almost_equal(
411-
_ideal_tfinal_and_dt(TransferFunction(1, [1, 2*zeta*wn, wn**2]).sample(.1))[1],
418+
_ideal_tfinal_and_dt(TransferFunction(1, [1, 2*zeta*wn, wn**2]).sample(.1))[1],
412419
.1)
413420
np.testing.assert_array_almost_equal(
414-
np.diff(initial_response(TransferFunction(1, [1, 2*zeta*wn, wn**2]).sample(.1))[0][0:2]),
421+
np.diff(initial_response(TransferFunction(1, [1, 2*zeta*wn, wn**2]).sample(.1))[0][0:2]),
415422
.1)
416423
np.testing.assert_array_almost_equal(
417-
_ideal_tfinal_and_dt(TransferFunction(1, [1, 2*zeta*wn, wn**2]))[1],
424+
_ideal_tfinal_and_dt(TransferFunction(1, [1, 2*zeta*wn, wn**2]))[1],
418425
1/(ratio_dt*ratio*wn))
419-
420-
426+
427+
421428
# TF with fast oscillations simulates only 5000 time steps even with long tfinal
422-
self.assertEqual(5000,
429+
self.assertEqual(5000,
423430
len(_default_time_vector(TransferFunction(1, [1, 0, wn**2]),tfinal=100)))
424-
431+
425432
sys = TransferFunction(1, [1, .5, 0])
426433
sysdt = TransferFunction(1, [1, .5, 0], .1)
427434
# test impose number of time steps
@@ -430,16 +437,16 @@ def test_auto_generated_time_vector(self):
430437
self.assertNotEqual(15, len(step_response(sysdt, T_num=15)[0]))
431438
# test impose final time
432439
np.testing.assert_array_almost_equal(
433-
100,
440+
100,
434441
np.ceil(step_response(sys, 100)[0][-1]))
435442
np.testing.assert_array_almost_equal(
436-
100,
443+
100,
437444
np.ceil(step_response(sysdt, 100)[0][-1]))
438445
np.testing.assert_array_almost_equal(
439-
100,
446+
100,
440447
np.ceil(impulse_response(sys, 100)[0][-1]))
441448
np.testing.assert_array_almost_equal(
442-
100,
449+
100,
443450
np.ceil(initial_response(sys, 100)[0][-1]))
444451

445452

@@ -490,7 +497,7 @@ def test_time_vector(self):
490497
np.testing.assert_array_equal(tout, Tin1)
491498

492499
# MIMO forced response
493-
tout, yout, xout = forced_response(self.mimo_dss1, Tin1,
500+
tout, yout, xout = forced_response(self.mimo_dss1, Tin1,
494501
(np.sin(Tin1), np.cos(Tin1)),
495502
mimo_x0)
496503
self.assertEqual(np.shape(tout), np.shape(yout[0,:]))

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy