Repository navigation
Release notes
This page contains information for developers on the past and future releases for the package. For each release, the major changes are listed. Each release should (eventually) have its own page describing the detailed changes that are included for that release.
Release naming conventions: starting with release 0.7.0, we use the major.minor.revision numbering convention for releases:
- The revision number is incremented when minor bugs are fixed. All previous code should function without change.
- The minor number is incremented when minor features or significant fixes have been added.
- The major number is incremented when there are significant jumps in functionality such as changing the framework which could cause incompatibility with interfacing systems
Pending items (remove when done):
- List of open issues associated with this release
- List of open pull requests associated with this release.
New features:
- Discrete time LQR and LQE (#670 by sawyerbfuller, murrayrm)
- Remove Python 2.7 support and leverage @ operator (#679 by bnavigator)
- Additional I/O system type conversions (#672 by murrayrm)
- Modify discrete-time contour for nyquist plots to indent around poles (#668 by sawyerbfuller)
- New PID design function built on sisotool (#662 by sawyerbfuller)
- Check for unused subsystem signals in InterconnectedSystem (#652 by roryyorke)
- New time response data class (#649 by murrayrm)
- Include InfValue into settling min/max calculation for step_info (#600 by bnavigator)
- A first implementation of the singular value plot (#593 by forgi86)
- Return a discrete time system with drss() (#589 by bnavigator)
- Add optimization to flat systems trajectory generation (#569 by murrayrm)
Improvements, bug fixes:
- Allow use of SciPy for LQR, LQE (#683 by murrayrm)
- BUG: extrapolation in ufun throwing errors (#682 by miroslavfikar)
- Vectorize FRD feedback function (#680 by bnavigator)
- Improved lqe calling functionality (#673 by murrayrm)
- Fixed prewarp not working in c2d and sample_system, margin docstring improvements (#669 by sawyerbfuller)
- Return frequency response for 0 and 1-state systems directly (#663 by bnavigator)
- Plot Nyquist frequency correctly in Bode plot in Hz (#651 by murrayrm)
- Fix damp method for discrete time systems with a negative real-valued pole (#647 by vincentchoqueuse)
- Refine automatic contour determination in Nyquist plot (#620 by bnavigator)
- Updated rlocus.py to remove warning by sisotool() with rlocus_grid=True (#616 by nirjhar-das)
- Discrete time LaTeX repr of StateSpace systems (#609 by bnavigator)
- Fix warnings generated by sisotool (#608 by roryyorke)
- IPython LaTeX output only generated for small systems (#607 by roryyorke)
- Change step_info undershoot percentage calculation (#590 by juanodecc)
- Improve forced_response and its documentation (#588 by bnavigator)
Additional changes:
- Remove duplicate Slycot error handling, require Slycot >=0.4 (#678 by bnavigator)
- Fix doc escape (#674 by bnavigator)
- Use conda-forge for numpy (CI fix) (#667 by bnavigator)
- Ease test tolerance on timeseries (#659 by bnavigator)
- Various docstring edits + fixed plot legends on cruise control example (#643 by billtubbs)
- Documentation updates (#633 by murrayrm)
- Add DefaultDict for deprecation handling (#619 by bnavigator)
- Improved unit test coverage for root_locus: dtime and sisotool (#617 by bnavigator)
- Allow float precision in result assertions (#615 by bnavigator)
- Remove statement that slycot only on linux (#603 by sawyerbfuller)
- Remove from readme.rst that you need a fortran compiler (#602 by sawyerbfuller)
- xfail testmarkovResults until #588 is merged (#601 by bnavigator)
- LTI squeeze: ndarray.ndim == 0 is also a scalar (#595 by bnavigator)
- Don't install toplevel benchmarks package (#585 by bnavigator)
- Replace Travis badge with GHA workflows, add PyPI and conda badges (#584 by bnavigator)
- Full list of merged pull requests associated with this release.
- Full list of commits associated with this release.
Pending items (remove when done):
- List of open issues associated with this release
- List of open pull requests associated with this release.
Version 0.9.0 of the Python Control Toolbox (python-control) contains a number of enhanced features and changes to functions. Some of these changes may require modifications to existing user code and, in addition, some default settings have changed that may affect the appearance of plots or operation of certain functions.
Significant new additions including improvements in the I/O systems modules that allow automatic interconnection of signals having the same name (via the interconnect function), generation and plotting of describing functions for closed loop systems with static nonlinearities, and a new optimal control module that allows basic computation of optimal controls (including model predictive controllers). Some of the changes that may break use code include the deprecation of the NumPy matrix type (2D NumPy arrays are used instead), changes in the return value for Nyquist plots (now returns number of encirclements rather than the frequency response), switching the default timebase of systems to be 0 rather than None (no timebase), and changes in the processing of return values for time and frequency responses (to make them more consistent). In many cases, the earlier behavior can be restored by calling use_legacy_defaults('0.8.4'). A full list of additions and changes is described below.
New features
- Optimal control module, including rudimentary MPC control (#549 by murrayrm)
- Describing functions plots (#521 by murrayrm)
- MIMO impulse and step response (#514 by murrayrm)
- I/O system improvements:
- Implementation of initial_phase, wrap_phase keywords for bode_plot (#494 by murrayrm)
- Added IPython LaTeX representation method for StateSpace objects (#450 by roryyorke)
- New dynamics() and output() methods in StateSpace (#566 by sawyerbfuller)
- FRD systems can now be created from a discrete time LTI system (#568 by bnavigator)
- Cost and constraints are now allowed for flatsys.point_to_point() (#569 by murrayrm)
Interface changes
- Switch default state space matrix type to 'array' (instead of 'matrix') (#480 by murrayrm, #486 by bnavigator, #433 by sawyerbfuller)
- Use __call__ instead of evalfr in lti system classes (#449 by sawyerbfuller)
- Default dt is now 0 instead of None (#431 by sawyerbfuller, #490 by bnavigator)
- Change default value of statesp.remove_useless_states to False (#509 by murrayrm)
- Standardize time response return values, return_x/squeeze keyword processing (#511 by murrayrm)
- Standardize squeeze processing in frequency response functions (#507 by murrayrm)
- Nyquist plot now returns number of encirclements (#534 by murrayrm)
- Switch LTI class and subclasses to use ninputs, noutputs, nstates (#515 by murrayrm)
- Use standard time series convention for markov() input data (#508 by murrayrm)
- TransferFunction array priority plus system type conversion checking (#498 by murrayrm)
- Generate error for tf2ss of non-proper transfer function (#492 by murrayrm)
- Updated return values for frequency response evaluated at poles (#542 by murrayrm)
Improvements, bug fixes
- Nyquist plot improvements: better arrows, handle poles on imaginary axis (#534 by murrayrm)
- Sisotool small visual cleanup, new feature to show step response of different input-output than loop (#531 by sawyerbfuller)
- Add bdschur() and fox modal form with repeated eigenvalues (#495 by roryyorke)
- Fix rlocus timeout due to inefficient _default_wn calculation (#527 by murrayrm)
- Fix #523: finding z for |H(z)|=1 computed the wrong polynomials (#525 by bnavigator)
- Freqplot improvements (#522 by sawyerbfuller)
- Fix rlocus plotting problem in Jupyter notebooks (#503 by murrayrm)
- Handle empty pole vector for timevector calculation (#485 by bnavigator)
- Fix lqe() docstring and input array type (#483 by bnavigator)
- Updated markov() to add tranpose keyword + default warning (#478 by murrayrm)
- Fix impulse size for discrete-time impulse response (#447 by sawyerbfuller)
- Extend returnScipySignalLTI() to handle discrete-time systems (#445 by bnavigator)
- Bug fixes and extensions for step_info() (#555 by sawyerbfuller, #567 by juanodecc, #577 by bnavigator)
Additional changes
- Address NumPy deprecations np.int, np.float (#539 by dapperfu, #548 by murrayrm)
- Shift CI tests from Travis CI to GitHub Actions (#504 by murrayrm)
- Link to developer wiki in docs. (#502 by sawyerbfuller)
- Reduce Python 3 testing to speed up Travis CI testing (#487 by murrayrm)
- Refactor the test suite using pytest for array and matrix types (#438 by bnavigator)
- Full list of merged pull requests associated with this release.
- Full list of commits associated with this release.
- Improved default time vector for time response functions (bnavigator, sawyerbfuller)
- New
use_legacy_defaultsfunction to allow compatibility with previous versions (sawyerbfuller) - Allow creation of non-proper transfer functions (bnavigator, rlegnain)
- Added ability to set arrow head length and width option in
nyquist_plot(geekonloose) - Added ability to 'prewarp' the conversion of continuous to discrete-time systems (sawyerbfuller)
- Added rlocus capability for discrete-time systems (sawyerbfuller)
- Updated
pzmapgrid to be compatible withmatplotlibupdates (bnavigator) - Implement loadable string representation (repr) for tf, ss, and frd (repagh)
- Fixed
margincomputation for discrete time systems (bnavigator) - Fixed indexing bug in
bdalg.connect(sawyerbfuller) - Fixed
InterconnectedSystemnaming bugs, improved conventions (samlaf) - Fixed
LinearIOSystemoutput bug in output function (francescoseccamonte) - Fixed bug in
forced_responsethat overrodesqueezeparameter (bnavigator) - Use rad/sec for Bode plot in MATLAB bode (was erroneously defaulting to Hertz) (paulvicioso)
- Removed deprecated
scipycalls and updated to latestnumpy(bnavigator) - Multiple documentation updates (bnavigator, laurensvalk)
- New and improved examples for sisotool, pvtol (repagh, samlaf)
- The
rlocusfunction no longer automatically creates a new figure - Updated unit tests + switch to pytest (bnavigator, sawyerbfuller)
- Return type for eigenvalues in
lqechanged to 1D array (matcheslqr) - Small fixes + documentation updates to
markov - Full list of merged pull requests associated with this release.
- Full list of commits associated with this release
- New input/output systems module for creating nonlinear systems from individual I/O subsystems, with
find_eqpt,input_output_response, andlinearizefunctionality - Initial implementation of differential flatness module for computing feasible trajectories for differentially flat (nonlinear) systems
- Preliminary version of lqe function (sawyerbfuller)
- New dict-based implementation of user-configurable package/module configuration parameters
- Added similarity transformation function
- Add 's' and 'z' variable support to tf()
- Fixed discrete time simulation time step issue
- Reordered Gang of Four plots to match FBS
- Check for symmetric matrices with machine precision (bnavigator)
- Changed root precision tolerance and imaginary detection in
xferfcn._common_den(bnavigator) - Fixed bug in timeresp.forced_response (adm78)
- Improved latex representation for exp format and multi-digit exponents of s or z (bnavigator)
- Renamed
FRDclass nameFrequencyResponseDatato fix MacOS sphinx build problems (FRDstill defined for backward compatibility` - Allow np.array or np.matrix for state space matrices, operations via
use_numpy_matrix - Improved detection of when to add additional points in
root_locus - Adaptive gain click criterion and zoom bug fix for
root_locus(icam0) - Improved code for ctrb and obsv (billtubbs)
- Documentation updates (bnavigator, murrayrm, roryyorke)
- Updated examples to be PEP compliant
- Improved unit tests (bnavigator, murrayrm), increased coverage to ~80%
- Full list of merged pull requests associated with this release.
- Full list of commits associated with this release
- Fixed a number of small bugs , including discrete time simulations (bnavigator), integer values in state space matrics (don4get), missing zeros on pole/zero plots (Sup3rGeo)
- First cut at a new step_info() function, similar to MATLAB (joaoantoniocardoso)
- Added a new function for dynamically setting gain in sisotool (icam0)
- Anti-stabilizing solutions for Riccati equations are now available (dbacc)
- Printout out state space systems in Jupyter notebooks now formats using LaTeX (alchemyst)
- Additional performance and visualiation improvements: _remove_useless_states (adm78), margins on Bode plots ( icam0), improved damping lines in discrete pzmap (Sup3rGeo)
- List of merged pull requests associated with this release.
- List of commits associated with this release
- A new canonical function modal_form can be used to convert a state space system to modal form (ipa-lth)
- Improved pole placement algorithm place_varga (rabraker)
- Bug fix in computing poles of MIMO transfer functions
- Indexing of MIMO transfer functions (hungpham2511)
- Additional small bug fixes (adm78, stertingen)
- Documentation updates and fixes (joaoantoniocardoso)
- List of merged pull requests associated with this release.
- List of commits associated with this release
- Updated and corrected docstrings (PR #198, PR #216)
- Better support for MIMO systems in
pole()andzero()functions (PR #205, PR #206) - Support for SciPy-1.0.0 updates to the
scipy.signalmodule that is used for some python-control functions and support fornumpydata types (int32, int64, etc) in all python-control functions (PR #170) - Support for static gains (0D state space systems and constant transfer functions) (PR #104, PR #110, PR #126, PR #129, PR #145)
- Note: Open issues related to this: #165
- New functions
obsv(observable canonical form, PR #103),augwandmixsyn(mixed sensitivity synthesis, PR #151) - List of merged pull requests associated with this release.
- List of commits associated with this release
- Fixes to docstrings and examples (multiple)
- Bug fix to gain margin calculation for phase crossing through zero
-
c2dfunctionality added for MIMO state-space systems - Faster versions of
freqrespfor transfer functions and state space models - Fixed bug in
dareso that it returns stabilizing solution - Faster version of
force_response(lsim) - Installation via pip and conda
- Gain vector now optional in
root_locus - List of commits associated with this release
- Fixed a bug in dime.py that caused errors when using method
tustinorzoh. - Improved stability margin calculations, including support for FRD systems.
- Minimal realization support for transfer functions and state space systems.
- New MATLAB-like functions:
append,connect,minreal - Increased python3 compatibility.
-
Support for discrete time systems using the 'timebase' variable
dt. For continuous systemsdt = 0and for discrete time systemsdt = sampling time. Ifdt = None, timebase is not specified and can be either discrete or continuous time. System compositions (series,parallel,feedback) requires matching timebases (with automatic conversion if one timebase isNoneand the other is specified). -
There is now a frequency response data (
FRD) subclass contributed by Rene van Paassen. For now, the frequency vectors of differentFRDobjects need to match; no interpolation / clipping yet. -
There is now a
mineralfunction for computing minimal transfer functions (by removing pole zero cancellations), contributed by Rene van Paassen. -
Improved support for python 3.x: the current version should run in python 2.6+ (tested in 2.7) and python 3.x (tested in 3.2). I haven't yet tested slycot in python 3.x, but the functions that don't require slycot (most SISO calculations) are working.
- Bode and Nyquist plot enhancements that allows matplotlib keywords to be passed through functions for more flexible setting of line styles (thanks to Kevin Davies for the initial code). Nyquist plots now allow labeling of frequency points via the
labelFreqkeyword (code contributed by Kevin Davies). - Fixed problems in
tf2ssconversions when there are poles with multiplicity > 1. This was generating lots of errors in the unit tests (properly, as it turns out, since there was a bug!). - Added
ackerfunction from Roberto Bucher - Improved unit testing with fewer warnings and error messages. Substantial modifications to
convert_test.pythat included fixing bugs in the unit test code and the conversion code (as noted above).
- Updated time responses functions:
step_response,initial_response,impulse_responseandforced_response, along with MATLAB compatible versions (step,initial,impulse,lsim). Handles MIMO systems by allowing choice of input and output. - Added a phase_plot command that can be used to generate rudimentary phase portraits for 2D nonlinear systems (similar to the plots in Chapter 4 of Feedback Systems). See
examples/geneticswitch.pyfor an example. - Updated many function names to be more consistent with python coding style. So StepResponse is now step_response. MATLAB module (
control.matlab) interfaces are unaffected (continue to usestep). - New function to compute frequencies at which transfer function crosses real axis (phase_crossover_frequencies). Contributed by Steffen Waldherr
- Added matrix solvers from LTH (Ola Johnsson, Jerker Nordh, Bjorn Olofsson, Vanessa Romero Segovia. These implement the
lyap,dlyap,careanddarefunctions usingslycot. - Added
tfvis, Simple GUI application for visualizing how the poles/zeros of the transfer function effects the Bode, Nyquist and step response of a SISO system. Contributed by Vanessa Romero Segovia, Ola Johnsson, Jerker Nordh.
-
Initial implementation of model reduction functions:
hsvd,modred,balred, courtesy of Brandt Belson, Steve Brunton, Kevin Chen, and Lauren Padilla. -
Changes to (eventually) support MIMO transfer functions. These should be transparent to users of the MATLAB interface (control.matlab), but control functions now use a separate class structure. Courtesy randt Belson, Steve Brunton, Kevin Chen, and Lauren Padilla.
-
Updated functionality for Nichols charts, courtesy Allan McInnes.
-
Improvements in unwrap function, courtesy Sawyer Fuller.
- New function: rlocus(), courtesy Ryan Krauss
- New function: pade(), courtesy Sawyer Fuller
- New functions: nichols(), ngrid(), courtesy Allan McInnes
- Added
lsimwrapper to allow systems with poles at origin. Still need to fix this for step() and impulse()
- Added
placeandlqrcommands, using the SLICOT library (via Enrico Avventi'sslycotwrappers). LQR works on MIMO systems. - Frequency range for Bode plots are now computed using the poles and zeros of the system.
- Bode plots can how accept a list of systems:
bode(sys1, ..., sysN) - Put in docstrings for all user accessible functions