Skip to content

Stability trend is not consistent #6

@javedalikhanpatan18

Description

@javedalikhanpatan18

@elcf @caterpillar85

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.

Image

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 = beam
5
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=1
beam
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()

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions