3434 'load_time' : 5.0 ,
3535 'sim_time' : 25.0 ,
3636}
37+ SETTLING_TOLERANCE = 0.02
3738
3839
3940def create_governor_system (params ):
@@ -109,7 +110,7 @@ def summarize_response(system, time, outputs, target):
109110 final_speed = speed [- 1 ]
110111 peak_speed = np .max (speed )
111112 minimum_speed = np .min (speed )
112- tolerance = max (0.02 * max (abs (target ), abs (final_speed )), 1e-3 )
113+ tolerance = max (SETTLING_TOLERANCE * max (abs (target ), abs (final_speed )), 1e-3 )
113114 if abs (target ) < 1e-9 :
114115 overshoot = 0.0
115116 elif target > 0 :
@@ -118,6 +119,7 @@ def summarize_response(system, time, outputs, target):
118119 overshoot = max (0.0 , (target - minimum_speed ) / abs (target ) * 100 )
119120 steady_state_error = target - final_speed
120121 poles = list (ct .poles (system ))
122+ # Use the least stable (rightmost) poles as the dominant dynamics.
121123 dominant_poles = sorted (poles , key = lambda pole : pole .real )[- min (2 , len (poles )):]
122124 damping_ratios = []
123125 for pole in dominant_poles :
@@ -147,7 +149,7 @@ def summary_text(metrics):
147149 if np .isfinite (metrics ['settling_time' ]) else 'not settled'
148150 )
149151 return '\n ' .join ([
150- f'Settling time (2% band): { settling } ' ,
152+ f'Settling time ({ SETTLING_TOLERANCE :.0% } band): { settling } ' ,
151153 f'Overshoot: { metrics ["overshoot" ]:.2f} %' ,
152154 f'Steady-state error: { metrics ["steady_state_error" ]:.4f} ' ,
153155 f'Dominant poles: { poles } ' ,
0 commit comments