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
Categories
Find more on Uncertain Models in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!