目标
目前,我正在尝试使用ucover创建基于一系列状态空间模型的不确定系统。为此,我的脚本基于文档"Modeling a Family of Responses as an Uncertain System",它明确地展示了基于单输入单输出系统创建不确定系统的技术,但清楚地表明这也完全适用于多输入多输出系统。
技术细节
具体地说,在ucover的文档中说明它支持MIMO系统:
USYS = ucover(PARRAY,PNOM,ORD1,ORD2,UTYPE) returns an uncertain
system USYS with nominal value PNOM and whose range of behaviors
includes all LTI responses in the LTI array PARRAY. PNOM and PARRAY
can be SS, TF, ZPK, or FRD models. USYS is of class UFRD if PNOM
is an FRD model and of class USS otherwise.
ORD1 and ORD2 specify the order (number of states) of each diagonal
entry of W1 and W2. If PNOM has NU inputs and NY outputs, ORD1 and ORD2
should be vectors of length:
UTYPE ORD1 ORD2
InputMult NU-by-1 NU-by-1
OutputMult NY-by-1 NY-by-1
Additive NY-by-1 NU-by-1 在我的例子中,我使用了2个输入和2个输出,所以ORD1和ORD2都应该是2乘1。我使用8作为W1和W2使用的状态数(只是因为,一旦这个问题解决了,我会尝试调整它)。
这一尝试
基于SISO示例,我尝试创建一个MIMO示例,如下所示
noInputs=2;
noOutputs=2;
noOfStates=4;
Anom=rand(noOfStates,noOfStates);
Bnom=rand(noOfStates,noInputs);
Cnom=rand(noOutputs,noOfStates);
Dnom=rand(noOutputs,noInputs);
Pnom=ss(Anom, Bnom, Cnom, Dnom);
p1 = Pnom*tf(1,[.06 1]); % extra lag
p2 = Pnom*tf([-.02 1],[.02 1]); % time delay
p3 = Pnom*tf(50^2,[1 2*.1*50 50^2]);
Parray = stack(1,p1,p2,p3);
Parrayg = frd(Parray,logspace(-1,3,60));
[P,Info] = ucover(Parrayg,Pnom,[8 8]',[8 8]','InputMult');
Wt = Info.W1;
bodemag((Pnom-Parray)/Pnom,'b--',Wt,'r'); grid
title('Relative Gaps vs. Magnitude of Wt')问题所在
与documentation中的图像不同,我的不确定模型(当通过bode图时)仅在前导对角线上显示响应。请看截图来理解我的意思:

其中蓝色是单个模型,红色是不确定模型
问题
如何创建基于MIMO状态空间模型系列的不确定系统,以正确覆盖所有输入和输出之间的响应?
发布于 2015-05-29 03:36:52
如果你使用[8,8]'作为你的不确定性顺序结构ord1,ord2,matlab将尝试在你的不确定性块中有两个对角线块。
然而,matlab只支持对角线加权函数(由于非凸搜索的一些复杂性),并且您正在绘制的是将乘以2x2完整块LTI动态不确定性的对角线加权函数。W1影响行,而W2影响列的不确定性。
因此,你应该检查不确定度乘以权重的样本,然后检查工厂。然后,您可以将其与不确定模型堆栈进行比较。请注意,您的非对角线条目实际上是零(<1e-10),因此几乎是解耦的。但是W1,W2搜索寻找H无穷大的范数,因此你不能在Bode图的每个块上看到完美的覆盖。它组合了所需的最小不确定性量的行/列(参见帮助文件中的示例)。这就是为什么您在演示中看到每个权重一个绘图的原因。
如果您想要分别对影响每个块的每个不确定性进行建模,那么您需要形成一个新的增广线性傅立叶变换,使得不确定性是对角线上的四个1x1(标量) LTI动态不确定性,那么您可以在ord1和ord2中有四个条目。
发布于 2016-05-20 13:41:19
由于这是一个MIMO系统,您不应该逐个元素地比较。您使用的是输入乘法形式,因此要创建的不确定系统的形式为
Pnom*(I + W1*Delta*W2)是任何稳定的(在本例中为2 x 2)系统,|| Delta || <=为1。因此,要验证产生的不确定模型是否“覆盖”您的系统数组,您应该考虑以下等式
Parray = Pnom*(I + W1*Delta*W2)并为Delta求解。绘制它(比如用SIGMA ),你会发现它的大小在所有频率上都小于1。Matlab代码将是(将下面列出的所有内容按顺序相乘--我的乘法符号没有出现在发布的答案中...)
sigma(inv(W1)*inv(Pnom)*(Parrayg-Pnom)*inv(W2))现在,使用您指定的语法,您将使用以下形式的权重W1和W2:
W1 = [W1_11 0;
0 W1_22]和
W2 = [W2_11 0;
0 W2_22]其中,您已经为所有非零项指定了8阶拟合。当然,对于您的示例来说,这有点过头了(尽管对于更复杂的问题,它可能还不错)。
我会试着简单得多,比如
ucover(Parrag,Pnom,3,[],'InputMult')该语法将产生形式的不确定模型
Pnom*(I + w1*Delta)其中w1是一个标量的三阶系统。您仍然可以通过绘制SIGMA(Delta)来查看封面,即
sigma((1/w1)*inv(Pnom)*(Parrayg-Pnom))我希望这能有所帮助。
发布于 2017-03-25 00:41:32
为了创建离散或连续时间的不确定系统,您可以使用与ureal相关的uss。
快速示例
定义不确定的螺旋桨半径
% Propeller radius (m)
rp = ureal('rp',13.4e-2,'Range',[0.08 0.16]);定义不确定连续时间系统
tenzo_unc = uss(A,Bw,Clocal,D,'statename',states,'inputname',inputs,'outputname',outputsLocal);模拟阶跃响应:
N = 5;
% Prende alcuni campioni del sistema incerto e calcola bound su incertezze
for i=1:1:N
sys{i} = usample(tenzo_unc);
step(sys{i})
hold on
cprintf('text','.');
end完整示例
基于LQR的四轴飞行器不确定线性化模型控制。代码可用here
阶跃响应

闭环阶跃响应

<script src="https://gist.github.com/GiovanniBalestrieri/f90a20780eb2496e730c8b74cf49dd0f.js"></script>
注意:如果您没有实用工具cprintf,请在您的文件夹中包含此script并使用它。
https://stackoverflow.com/questions/23112466
复制相似问题