Difference between revisions of "Figure 5.12: Stability analysis for a tanker"
Jump to navigation
Jump to search
(Created page with "{{Figure |Chapter=Dynamic Behavior |Figure number=5.12 |Sort key=512 |Figure title=Stability analysis for a tanker |GitHub URL=https://github.com/murrayrm/fbs2e-python/blob/ma...") |
|||
(2 intermediate revisions by the same user not shown) | |||
Line 5: | Line 5: | ||
|Figure title=Stability analysis for a tanker | |Figure title=Stability analysis for a tanker | ||
|GitHub URL=https://github.com/murrayrm/fbs2e-python/blob/main/example-5.8-tanker_stabilty.py | |GitHub URL=https://github.com/murrayrm/fbs2e-python/blob/main/example-5.8-tanker_stabilty.py | ||
− | |Requires= | + | |Requires= |
}} | }} | ||
+ | [[Image:figure-5-12-tanker_stability.png]] | ||
+ | |||
'''Figure 5.12''': Stability analysis for a tanker. The rudder characteristics are shown in (a), where the equilibrium points are marked by circles, and the tanker trajectories are shown in (b). | '''Figure 5.12''': Stability analysis for a tanker. The rudder characteristics are shown in (a), where the equilibrium points are marked by circles, and the tanker trajectories are shown in (b). | ||
Line 108: | Line 110: | ||
# Save the figure | # Save the figure | ||
− | plt.savefig("figure-5. | + | plt.savefig("figure-5.12-tanker_stability.png", bbox_inches='tight') |
</nowiki> | </nowiki> |
Latest revision as of 03:22, 17 November 2024
Chapter | Dynamic Behavior |
---|---|
Figure number | 5.12 |
Figure title | Stability analysis for a tanker |
GitHub URL | https://github.com/murrayrm/fbs2e-python/blob/main/example-5.8-tanker stabilty.py |
Requires | python-control, |
Figure 5.12: Stability analysis for a tanker. The rudder characteristics are shown in (a), where the equilibrium points are marked by circles, and the tanker trajectories are shown in (b).
# example-5.8-tanker_stability.py - Stability of a tanker # RMM, 29 Aug 2021 # # Figure 3.15: Stability analysis for a tanker. The rudder characteristics # are shown in (a), where the equilibrium points are marked by circles, and # the tanker trajec- tories are shown in (b). import control as ct import numpy as np import matplotlib.pyplot as plt ct.use_fbs_defaults() # # System dynamics # def tanker_dynamics( t, x, u, a1=-0.6, a2=-0.3, a3=-5, a4=-2, alpha=-2, b1=0.1, b2=-0.8): v, r = x[0], x[1] # velocity and turning rate delta = u[0] # rudder angle return [ a1 * v + a2 * r + alpha * v * abs(v) + b1 * delta, a3 * v + a4 * r + b2 * delta ] tanker_model = ct.nlsys( tanker_dynamics, None, inputs='delta', states=['v', 'r']) print(tanker_model) # Set up the plotting grid to match the layout in the book fig = plt.figure(constrained_layout=True) gs = fig.add_gridspec(2, 2) # # (a) Rudder curve # ax = fig.add_subplot(gs[0, 0]) # first row, first column # Compute the input for each turning rate rvec = np.linspace(-0.4, 0.4, 50) delta_list = [] for r in rvec: # Solve for the different equilibrium solutions eqpt = ct.find_operating_point( tanker_model, [0, 0], 0, y0=[0, r], iy=[1], # Look for the desired turning rate ) delta_list.append(eqpt.inputs[0]) dvec = np.array(delta_list) ax.plot(dvec, rvec) # Add the equilibrium points at zero for x0 in [[0.1, 0.1], [0, 0], [-0.1, -0.1]]: eqpt = ct.find_operating_point(tanker_model, x0, 0) ax.scatter( eqpt.inputs[0], eqpt.outputs[1], facecolors='none', edgecolors='b') # Add labels and axis lines ax.set_title("(a) Rudder curve") ax.set_xlabel(r"Rudder angle $\delta$") ax.set_ylabel(r"Noramlized turning rate $r$") ax.plot([-0.1, 0.1], [0, 0], 'k', linewidth=0.5) ax.plot([0, 0], [-0.4, 0.4], 'k', linewidth=0.5) ax.axis([-0.1, 0.1, -0.4, 0.4]) # # (b) Tanker trajectories # from math import sin, cos ax = fig.add_subplot(gs[0, 1]) # first row, second column # Create a full tanker model, including position and orientation def full_tanker_dynamics(t, x, u, **params): vdot, rdot = tanker_dynamics(t, x[3:], u, **params) theta, v, r = x[2], x[3], x[4] return [ cos(theta) + v * sin(theta), -sin(theta) + v * cos(theta), r, vdot, rdot] full_tanker_model = ct.nlsys( full_tanker_dynamics, None, inputs='delta', states=['x', 'y', 'theta', 'v', 'r']) # Create simulations and plot them timepts = np.linspace(0, 100, 100) for r0, linestyle in zip([0.1, 0, -0.1], ['b-', 'b--', 'b-']): response = ct.input_output_response( full_tanker_model, timepts, 0, [0, 0, 0, 0, r0]) ax.plot(response.outputs[0], response.outputs[1], linestyle) # Add labels and axis lines ax.set_title("(b) Tanker trajectories") ax.set_xlabel("$x$") ax.set_ylabel("$y$") ax.axis('scaled') ax.axis([0, 40, -20, 20]) # Save the figure plt.savefig("figure-5.12-tanker_stability.png", bbox_inches='tight')