-
Notifications
You must be signed in to change notification settings - Fork 3
Stability trend is not consistent #6
Description
I am currently a student exploring the openplaning framework to better understand the dynamic stability characteristics of planing hulls. In a specific case at a fixed Froude number (or speed), my expectation—based on theoretical understanding—is that increasing the deadrise angle should improve dynamic stability. Specifically, I anticipated that the system’s eigenvalues would shift further into the left-half of the complex plane, indicating increased damping and improved stability.
However, in all my simulations—despite testing across a range of hull design parameters—I consistently observe the opposite: eigenvalues tend to shift toward the right, and in some cases, the system appears to become unstable as deadrise increases.
I have attached both a screenshot of the results and the Python script used to call openplaning. I would be very grateful if you could help me understand whether I may be missing something conceptually, or if this observed trend is in fact expected under certain conditions.
Thank you very much in advance for your time and guidance.
code is here:
from openplaning import PlaningBoat
import numpy as np
#from control import *
from scipy import signal
import matplotlib.pyplot as plt
cdelta = 0.608
beam = np.array([9,9,9])0.0254
length = beam5
mass = cdelta1025.87beam**3
g = 9.8066
weight = mass*g
lcg = np.array([1-0.605,1-0.59,1-0.595])length #m, long. center of gravity
vcg=1beam
r_g = np.array([0.248,0.26,0.25])*length
betaRange=np.array([30,20,10])
frRange = np.array([1.1898])
#frRange=np.arange(0.1,1.3,0.1)
#Propulsion
epsilon = 0 #deg, thrust angle w.r.t. keel
vT = vcg #m, thrust vertical distance
lT = lcg #m, thrust horizontal distance
#Options
wetted_lengths_type = 3
roughness_penalty_type = 1
tauData=[]
tauData2=[]
settldata=[]
eigVals=[]
criticaltrim=[]
criticaltrimData=[]
lcpOffsetData=[]
lcpOffsetData2=[] # full across all beta
Create boat object
for i, beta in enumerate(betaRange):
tauData = []
criticaltrim = []
lcpOffsetData = []
for fr in frRange:
speed = fr*(g*length[i])**0.5 #m/s
boat = PlaningBoat(speed, weight[i], beam[i], lcg[i], vcg[i], r_g[i],
beta, epsilon, vT[i], lT[i], length[i],
wetted_lengths_type=wetted_lengths_type,
roughness_penalty_type=roughness_penalty_type)
boat.get_steady_trim()
offset = boat.lcp - boat.lcg # NEW LINE
lcpOffsetData.append(offset) # NEW LINE
tauData.append(boat.tau)
boat.print_description() # KEPT AS YOU WROTE
eigVals.append(boat.eigenVal)
print(boat.eigenVal) # KEPT AS YOU WROTE
settldata.append(boat.settletime)
criticaltrim.append(boat.critical)
tauData2.append(tauData)
criticaltrimData.append(criticaltrim)
lcpOffsetData2.append(lcpOffsetData) # NEW LINE
=== Eigenvalue Plot on Complex Plane ===
plt.figure(figsize=(10,6))
for i, beta in enumerate(betaRange):
eigs = eigVals[i] # List of eigenvalues for this beta
eigs = np.array(eigs).flatten()
plt.plot(np.real(eigs), np.imag(eigs), '.', label=f'β = {beta:.2f}°', markersize=10)
plt.axhline(0, color='gray', linestyle='--', linewidth=0.8)
plt.axvline(0, color='gray', linestyle='--', linewidth=0.8)
plt.xlabel('Real')
plt.ylabel('Imaginary')
plt.title('Eigenvalues of System vs Deadrise Angle β')
plt.grid(True)
plt.legend()
plt.tight_layout()
plt.show()
