function M = adaptive_methods() %ADAPTIVE_METHODS Declarative specs for the adaptive-PID strategies under test. % Each is driven by the SAME asymmetric law (margin_law) on a normalized knob; they % differ only in how the knob maps to the controller, and whether they use M9.1's % reported BINDING FREQUENCY to gate/route/place their action. simulate_adaptive_case % turns 'kind' into the actual time-varying gains and the analytic loop. % % Fields: % id, name, kind, knob_max, params (cell of plotted-parameter labels), note. % % The 5 methods, by design intent (see the analytic knob<->mechanism sweep): % 1 authority uniform PID gain a (the user's idea): universal, monotone, sign-safe. % 2 integral detune the integral branch g_I: best for LOW-frequency / integral- % driven mechanisms; self-gated OFF when M9.1 binds high (wrong sign there). % 3 lowpass adaptive roll-off cutoff f_c: best for HIGH-frequency gain damage; % self-gated OFF when M9.1 binds low (adds lag there). % 4 schedule use M9.1's binding freq to pick the cheap targeted knob (integral for % an observable mid-low resonance, else authority); if that knob saturates % without moving the indicator (the pure-delay case, where M9.1 mis-reports % the binding freq), FALL BACK to the always-observable authority knob. % Universal + minimal intervention, with no need to know the mechanism. % 5 auth_notch authority + an adaptive notch placed at M9.1's binding freq. Notch-first % ladder (knob 0..1 deepens the notch, 1..2 then lowers authority): claws % back resonant margin so less uniform gain is sacrificed. Universal. M = struct( ... 'id', {'baseline','M1','M2','M3','M4','M5'}, ... 'name', {'No adaptation (baseline)', ... 'Authority gain reduction', ... 'Integral-branch detuning', ... 'Adaptive low-pass roll-off', ... 'Frequency-scheduled detuning', ... 'Authority + adaptive notch'}, ... 'kind', {'baseline','authority','integral','lowpass','schedule','auth_notch'}, ... 'knob_max', {0, 1, 1, 1, 2, 2}, ... 'params', {{}, {'a'}, {'g_I'}, {'f_c [Hz]'}, {'a / g_I (active)'}, {'a','notch depth'}}, ... 'note', {'controller frozen at nominal', ... 'a: scale P,I,D uniformly (dc = a*C*e)', ... 'g_I: scale the integral branch only', ... 'f_c: one-pole roll-off on the PID output', ... 'route by M9.1 binding freq vs f_split', ... 'notch at M9.1 binding freq, then authority'}); end