Releases: python-control/python-control
0.10.1
What's Changed
- Fix docstring for root_locus_map by @bnavigator in #988
- Update documentation, processing of root_locus kvect keyword by @murrayrm in #989
- Fix typo in ICSystem updfcn, outfcn: update_params -> _update_params by @murrayrm in #990
- Support NumPy 2 by @bnavigator in #994
- Set response I/O labels from system for frequency response by @murrayrm in #1000
- Change
klist
togains
kwarg for matlab.wrappers.rlocus by @gdmcbain in #999 - Fix typo in xferfcn.py by @ansrandrieu in #1005
- Add place_varga in API doc by @pierre-haessig in #1004
- Process legacy rlocus keyword k->gains by @gdmcbain in #1003
- Fix numpydoc for place_varga by @bnavigator in #1007
- Improve
acker
pole placement doc by @pierre-haessig in #1006 - Fix nyquist plotting from FrequencyResponseData by @wueestry in #996
- Better I/O systems support for phase plots by @murrayrm in #1001
- Updates for NumPy 2.0 compatibility in CI tests by @murrayrm in #1013
- Add slicing access for state-space models with tests by @guptavaibhav0 in #1012
- Frequency plot improvements by @murrayrm in #1011
- Add extra information to nyquist plots by @wueestry in #997
- Fix bug in root_locus_plot identified by @NikolaiVChr in issue #1016 by @murrayrm in #1021
- Fix parallel input or output interconnect bug (issue #1015) by @murrayrm in #1017
- Time response plot improvements by @murrayrm in #1018
- Fix impuse response, input data only contains one input[0]==1 in each trace by @KybernetikJo in #1023
- Small improvements to nlsys, bdalg by @murrayrm in #1019
- Fix step_info settling time calculation by @murrayrm in #1029
- Update timeplot.py by @murrayrm in #1030
- Move ctrlplot code prior to upcoming PR by @murrayrm in #1033
- Add pyqt dependency for QtAgg testing by @murrayrm in #1035
- Improve markov function, add mimo support, change api to TimeResponseData by @KybernetikJo in #1022
- Implement ERA, change api to TimeResponseData by @KybernetikJo in #1024
- Change function names in modelsimp, add aliases by @KybernetikJo in #1028
- Update OS/BLAS test matrix workflow by @murrayrm in #1036
- Control plot refactoring for consistent functionality by @murrayrm in #1034
- CDS 110 and CDS 112 Jupyter notebooks by @murrayrm in #1037
- Documentation updates and testing by @murrayrm in #1038
- Update shared axes processing in plot_time_response by @murrayrm in #1040
- Update macos gfortran version by @murrayrm in #1041
- Small user documentation fixes by @murrayrm in #1042
New Contributors
- @gdmcbain made their first contribution in #999
- @ansrandrieu made their first contribution in #1005
- @pierre-haessig made their first contribution in #1004
- @wueestry made their first contribution in #996
- @guptavaibhav0 made their first contribution in #1012
Full Changelog: 0.10.0...0.10.1
0.10.0
What's Changed
- Multivariable interconnect functionality by @murrayrm in #881
- Remove NumPy matrix class by @murrayrm in #913
- I/O system class restructuring by @murrayrm in #916
- Documentation fixes by @KybernetikJo in #919, #921, #922, #923
- Add two MRAC siso examples by @KybernetikJo in #914
- Time response plots by @murrayrm in #920
- Print a connection table for interconnected systems by @sawyerbfuller in #925
- Update frequency response plots to use _response/_plot pattern by @murrayrm in #924
- create_statefbk_iosystem and optimal control enhancements by @murrayrm in #930
- Add unit test illustrating issue #935 + add method keyword for tf2ss by @murrayrm in #937
- Vectorize optimal control cost calculation by @urpok23 in #940
- Improved speed of ctrb and obsv functions by @Jpickard1 in #941
- Fix sphinx bug (erroneous use of class template) by @murrayrm in #943
- Fix bug in matched transformation + address other issues in #950 by @murrayrm in #951
- Fix typo in header of Hinf example by @jrforbes in #946
- Fix typo in stochresp.py by @alex-damjanovic in #945
- Fix TimeResponseData.to_pandas() to handle zero state case by @murrayrm in #958
- Update pole/zero and root locus plots to use _map/_plot pattern by @murrayrm in #953
- Fix CI warnings by @murrayrm in #955
- Support Python 3.12, bump minimum support according to SPEC 0 by @bnavigator in #961
- Fix typos in pzmap.py by @matejkarasek in #962
- Fix examples to work with SciPy 1.12 by @bnavigator in #965
- Fix config test for missing old key warning by @bnavigator in #972
- Implementation of system norms by @henriks76 in #971, #976
- Updated gram() to support discrete-time systems by @billtubbs in #969
- Update unit test infrastructure by @murrayrm in #981, #986
- Remove external/ directory by @murrayrm in #983
- Reimplementation of 2D phase plots by @murrayrm in #980
- Update readthedocs to Python 3.12 by @murrayrm in #985
- Fix warning messages in tests; update rlocus/pzmap limits by @murrayrm in #984
- Allow passing and saving of params in time responses by @murrayrm in #982
New Contributors
- @KybernetikJo made their first contribution in #919
- @urpok23 made their first contribution in #940
- @Jpickard1 made their first contribution in #941
- @alex-damjanovic made their first contribution in #945
- @matejkarasek made their first contribution in #962
- @henriks76 made their first contribution in #971
Full Changelog: 0.9.4...0.10.0
0.9.4
What's Changed
- remove commit from version test by @murrayrm in #833
- Add README to pyproject metadata by @bnavigator in #835
- allow .postn for readthedocsversion by @murrayrm in #836
- Sisotool: Fix Matplotlib deprecation of axis share handling by @bnavigator in #834
- GHA run examples: Create a dedicated conda env and use it by @bnavigator in #855
- iosys doc example: Use array types updatefcn input/output by @bnavigator in #854
- Fix Interconnect name clobbering by @henklaak in #857
- Solve #862 and #864: bode_plot phase wrapping incorrect for multiple systems by @henklaak in #863
- Fix root_locus() handling of ax parameter by @henklaak in #871
- Fix editsdefaults fixture by @henklaak in #874
- Small fixes based on Caltech CDS 112 course by @murrayrm in #849
- Feature print zpk by @henklaak in #869
- Feature enable doctest by @henklaak in #868
- Optimization-based and moving horizon estimation by @murrayrm in #877
- Small fixes for 0.9.4 release by @murrayrm in #880
- new examples for Simulink-like interconnection of digital and nonlinear systems by @sawyerbfuller in #882
- fix blank bode plot in rootlocus_pid_designer by @sawyerbfuller in #883
- bandwidth feature by @SCLiao47 in #889
- update nyquist_plot for DT transfer functions with poles at 0 and 1 by @sawyerbfuller in #885
- Add missing labels when returning TimeResponseData by @joaoantoniocardoso in #892
- fix damp command natural frequency printout for discrete poles on real axis by @sawyerbfuller in #894
- Add H2 and Hinf synthesis examples by @jrforbes in #895
- warn if prewarp-frequency is not used by @sawyerbfuller in #900
- make _convert_to_statespace properly pass signal and system names by @sawyerbfuller in #884
- Change name of converted LinearIOSystems by @murrayrm in #903
- add/cleanup documentation on simulation functions by @murrayrm in #905
- Fixed spelling mistake in description by @jrforbes in #909
- fix up some warning messages due to converted systems by @murrayrm in #907
- fix bdschur (see issue #911) by @murrayrm in #912
New Contributors
- @henklaak made their first contribution in #857
- @SCLiao47 made their first contribution in #889
- @jrforbes made their first contribution in #895
Full Changelog: 0.9.3...0.9.4
0.9.3: Improvements in optimal and flatsys modules, updated passivity module, gain scheduling support, bug fixes
What's Changed
- Handle t_eval for static systems in input_output_response by @murrayrm in #743
- add GitHub URL for PyPi by @andriyor in #708
- Remove Deprecated API calls to Pytest, SciPy <1.3, Python 2 by @bnavigator in #745
- Add passivity module, ispassive function, and passivity_test. Introduces optional dependency cvxopt. by @Mark-Yeatman in #739
- Slycot source uses setuptools_scm now by @bnavigator in #751
- Passivity indices and support for discrete time systems. by @Mark-Yeatman in #750
- Switch CI to mambaforge and conda-forge channel by @bnavigator in #757
- Fix timebase bug in InterconnectedSystem (issue #754) by @murrayrm in #755
- fix issue with slycot balred change in state by @bnavigator in #762
- Build system and test suite update by @bnavigator in #759
- fix control.matlab.lsim bug for discrete time system by @murrayrm in #765
- Add B-splines and solve_flat_ocp to flatsys by @murrayrm in #763
- CI: switch slycot and cvxopt installation order by @murrayrm in #769
- Fixed a couple of typos in documentation by @fredrhen in #775
- Allow new matplotlib 3.6 error message in kwargs tests by @bnavigator in #777
- Move sys._update_params(params) before TimeResponseData return when nstate == 0 by @hyumo in #774
- Update MANIFEST.in by @bnavigator in #779
- Improve compatibility of state space representation using LaTeX by @gonmolina in #780
- Fix interconnect type conversion bug for StateSpace systems by @murrayrm in #788
- fix _isstatic() to use nstates==0 by @murrayrm in #790
- fix error when an IOSystem is combined with a TransferFunction system by @sawyerbfuller in #793
- check for and fix mutable keyword defaults by @murrayrm in #794
- Fixes for bugs found by pylint by @roryyorke in #795
- Support Python 3.11 and drop Python 3.7 by @bnavigator in #796
- Fix find_eqpt when y0 is None by @adswid in #798
- Preserve signal names upon conversion to discrete-time by @sawyerbfuller in #797
- Update benchmarks to help with optimal control tuning by @murrayrm in #800
- Update optimal.rst by @htadashi in #802
- Add collocation method for optimal control problems by @murrayrm in #799
- Update README.rst by @sawyerbfuller in #810
- Update docstring for impulse for discrete sys by @sawyerbfuller in #812
- Enable scalar division of state-space objects by @roryyorke in #811
- fix gain handling in rlocus and sisotool by @sawyerbfuller in #809
- Removed epsilon perturbation value in solve_passivity_LMI. Fix associated unit test. by @Mark-Yeatman in #814
- docstring improvements by @sawyerbfuller in #804
- add zpk() function by @murrayrm in #816
- Fix readthedocs to use pip-based install by @murrayrm in #817
- Relax comparison of floats in tests by @bnavigator in #818
- Add test matrix against operating environments by @murrayrm in #821
- Update find_eqpts to handle discrete time systems by @murrayrm in #824
- Small fixes and tweaks by @murrayrm in #826
- update docs to use use numpydoc + linkcode by @murrayrm in #828
- Add gain scheduling to create_statefbk_iosystem() by @murrayrm in #827
- continuous time system support for create_estimator_iosystem by @murrayrm in #829
- Small docstring fixes for release by @murrayrm in #832
New Contributors
- @andriyor made their first contribution in #708
- @Mark-Yeatman made their first contribution in #739
- @fredrhen made their first contribution in #775
- @hyumo made their first contribution in #774
- @adswid made their first contribution in #798
- @htadashi made their first contribution in #802
Full Changelog: 0.9.2...0.9.3
Improvements in I/O systems, stochastic systems, optimization-based control, Nyquist plots
What's Changed
- Round to nearest integer decade for default omega vector by @bnavigator in #688
- Fix in documentation of ss2tf by @miroslavfikar in #695
- Interpret str-type args to
interconnect
as non-sequence by @roryyorke in #698 - Fixes to various optimization-based control functions by @murrayrm in #709
- I/O system enhancements by @murrayrm in #710
- Optimal control enhancements by @murrayrm in #712
- Keyword argument checking by @murrayrm in #713
- Stochastic systems additions by @murrayrm in #714
- Updated system class functionality by @murrayrm in #721
- Bug fix and improvements to Nyquist plots by @murrayrm in #722
- Add
linform
to compute linear system L-infinity norm by @roryyorke in #729 - Improvements to Nichols chart plotting by @roryyorke in #723
- Add envs to gitignore by @s35t in #731
- Added binder link by @jonititan in #693
- Update python-package-conda workflow to use conda instead of conda-forge by @murrayrm in #736
- Fix README.rst for twine by @murrayrm in #738
New Contributors
- @s35t made their first contribution in #731
- @jonititan made their first contribution in #693
Full Changelog: 0.9.1...0.9.2
New functionality for discrete time systems, flat systems, time responses + bug fixes and improvements
Version 0.9.1 is a minor release that includes new functionality for discrete time systems (dlqr, dlqe, drss), flat systems (optimization and constraints), a new time response data class, and many individual improvements and bug fixes.
New features:
- Add optimization to flat systems trajectory generation (#569 by murrayrm)
- Return a discrete time system with drss() (#589 by bnavigator)
- A first implementation of the singular value plot (#593 by forgi86)
- Include InfValue into settling min/max calculation for step_info (#600 by bnavigator)
- New time response data class (#649 by murrayrm)
- Check for unused subsystem signals in InterconnectedSystem (#652 by roryyorke)
- New PID design function built on sisotool (#662 by sawyerbfuller)
- Modify discrete-time contour for Nyquist plots to indent around poles (#668 by sawyerbfuller)
- Additional I/O system type conversions (#672 by murrayrm)
- Remove Python 2.7 support and leverage @ operator (#679 by bnavigator)
- Discrete time LQR and LQE (#670 by sawyerbfuller, murrayrm)
Improvements, bug fixes:
- Change step_info undershoot percentage calculation (#590 by juanodecc)
- IPython LaTeX output only generated for small systems (#607 by roryyorke)
- Fix warnings generated by sisotool (#608 by roryyorke)
- Discrete time LaTeX repr of StateSpace systems (#609 by bnavigator)
- Updated rlocus.py to remove warning by sisotool() with rlocus_grid=True (#616 by nirjhar-das)
- Refine automatic contour determination in Nyquist plot (#620 by bnavigator)
- Fix damp method for discrete time systems with a negative real-valued pole (#647 by vincentchoqueuse)
- Plot Nyquist frequency correctly in Bode plot in Hz (#651 by murrayrm)
- Return frequency response for 0 and 1-state systems directly (#663 by bnavigator)
- Fixed prewarp not working in c2d and sample_system, margin docstring improvements (#669 by sawyerbfuller)
- Improved lqe calling functionality (#673 by murrayrm)
- Vectorize FRD feedback function (#680 by bnavigator)
- BUG: extrapolation in ufun throwing errors (#682 by miroslavfikar)
- Allow use of SciPy for LQR, LQE (#683 by murrayrm)
- Improve forced_response and its documentation (#588 by bnavigator)
- Add documentation about use of axis('equal') in pzmap, rlocus (#685 by murrayrm)
Additional changes:
- Replace Travis badge with GHA workflows, add PyPI and conda badges (#584 by bnavigator)
- Don't install toplevel benchmarks package (#585 by bnavigator)
- LTI squeeze: ndarray.ndim == 0 is also a scalar (#595 by bnavigator)
- xfail testmarkovResults until #588 is merged (#601 by bnavigator)
- Remove from readme.rst that you need a fortran compiler (#602 by sawyerbfuller)
- Remove statement that slycot only on linux (#603 by sawyerbfuller)
- Allow float precision in result assertions (#615 by bnavigator)
- Improved unit test coverage for root_locus: dtime and sisotool (#617 by bnavigator)
- Add DefaultDict for deprecation handling (#619 by bnavigator)
- Documentation updates (#633 by murrayrm)
- Various docstring edits + fixed plot legends on cruise control example (#643 by billtubbs)
- Ease test tolerance on timeseries (#659 by bnavigator)
- Use conda-forge for numpy (CI fix) (#667 by bnavigator)
- Fix doc escape (#674 by bnavigator)
- Remove duplicate Slycot error handling, require Slycot >=0.4 (#678 by bnavigator)
- Full list of merged pull requests associated with this release.
- Full list of commits associated with this release.
0.9.0 - many improvements plus new functionality (plots, iosys, descfcn, optimal), deprecated np.matrix, py2.7
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.
0.8.4 - Improvements to time responses, discrete time systems, bug fixes, doc updates
This release introduces several new features as well as bug fixes and documentation improvements:
- Improved default time vector for time response functions (bnavigator, sawyerbfuller)
- New
use_legacy_defaults
function 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
pzmap
grid to be compatible withmatplotlib
updates (bnavigator) - Implement loadable string representation (repr) for tf, ss, and frd (repagh)
- Fixed
margin
computation for discrete time systems (bnavigator) - Fixed indexing bug in
bdalg.connect
(sawyerbfuller) - Fixed
InterconnectedSystem
naming bugs, improved conventions (samlaf) - Fixed
LinearIOSystem
output bug in output function (francescoseccamonte) - Fixed bug in
forced_response
that overrodesqueeze
parameter (bnavigator) - Use rad/sec for Bode plot in MATLAB bode (was erroneously defaulting to Hertz) (paulvicioso)
- Removed deprecated
scipy
calls and updated to latestnumpy
(bnavigator) - Multiple documentation updates (bnavigator, laurensvalk)
- New and improved examples for sisotool, pvtol (repagh, samlaf)
- The
rlocus
function no longer automatically creates a new figure - Updated unit tests + switch to pytest (bnavigator, sawyerbfuller)
- Return type for eigenvalues in
lqe
changed to 1D array (matcheslqr
) - Small fixes + documentation updates to
markov
More info:
- Full list of merged pull requests associated with this release.
- Full list of commits associated with this release
0.8.3 - I/O systems, flatness, new functionality, improved documentation
This release introduces several new features as well as bug fixes and documentation improvements:
- New input/output systems module for creating nonlinear systems from individual I/O subsystems, with
find_eqpt
,input_output_response
, andlinearize
functionality - 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
FRD
class nameFrequencyResponseData
to fix MacOS sphinx build problems (FRD
still 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%
More info:
- Full list of merged pull requests associated with this release.
- Full list of commits associated with this release
0.8.2 - Bug fixes and functionality improvements
This is mainly a maintenance release with lots of small bug fixes and performance improvements:
-
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)