-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathfigure-5.7-stable_eqpt.py
More file actions
39 lines (33 loc) · 1.21 KB
/
figure-5.7-stable_eqpt.py
File metadata and controls
39 lines (33 loc) · 1.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# stable_eqpt.py - plots for stable equlibrium point
# RMM, 6 Apr 2024
import matplotlib.pyplot as plt
import numpy as np
from math import pi
import control as ct
import control.phaseplot as pp
import fbs # FBS plotting customizations
m, b, k = 1, 0, 2
linsys = ct.ss([[0, 1], [-k/m, -b/m]], [[0], [1]], np.eye(2), 0)
# Draw the phase portrait
fbs.figure()
ct.phase_plane_plot(linsys, [-1, 1, -1, 1], 1, plot_streamlines=False)
pp.streamlines(
linsys, np.array([[0.2, 0], [0.4, 0], [0.6, 0], [0.8, 0], [1, 0]]),
4.5, arrows=6)
plt.gca().set_aspect('equal')
plt.suptitle("")
# Add some level sets
theta = np.linspace(0, 2*pi)
plt.plot(0.2 * np.sin(theta), 0.2 * np.cos(theta), 'r--')
plt.plot(0.3 * np.sin(theta), 0.3 * np.cos(theta), 'r--')
fbs.savefig('figure-5.7-stable_eqpt-pp.png')
fbs.figure('321')
plt.axis([0, 10, -2.5, 2.5])
timepts = np.linspace(0, 10)
response = ct.input_output_response(linsys, timepts, 0, [1, 0])
plt.plot(response.time, response.outputs[0], 'b', label="$x_1$")
plt.plot(response.time, response.outputs[1], 'r--', label="$x_2$")
plt.xlabel("Time $t$")
plt.ylabel("$x_1, x_2$")
plt.legend(loc='upper right', ncols=2, frameon=False)
fbs.savefig('figure-5.7-stable_eqpt-time.png')