Systune reports uncertain system to control as improper, even though isProper returns true
3 views (last 30 days)
Show older comments
Mattia Fussi
on 16 Mar 2023
Commented: Mattia Fussi
on 15 Apr 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 Comments
Accepted Answer
Pascal Gahinet
on 15 Feb 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])
More Answers (0)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!