Title: Update frequency response plots to use _response/_plot pattern by murrayrm · Pull Request #924 · python-control/python-control · GitHub
Open Graph Title: Update frequency response plots to use _response/_plot pattern by murrayrm · Pull Request #924 · python-control/python-control
X Title: Update frequency response plots to use _response/_plot pattern by murrayrm · Pull Request #924 · python-control/python-control
Description: This PR updates frequency response plots to use the _response/_plot calling pattern described in #645. For Bode, Nichols, and singular values plots, the following patterns will work: response = frequency_response(syslist, response_options) lines = response.plot(plot_options) lines = name_plot(response, plot_options) lines = name_plot(syslist, response_options, plot_options) There are also updates to gangof4_response/plot and nyquist_response/plot. Everything is mostly backwards compatible except that the outputs from a _plot function are now an array of Line2D objects instead of other information (mag/phase/frequency, counts, etc). You can still get the original data using the _response function and there is some legacy processing if you used the plot keyword (eg, plot=False) to try let some code work without changes. The changes to Nyquist plots are illustrative of where code might break. Before, you could do this: count = nyquist_plot(sys) to get both a Nyquist plot and a count of the number of encirclements. That will no longer work, since nyquist_plot returns an array of lines. Instead, you need to do this response = nyquist_response(sys) count = response.count lines = response.plot() There are also some changes when you pass a list of systems. Before, you would say counts = nyquist_plot([sys1, sys2]) This no longer works because nyquist_response returns a list of responses (one response for each system). In the new version, you say responses = nyquist_response([sys1, sys2]) counts = [response.count for response in responses] lines = responses.plot() Note that even though nyquist_response is returning a list of responses, you can still say responses.plot() to get the (single) Nyquist plot for the list of systems (with different systems in different colors). This (and similar functionality for frequency_response / bode_plot) works through returning a special NyquistResponseList object (FrequencyResponseList for frequency_response) that extends the Python list data type and adds a plot method). Summary of changes: All frequency response plots now have a _response functions and a _plot function. You can access the latter via the .plot() method on the response. Frequency response plots accept either the output of the _response function or a list of systems (in which case the _response function is called internally). This allows the common pattern of bode_plot(sys), nyquist_plot(sys) to work as expected. For a frequency response, you can set the type of plot that you want using the plot_type keyword in the plot method (so ct.frequency_response(sys).plot(plot_type='nichols') will work). Default plot types are set up so that you get what you expect (eg, ct.singular_values_plot(sys).plot() generates a singular values plot, not a Bode plot). The short version bode, nyquist, and nichols are still there. The control.matlab version of bode returns mag, phase, freq (compatible with MATLAB) Added unit tests plus user documentation. Some other small fixes, code streamlining, etc along the way. Removed deprecated functionality in frequency plotting code (e.g. Plot and labelFreq keywords). This PR is going to break existing code. It would be great if a few people could try this out so that we can make sure we are OK with the changes here. There are still a few things I am implementing (see top of freqplot.py) so I'll leave this in draft mode for a bit, but wanted to start getting feedback on the changes, since they are pretty substantial. Examples (from the user documentation): Linear time invariant (LTI) systems can be analyzed in terms of their frequency response and python-control provides a variety of tools for carrying out frequency response analysis. The most basic of these is the frequency_response function, which will compute the frequency response for one or more linear systems: sys1 = ct.tf([1], [1, 2, 1], name='sys1') sys2 = ct.tf([1, 0.2], [1, 1, 3, 1, 1], name='sys2') response = ct.frequency_response([sys1, sys2]) A Bode plot provide a graphical view of the response an LTI system and can be generated using the bode_plot function: ct.bode_plot(response, initial_phase=0) Computing the response for multiple systems at the same time yields a common frequency range that covers the features of all listed systems. Bode plots can also be created directly using the FrequencyResponseData.plot method: sys_mimo = ct.tf( [[[1], [0.1]], [[0.2], [1]]], [[[1, 0.6, 1], [1, 1, 1]], [[1, 0.4, 1], [1, 2, 1]]], name="sys_mimo") ct.frequency_response(sys_mimo).plot() A variety of options are available for customizing Bode plots, for example allowing the display of the phase to be turned off or overlaying the inputs or outputs: ct.frequency_response(sys_mimo).plot( plot_phase=False, overlay_inputs=True, overlay_outputs=True) The singular_values_response function can be used to generate Bode plots that show the singular values of a transfer function: ct.singular_values_response(sys_mimo).plot() Different types of plots can also be specified for a given frequency response. For example, to plot the frequency response using a a Nichols plot, use plot_type='nichols': response.plot(plot_type='nichols') Another response function that can be used to generate Bode plots is the :func:gangof4 function, which computes the four primary sensitivity functions for a feedback control system in standard form: proc = ct.tf([1], [1, 1, 1], name="process") ctrl = ct.tf([100], [1, 5], name="control") response = rect.gangof4_response(proc, ctrl) ct.bode_plot(response) # or response.plot()
Open Graph Description: This PR updates frequency response plots to use the _response/_plot calling pattern described in #645. For Bode, Nichols, and singular values plots, the following patterns will work: response = f...
X Description: This PR updates frequency response plots to use the _response/_plot calling pattern described in #645. For Bode, Nichols, and singular values plots, the following patterns will work: response = f...
Opengraph URL: https://github.com/python-control/python-control/pull/924
X: @github
Domain: github.com
| route-pattern | /:user_id/:repository/pull/:id/checks(.:format) |
| route-controller | pull_requests |
| route-action | checks |
| fetch-nonce | v2:63ae5ef1-9c43-92e4-a051-a15afbbe5aac |
| current-catalog-service-hash | 87dc3bc62d9b466312751bfd5f889726f4f1337bdff4e8be7da7c93d6c00a25a |
| request-id | B732:13C3DA:E0C5E8:12931BC:697C06F7 |
| html-safe-nonce | 42e0a0bed0cb5306d0fcf50d6fda33a39a1e46267134f3c6b82965f727777fd7 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJCNzMyOjEzQzNEQTpFMEM1RTg6MTI5MzFCQzo2OTdDMDZGNyIsInZpc2l0b3JfaWQiOiI1MTU2OTQ5MjY4MjI4NzM2NzU5IiwicmVnaW9uX2VkZ2UiOiJpYWQiLCJyZWdpb25fcmVuZGVyIjoiaWFkIn0= |
| visitor-hmac | 51eab3610a89916601b4f0cb9b8706891093ed46f189d0da54a477f2b3cbf124 |
| hovercard-subject-tag | pull_request:1445370127 |
| github-keyboard-shortcuts | repository,pull-request-list,pull-request-conversation,pull-request-files-changed,checks,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/python-control/python-control/pull/924/checks |
| twitter:image | https://avatars.githubusercontent.com/u/293362?s=400&v=4 |
| twitter:card | summary_large_image |
| og:image | https://avatars.githubusercontent.com/u/293362?s=400&v=4 |
| og:image:alt | This PR updates frequency response plots to use the _response/_plot calling pattern described in #645. For Bode, Nichols, and singular values plots, the following patterns will work: response = f... |
| og:site_name | GitHub |
| og:type | object |
| hostname | github.com |
| expected-hostname | github.com |
| None | da4f0ee56809799586f8ee546b27f94fe9b5893edfbf87732e82be45be013b52 |
| turbo-cache-control | no-preview |
| go-import | github.com/python-control/python-control git https://github.com/python-control/python-control.git |
| octolytics-dimension-user_id | 2285872 |
| octolytics-dimension-user_login | python-control |
| octolytics-dimension-repository_id | 22791752 |
| octolytics-dimension-repository_nwo | python-control/python-control |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 22791752 |
| octolytics-dimension-repository_network_root_nwo | python-control/python-control |
| turbo-body-classes | logged-out env-production page-responsive full-width full-width-p-0 |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 3bd97d62125e07907af495e8aff5afc2a9f2a1a6 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width