Systune reports uncertain system to control as improper, even though isProper returns true
4 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Mattia Fussi
le 16 Mar 2023
Commenté : Mattia Fussi
le 15 Avr 2024
I have an uncertain state-space model for which I want to tune a continuous PID controller.
The model, called my_uss_model, has order 21 and is strictly proper, with a transfer function with 1 zero and 5 poles.
The function
isProper(my_uss_model)
confirms it by returning true.
Each uncertain root has an uncertainty percentage of 50%, and the nominal transfer function looks like the following:
7.1155e09 (s+10)
----------------------------------------------------
(s+2.907e04) (s+1917) (s+38.31) (s+10.24) (s-0.1253)
However, when I try to run the systune function with the goals and the system interconnection as defined below, I get an error:
Error using DynamicSystem/systune
Tuning of improper plants or controllers is not supported.
Error in script (line 41)
Gcl = systune(T, [Rstep Rtrack], [Rov Rmargin Rreject], tuneopts);
This is very unexpected, since all the properties of my system seem in order. Any ideas?
Here is the code I used, I'm attaching the model in a .mat with the script.
% define reqs
Ts = 1e-3; % sec
responsetime = 1; % sec
dcerror = 0.1; % perc
peakerror = 1.0; % fract relative
peak = 0.07; % abs deg
tSettle = 0.3; % sec
maxOvershoot = 0; % perc
phase_margin = 75;
gain_margin = 3;
Rtrack = TuningGoal.Tracking('r', 'y', responsetime, dcerror, peakerror);
Rreject = TuningGoal.StepRejection('u', 'y', peak, tSettle);
Rstep = TuningGoal.StepTracking('r', 'y', 0.3, maxOvershoot);
Rov = TuningGoal.Overshoot('r', 'y', maxOvershoot);
Rmargin = TuningGoal.Margins('y', gain_margin, phase_margin);
% define pid
C = tunablePID('C', 'PID');
C.Kp.Minimum = 0; C.Kp.Maximum = inf;
C.Ki.Minimum = 0; C.Ki.Maximum = inf;
C.Kd.Minimum = 0; C.Kd.Maximum = inf;
C.Tf.Minimum = 10 * Ts; C.Tf.Maximum = 100 * Ts; % N = 1/Tf
C.TimeUnit = 'seconds';
C.InputName = 'e';
C.OutputName = 'u';
my_uss_model.InputName = 'u';
my_uss_model.OutputName = 'y';
sumblkstring = append('e = r - ', 'y');
Sum = sumblk(sumblkstring);
T = connect(my_uss_model, C, Sum,'r', 'y', {'u', 'y'});
tuneopts = systuneOptions('RandomStart', 10, 'UseParallel', false);
% Tune up
Gcl = systune(T, [Rstep Rtrack], [Rov Rmargin Rreject], tuneopts);
0 commentaires
Réponse acceptée
Pascal Gahinet
le 15 Fév 2024
my_uss_model is the interconnection of an improper model with the uncertain blocks:
[H,B,S] = getLFTModel(my_uss_model)
isproper(H)
ans =
0
This is probably the result of using expressions like (s+u1)/(s+u2) too casually. Try specifying each factor in state space form or as shown below to avoid this.
a = ureal('a',1);
b = ureal('b',2);
fact = tf([1 a],[1 b])
Plus de réponses (0)
Voir également
Catégories
En savoir plus sur Uncertain Models dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!