Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Strange nondeterministic issues when using phase_plot with X, Y and X0 set #970

Closed
FeldrinH opened this issue Feb 13, 2024 · 1 comment · Fixed by #980
Closed

Strange nondeterministic issues when using phase_plot with X, Y and X0 set #970

FeldrinH opened this issue Feb 13, 2024 · 1 comment · Fixed by #980
Assignees

Comments

@FeldrinH
Copy link

FeldrinH commented Feb 13, 2024

I am trying to draw a phase plot with both streamlines and a vector field. Using the inverted pendulum ODE from https://python-control.readthedocs.io/en/latest/phaseplots.html, I put together the following script:

import numpy as np
import matplotlib.pyplot as plt
from control.phaseplot import phase_plot

# Define the ODEs for a damped (inverted) pendulum
def invpend_ode(x, t, m=1., l=1., b=0.2, g=1):
    return x[1], -b/m*x[1] + (g*l/m)*np.sin(x[0])

# Set up the figure the way we want it to look
plt.figure()
plt.title('Inverted pendulum')

# Outer trajectories
phase_plot(
    invpend_ode,
    X=(-10, 10, 20),
    Y=(-10, 10, 20),
    X0=[[-2*np.pi, 1.6], [-2*np.pi, 0.5], [-1.8, 2.1],
        [-1, 2.1], [4.2, 2.1], [5, 2.1],
        [2*np.pi, -1.6], [2*np.pi, -0.5], [1.8, -2.1],
        [1, -2.1], [-4.2, -2.1], [-5, -2.1]]
)

plt.show()

I would have expected this to plot a simple vector field with a grid of 20*20 arrows and streamlines from the given inital conditions. Instead, each time I run this I get a different malformed plot, often with at least one axis somehow having arrows at values like 10^281. Various RuntimeWarnings about overflow are also sometimes printed in the console. Some examples of the plots I have gotten:

image
image
image
image
image

This does not seem like expected behaviour. What is going on here?

Tested on Windows 10 with Python 3.10.11, matplotlib 3.8.2 and control 0.9.4 from pip.

@FeldrinH FeldrinH changed the title Strange nondeterministic behavior when using phase_plot with X, Y and X0 set. Strange nondeterministic behavior when using phase_plot with X, Y and X0 set Feb 13, 2024
@FeldrinH FeldrinH changed the title Strange nondeterministic behavior when using phase_plot with X, Y and X0 set Strange nondeterministic issues when using phase_plot with X, Y and X0 set Feb 13, 2024
@murrayrm
Copy link
Member

I ran this on the current main and got similar behavior on MacOS 14.2 with Python 3.11. There are a couple of warning messages that also appear

[...]/matplotlib/quiver.py:646: RuntimeWarning: divide by zero encountered in scalar divide
  length = a * (widthu_per_lenu / (self.scale * self.width))
[...]/matplotlib/quiver.py:646: RuntimeWarning: invalid value encountered in multiply
  length = a * (widthu_per_lenu / (self.scale * self.width))

These could be the source of the randomness?

I'll try to have a look and see if I can figure out what is going on and see if there is a quick fix. I'm in the process of rewriting this functionality to be a bit more Pythonic, so it may not make sense to do an interim fix to the old code. More info as I find it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants