Systune reports uncertain system to control as improper, even though isProper returns true

8 ビュー (過去 30 日間)
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)
Unrecognized function or variable '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);

採用された回答

Pascal Gahinet
Pascal Gahinet 2024 年 2 月 15 日
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])
  1 件のコメント
Mattia Fussi
Mattia Fussi 2024 年 4 月 15 日
Thanks! I'll make sure to follow your guidelines for further development.

サインインしてコメントする。

その他の回答 (0 件)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by