Rotor.run_critical_speed(speed_range=None, num_modes=12, rtol=0.005)

Calculate the critical speeds and damping ratios for the rotor model.

This function runs an iterative method over “run_modal()” to minimize (using scipy.optimize.newton) the error between the rotor speed and the rotor critical speeds (rotor speed - critical speed).

Differently from run_modal(), this function doesn’t take a speed input because it iterates over the natural frequencies calculated in the last iteration. The initial value is considered to be the undamped natural frequecies for speed = 0 (no gyroscopic effect).

Once the error is within an acceptable range defined by “rtol”, it returns the approximated critical speed.

With the critical speeds calculated, the function uses the results to calculate the log dec and damping ratios for each critical speed.


Tuple (start, end) with the desired range of frequencies (rad/s). The function returns all eigenvalues within this range.

num_modesint, optional

The number of eigenvalues and eigenvectors to be calculated using ARPACK. If sparse=True, it determines the number of eigenvalues and eigenvectors to be calculated. It must be smaller than Rotor.ndof - 1. It is not possible to compute all eigenvectors of a matrix with ARPACK. If speed_range is not None, num_modes is overrided. Default is 12.

rtolfloat, optional

Tolerance (relative) for termination. Applied to scipy.optimize.newton. Default is 0.005 (0.5%).


For more information on attributes and methods available see: ross.CriticalSpeedResults


>>> import ross as rs
>>> rotor = rs.rotor_example()

Finding the first Nth critical speeds >>> results = rotor.run_critical_speed(num_modes=8) >>> np.round(results.wd()) array([ 92., 96., 271., 300.]) >>> np.round(results.wn()) array([ 92., 96., 271., 300.])

Finding the first critical speeds within a speed range >>> results = rotor.run_critical_speed(speed_range=(100, 1000)) >>> np.round(results.wd()) array([271., 300., 636., 867.])

Changing output units >>> np.round(results.wd(“rpm”)) array([2590., 2868., 6074., 8278.])

Retrieving whirl directions >>> results.whirl_direction # doctest: +ELLIPSIS array([…