# Why does robstab fail for systems with more than two zeros?

2 views (last 30 days)
Suleyman on 11 Apr 2024
Edited: Paul on 15 Apr 2024
When using the "robstab" function, the following error is generated when the uncertain system contains more than two zeros:
Error using DynamicSystem/robstab
Improper state-space models (models with infinite gain at s,z=Inf) do not have an explicit representation. Use the "dssdata" command
to retrieve their descriptor representation.
Using a proper system of 2 zeros and 2 poles works as expected, and strictly proper systems with 2 zeros and 3 or more poles also works as expected:
z1 = ureal('z1', -1, 'Range', [-1.2, -0.8]);
z2 = ureal('z2', -2, 'Range', [-2.2, -1.8]);
p1 = ureal('p1', -0.1, 'Range', [-0.14, -0.08]);
p2 = ureal('p2', -1.1, 'Range', [-1.4, -0.8]);
% define a proper transfer function
s = tf('s');
T = (s - z1)*(s - z2) / ...
((s - p1)*(s - p2));
opt = robOptions('Display','on');
robstab(T, opt);
Computing peak... Percent completed: 100/100 System is robustly stable for the modeled uncertainty. -- It can tolerate up to 299% of the modeled uncertainty. -- No modeled uncertainty was found to cause instability.
But a proper system of 3 zeros and 3 poles errors:
z1 = ureal('z1', -1, 'Range', [-1.2, -0.8]);
z2 = ureal('z2', -2, 'Range', [-2.2, -1.8]);
z3 = ureal('z3', -3, 'Range', [-3.2, -2.8]);
p1 = ureal('p1', -0.1, 'Range', [-0.14, -0.08]);
p2 = ureal('p2', -1.1, 'Range', [-1.4, -0.8]);
p3 = ureal('p3', -2.1, 'Range', [-2.4 -1.8]);
% define a proper transfer function
s = tf('s');
T = (s - z1)*(s - z2)*(s - z3) / ...
((s - p1)*(s - p2)*(s - p3));
opt = robOptions('Display','on');
robstab(T, opt);
Error using DynamicSystem/robstab (line 104)
Improper state-space models (models with infinite gain at s,z=Inf) do not have an explicit representation. Use the "dssdata" command to retrieve their descriptor representation.
A strictly proper system of 3 zeros and 4 poles also fails:
z1 = ureal('z1', -1, 'Range', [-1.2, -0.8]);
z2 = ureal('z2', -2, 'Range', [-2.2, -1.8]);
z3 = ureal('z3', -3, 'Range', [-3.2, -2.8]);
p1 = ureal('p1', -0.1, 'Range', [-0.14, -0.08]);
p2 = ureal('p2', -1.1, 'Range', [-1.4, -0.8]);
p3 = ureal('p3', -2.1, 'Range', [-2.4 -1.8]);
p4 = ureal('p4', -3.1, 'Range', [-3.4, -2.8]);
% define a proper transfer function
s = tf('s');
T = (s - z1)*(s - z2)*(s - z3) / ...
((s - p1)*(s - p2)*(s - p3)*(s - p4));
opt = robOptions('Display','on');
robstab(T, opt);

Paul on 15 Apr 2024
Edited: Paul on 15 Apr 2024
Hi Suleyman,
Generally speaking, it's best to avoid "transfer function algebra." Instead, use model construction and interconnection commands. I suspect that's even more true for the Robust Control Toolbox.
z1 = ureal('z1', -1, 'Range', [-1.2, -0.8]);
z2 = ureal('z2', -2, 'Range', [-2.2, -1.8]);
z3 = ureal('z3', -3, 'Range', [-3.2, -2.8]);
p1 = ureal('p1', -0.1, 'Range', [-0.14, -0.08]);
p2 = ureal('p2', -1.1, 'Range', [-1.4, -0.8]);
p3 = ureal('p3', -2.1, 'Range', [-2.4 -1.8]);
% define a proper transfer function
% s = tf('s');
% T = (s - z1)*(s - z2)*(s - z3) / ...
% ((s - p1)*(s - p2)*(s - p3));
T = tf([1,-z1],[1,-p1])*tf([1,-z2],[1,-p2])*tf([1,-z3],[1,-p3]);
opt = robOptions('Display','on');
robstab(T, opt);
Computing peak... Percent completed: 100/100 System is robustly stable for the modeled uncertainty. -- It can tolerate up to 299% of the modeled uncertainty. -- There is a destabilizing perturbation amounting to 300% of the modeled uncertainty. -- This perturbation causes an instability at the frequency Inf rad/seconds.
A strictly proper system of 3 zeros and 4 poles also doesn't fail:
z1 = ureal('z1', -1, 'Range', [-1.2, -0.8]);
z2 = ureal('z2', -2, 'Range', [-2.2, -1.8]);
z3 = ureal('z3', -3, 'Range', [-3.2, -2.8]);
p1 = ureal('p1', -0.1, 'Range', [-0.14, -0.08]);
p2 = ureal('p2', -1.1, 'Range', [-1.4, -0.8]);
p3 = ureal('p3', -2.1, 'Range', [-2.4 -1.8]);
p4 = ureal('p4', -3.1, 'Range', [-3.4, -2.8]);
% define a proper transfer function
% s = tf('s');
% T = (s - z1)*(s - z2)*(s - z3) / ...
% ((s - p1)*(s - p2)*(s - p3)*(s - p4));
T = tf([1,-z1],[1,-p1])*tf([1,-z2],[1,-p2])*tf([1,-z3],[1,-p3])*tf(1,[1,-p4]);
opt = robOptions('Display','on');
robstab(T, opt);
Computing peak... Percent completed: 100/100 System is robustly stable for the modeled uncertainty. -- It can tolerate up to 299% of the modeled uncertainty. -- There is a destabilizing perturbation amounting to 300% of the modeled uncertainty. -- This perturbation causes an instability at the frequency Inf rad/seconds.

### Categories

Find more on Robustness and Worst-Case Analysis in Help Center and File Exchange

R2023b

### Community Treasure Hunt

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

Start Hunting!