Why does augw(P, W1, W2, W3) give a much lower order generalized plant when compared to the by hand construction?
4 ビュー (過去 30 日間)
古いコメントを表示
I have found that constructing a generalized plant with the built in function augw(P, W1, W2, W3) leads to a much lower order plant than just constructing one by hand as specified in its reference page:
This is the case even when considering the minimal realization of the by hand construction. Just to demonstrate this, I generated a bunch of random test models and weights in the TestModels.mat file linked above, and you can see the discrepancy using the script below:
load('TestModels.mat');
TestModel=TestStruct.TestModel; %Test plant
TestW1=TestStruct.TestW1; %Test W1 weight
TestW2=TestStruct.TestW2; %Test W2 weight
TestW3=TestStruct.TestW3; %Test W3 weight
Ze=zeros(2,2);
%Formulating the generalized plant exactly as described in augw() reference
GgenByHand=[TestW1 -TestW1*TestModel;
Ze TestW2;
Ze TestW3*TestModel;
eye(2,2) -TestModel];
GgenAugW=augw(TestModel,TestW1,TestW2,TestW3); %Formulating the generalized plant using augw() function
%GgenAugW has a much smaller order even when considering the minimal realization of the by hand generalized plant
size(GgenAugW)
size(minreal(GgenByHand))
I was wondering, why is this the case? Again going off of the augw reference, it seems like the by hand construction is exactly what it does, but I don't see how they could have a lower order system when compared to even the minimal realization of that generalized plant. Doing some testing, it seems like a lot of the time the minimal realization order and the augw() order both agree, but unfortunately for my actual plant model this is not the case.
採用された回答
Paul
2024 年 2 月 8 日
編集済み: Paul
2024 年 2 月 9 日
Hi Vinh,
The 'by-hand' construction is nearly certainly not what augw actually does. You can look at the augw code; maybe it will be clear how it works.
load('TestModels.mat');
TestModel=TestStruct.TestModel; %Test plant
TestW1=TestStruct.TestW1; %Test W1 weight
TestW2=TestStruct.TestW2; %Test W2 weight
TestW2 = ss(TestW2);
TestW3=TestStruct.TestW3; %Test W3 weight
Ze=zeros(2,2);
%Formulating the generalized plant exactly as described in augw() reference
GgenByHand=[TestW1 -TestW1*TestModel;
Ze TestW2;
Ze TestW3*TestModel;
eye(2,2) -TestModel];
GgenAugW=augw(TestModel,TestW1,TestW2,TestW3); %Formulating the generalized plant using augw() function
As noted these models have a different number of states
order(GgenByHand)
order(GgenAugW)
The former has as many states as is needed to construct each element of that matrix
order(TestW1) + order(TestW1) + order(TestModel) + order(TestW2) + order(TestW3) + order(TestModel) + order(TestModel)
while the latter has only as many states needed to construct the augmented system
order(TestModel) + order(TestW1) + order(TestW2) + order(TestW3)
In theory, minreal should (I think) be able to get a realization with the same number of sates as in GgenAugW, but in practice it might not be so easy.
order(minreal(GgenByHand))
Play with the tolerance to see if we can get closer. A tolerance of 1e-6 is pretty large
sysmin = minreal(GgenByHand,1e-6); order(sysmin)
but doesn't get all the way there. At least the frequency response of sysmin still matches.
bode(GgenAugW,GgenByHand);
If you want to construct the model by hand, it's better to use interconnection functions. Personally, I prefer connect, but other approaches are possible. For example
set(TestModel,'InputName','u','OutputName','y');
set(TestW1, 'InputName','e','OutputName','z1');
set(TestW2, 'InputName','u','OutputName','z2');
set(TestW3, 'InputName','y','OutputName','z3');
eblk = sumblk('e = r - y',2);
sys = connect(TestModel,TestW1,TestW2,TestW3,eblk, ...
[eblk.InputName(1:2); TestModel.InputName], ...
[TestW1.OutputName; TestW2.OutputName; TestW3.OutputName; eblk.OutputName]);
size(sys)
size(GgenAugW)
Compare
figure
bode(GgenAugW,sys)
Here's another approach from the perspective of input/output relationshships
%[w;u;y] = [I 0;0 I;0 G] * [w;u]
%[e;u;y] = [I 0 -I;0 I 0;0 0 I] * [w;u;y]
%[z1;z2;z3;e] = [W1 0 0;0 W2 0; 0 0 W3;I 0 0] * [e;u;y]
I2 = ss(eye(2)); z2 = ss(zeros(2));
sys = [append(TestW1,TestW2,TestW3);[I2 z2 z2]] * [I2 z2 -I2;z2 I2 z2;z2 z2 I2] * [I2 z2;z2 I2;z2 TestModel];
order(sys)
figure
bode(GgenAugW,sys)
Check the doc pages on Model Interconnection, particularly Preventing State Duplication in System Interconnections
2 件のコメント
その他の回答 (0 件)
参考
カテゴリ
Help Center および File Exchange で H-Infinity Synthesis についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!