Title: Frequency plot improvements by murrayrm · Pull Request #1011 · python-control/python-control · GitHub
Open Graph Title: Frequency plot improvements by murrayrm · Pull Request #1011 · python-control/python-control
X Title: Frequency plot improvements by murrayrm · Pull Request #1011 · python-control/python-control
Description: This PR adds a number of improvements for frequency plots (Bode, Nyquist, etc). The changes are motivated by my experience in using python-control for a course, where I found a few things that were harder to do than they should have been. Changes in this PR: Allow label keyword in frequency response commands to override default label generation. Fix bug in processing indent_radius keyword when nyquist_plot is passed a system (keyword was not getting sent through to nyquist_response). Restore functionality that allows omega to be specified as a list of 2 elements (indicating a range) in all frequency response/plotting routines. This used to work for nyquist but got removed at some point. It now works for all frequency response commands. Note: this could break some code if someone meant to evaluate the frequency response at exactly two frequencies. This case seems rare, but it can be fixed by passing the two elements as an array. Fix up the ax keyword processing to allow arrays or lists + uniform processing in all freqplot routines. Fix up rcParams processing (uniformity + remove unnecessary code). (This needs more work in a future pass to eliminate the rcParams keywords that are part of frequency plotting functions and to pull separate time and frequency plot parameters into a single place. There are some TODOs in the code marking what needs to be done.) Added new suptitle() function to add titles that are better centered (on axes instead of figure). Using this for frequency domain plots for now; will update for time domain plots as well. Set up frd as factory function with keywords, including setting the signal/system names. Calls to ct.FRD should how be replaces with ct.frd, though the former will still work. Allow Bode and Nyquist plots for FRD systems with different omega vectors (#996) as well as mixtures of FRD and other LTI systems. Added a notebook examples/cds110-bode_nyquist.ipynb that shows a lot of the new functionality in the context of frequency domain analysis. Minor: changed the way that freq_label (frequency axis label) is implemented so that it can be more easily overriden (use fstring with '{units}' instead of '%' => can put in custom units). For the most part these changes just make it easier to do things that were already possible. Example of some new code that makes use of these features (from examples/cds110-bode_nyquist.ipynb): import control as ct P = ct.tf([1], [1, 0.1, -1]) # normalized inverted pendulum C = ct.tf([2, 10], [1]) # PD controller L = P * C # Loop transfer function # Bode and Nyquist plots plt.figure(figsize=[7, 4]) ax1 = plt.subplot(2, 2, 1) plt.title("Bode plot for L", size='medium') ax2 = plt.subplot(2, 2, 3) ct.bode_plot( [P, C, L], label=['P', 'C', 'L'], ax=[ax1, ax2], initial_phase=0) ax3 = plt.subplot(1, 2, 2) ct.nyquist_plot(L, ax=ax3) plt.title("Nyquist plot for L", size='medium') ct.suptitle("Loop analysis for inverted pendulum") plt.tight_layout() For the mixed FRD functionality (motivated by comments I made in #996), here's an example showing how Nyquist plots can be combined in ways that weren't possible before: s = ct.tf('s') sys = ct.tf( (0.02 * s**3 - 0.1 * s) / (s**4 + s**3 + s**2 + 0.25 * s + 0.04), name='tf') sys1 = ct.frd(sys, np.logspace(-1, 1, 15), name='frd1') sys2 = ct.frd(sys, np.logspace(-2, 2, 20), name='frd2') ct.nyquist_plot([sys, sys1, sys2]) ct.suptitle("Mixed FRD, tf data")
Open Graph Description: This PR adds a number of improvements for frequency plots (Bode, Nyquist, etc). The changes are motivated by my experience in using python-control for a course, where I found a few things that we...
X Description: This PR adds a number of improvements for frequency plots (Bode, Nyquist, etc). The changes are motivated by my experience in using python-control for a course, where I found a few things that we...
Opengraph URL: https://github.com/python-control/python-control/pull/1011
X: @github
Domain: github.com
| route-pattern | /:user_id/:repository/pull/:id/checks(.:format) |
| route-controller | pull_requests |
| route-action | checks |
| fetch-nonce | v2:b97f6d31-33f7-8d7e-6e47-9188281121dd |
| current-catalog-service-hash | 87dc3bc62d9b466312751bfd5f889726f4f1337bdff4e8be7da7c93d6c00a25a |
| request-id | C1D0:3F7DB0:2C5AF28:3C52979:6979BC7D |
| html-safe-nonce | 836e28ab438909c68738f8f42027c66c27c6aeef327e5a98ad09151c4235bd60 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJDMUQwOjNGN0RCMDoyQzVBRjI4OjNDNTI5Nzk6Njk3OUJDN0QiLCJ2aXNpdG9yX2lkIjoiNDQ1NTg3NzYxOTE5NTQwMzQ5IiwicmVnaW9uX2VkZ2UiOiJpYWQiLCJyZWdpb25fcmVuZGVyIjoiaWFkIn0= |
| visitor-hmac | 6d17e02725f8361cbfa9ed07434ab89ee076d1abeb024033bf7cd4dd457bfeca |
| hovercard-subject-tag | pull_request:1922879678 |
| 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/1011/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 adds a number of improvements for frequency plots (Bode, Nyquist, etc). The changes are motivated by my experience in using python-control for a course, where I found a few things that we... |
| og:site_name | GitHub |
| og:type | object |
| hostname | github.com |
| expected-hostname | github.com |
| None | c049b65ec7e54cbf2521f5a560b6527714c612b0bd169188e2ea6e16f83bd5f4 |
| 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 | 87b137883e35e2766c3d0f6a257c4044f6390b83 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width