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](https://github.com/python-control/python-control/pull/549) by murrayrm)
* Describing functions plots ([521](https://github.com/python-control/python-control/pull/521) by murrayrm)
* MIMO impulse and step response ([514](https://github.com/python-control/python-control/pull/514) by murrayrm)
* I/O system improvements:
* linearize() retains signal names plus new interconnect() function ([497](https://github.com/python-control/python-control/pull/497) by murrayrm)
* Add summing junction + implicit signal interconnection ([517](https://github.com/python-control/python-control/pull/517) by murrayrm)
* Implementation of initial_phase, wrap_phase keywords for bode_plot ([494](https://github.com/python-control/python-control/pull/494) by murrayrm)
* Added IPython LaTeX representation method for StateSpace objects ([450](https://github.com/python-control/python-control/pull/450) by roryyorke)
* New dynamics() and output() methods in StateSpace ([566](https://github.com/python-control/python-control/pull/566) by sawyerbfuller)
* FRD systems can now be created from a discrete time LTI system ([568](https://github.com/python-control/python-control/pull/568) by bnavigator)
* Cost and constraints are now allowed for flatsys.point_to_point() ([569](https://github.com/python-control/python-control/pull/569) by murrayrm)
Interface changes
* Switch default state space matrix type to 'array' (instead of 'matrix') ([480](https://github.com/python-control/python-control/pull/480) by murrayrm, #[486](https://github.com/python-control/python-control/pull/486) by bnavigator, #[433](https://github.com/python-control/python-control/pull/433) by sawyerbfuller)
* Use \_\_call\_\_ instead of evalfr in lti system classes ([449](https://github.com/python-control/python-control/pull/449) by sawyerbfuller)
* Default dt is now 0 instead of None ([431](https://github.com/python-control/python-control/pull/431) by sawyerbfuller, #[490](https://github.com/python-control/python-control/pull/490) by bnavigator)
* Change default value of statesp.remove_useless_states to False ([509](https://github.com/python-control/python-control/pull/509) by murrayrm)
* Standardize time response return values, return_x/squeeze keyword processing ([511](https://github.com/python-control/python-control/pull/511) by murrayrm)
* Standardize squeeze processing in frequency response functions ([507](https://github.com/python-control/python-control/pull/507) by murrayrm)
* Nyquist plot now returns number of encirclements ([534](https://github.com/python-control/python-control/pull/534) by murrayrm)
* Switch LTI class and subclasses to use ninputs, noutputs, nstates ([515](https://github.com/python-control/python-control/pull/515) by murrayrm)
* Use standard time series convention for markov() input data ([508](https://github.com/python-control/python-control/pull/508) by murrayrm)
* TransferFunction array priority plus system type conversion checking ([498](https://github.com/python-control/python-control/pull/498) by murrayrm)
* Generate error for tf2ss of non-proper transfer function ([492](https://github.com/python-control/python-control/pull/492) by murrayrm)
* Updated return values for frequency response evaluated at poles ([542](https://github.com/python-control/python-control/pull/542) by murrayrm)
Improvements, bug fixes
* Nyquist plot improvements: better arrows, handle poles on imaginary axis ([534](https://github.com/python-control/python-control/pull/534) by murrayrm)
* Sisotool small visual cleanup, new feature to show step response of different input-output than loop ([531](https://github.com/python-control/python-control/pull/531) by sawyerbfuller)
* Add bdschur() and fox modal form with repeated eigenvalues ([495](https://github.com/python-control/python-control/pull/495) by roryyorke)
* Fix rlocus timeout due to inefficient _default_wn calculation ([527](https://github.com/python-control/python-control/pull/527) by murrayrm)
* Fix [523](https://github.com/python-control/python-control/pull/523): finding z for |H(z)|=1 computed the wrong polynomials (#[525](https://github.com/python-control/python-control/pull/525) by bnavigator)
* Freqplot improvements ([522](https://github.com/python-control/python-control/pull/522) by sawyerbfuller)
* Fix rlocus plotting problem in Jupyter notebooks ([503](https://github.com/python-control/python-control/pull/503) by murrayrm)
* Handle empty pole vector for timevector calculation ([485](https://github.com/python-control/python-control/pull/485) by bnavigator)
* Fix lqe() docstring and input array type ([483](https://github.com/python-control/python-control/pull/483) by bnavigator)
* Updated markov() to add tranpose keyword + default warning ([478](https://github.com/python-control/python-control/pull/478) by murrayrm)
* Fix impulse size for discrete-time impulse response ([447](https://github.com/python-control/python-control/pull/447) by sawyerbfuller)
* Extend returnScipySignalLTI() to handle discrete-time systems ([445](https://github.com/python-control/python-control/pull/445) by bnavigator)
* Bug fixes and extensions for step_info() ([555](https://github.com/python-control/python-control/pull/555) by sawyerbfuller, #[567](https://github.com/python-control/python-control/pull/567) by juanodecc, #[577](https://github.com/python-control/python-control/pull/577) by bnavigator)
Additional changes
* Address NumPy deprecations np.int, np.float ([539](https://github.com/python-control/python-control/pull/539) by dapperfu, #[548](https://github.com/python-control/python-control/pull/548) by murrayrm)
* Shift CI tests from Travis CI to GitHub Actions ([504](https://github.com/python-control/python-control/pull/504) by murrayrm)
* Link to developer wiki in docs. ([502](https://github.com/python-control/python-control/pull/502) by sawyerbfuller)
* Reduce Python 3 testing to speed up Travis CI testing ([487](https://github.com/python-control/python-control/pull/487) by murrayrm)
* Refactor the test suite using pytest for array and matrix types ([438](https://github.com/python-control/python-control/pull/438) by bnavigator)
* Full list of [merged pull requests](https://github.com/python-control/python-control/pulls?utf8=✓&q=is%3Amerged+milestone%3A0.9.0) associated with this release.
* Full list of [commits](https://github.com/python-control/python-control/compare/0.8.4..0.9.0) associated with this release.