Как создать несколько пространств состояний из массивов в MATLAB
Я хотел бы спросить, как создать несколько пространств состояний из массивов.
Ввод:
A1toA100 (100xn double)
B1toB100 (100xp double)
C1toC100 (100xn double)
D1toD100 (100xp double)
Пример:
A1toA10 =
-0.5909
-0.4178
-0.3412
-0.2954
-0.2643
-0.2412
-0.2233
-0.2089
-0.1970
-0.1869
>> B1toB10
B1toB10 =
33.3333
33.3333
33.3333
33.3333
33.3333
33.3333
33.3333
33.3333
33.3333
33.3333
>> C1toC10
C1toC10 =
1
1
1
1
1
1
1
1
1
1
>> D1toD10
D1toD10 =
0
0
0
0
0
0
0
0
0
0
Где каждый из них содержит сотню матриц соответствующего типа (A,B,C или D).
Выход должен быть:
SS1toSS100 (100x ss)
Где будет пространство состояний, соответствующее каждому набору матриц.
Пример для первой системы:
С этим кодом
ss([-0.5909],[33.3333],[1],[0])
Я получаю правильный вывод. Четыре числа, одна система <1x1 сс>. Это:
ans =
a =
x1
x1 -0.5909
b =
u1
x1 33.33
c =
x1
y1 1
d =
u1
y1 0
Однако с этим кодом:
for i=1:2
pom=[-0.5909 33.3333 1 0]
SS1toSS10(i)=ss(pom(1),pom(2),pom(3),pom(4));
end
Хотя я должен получить 2 системы, идентичные первой, я получаю это:
SS1toSS10
SS1toSS10 =
a =
x1 x2
x1 -0.5909 0
x2 0 -0.5909
b =
u1 u2
x1 33.33 0
x2 0 33.33
c =
x1 x2
y1 1 1
d =
u1 u2
y1 0 0
Continuous-time state-space model.
Это неправильный ответ.
Подход 1:
for i=1:length(A1toA100)
SS1toSS100(i)=ss(A1toA100(i),B1toB100,C1toC100,D1toD100);
end
Это сгенерировало 100 пространств состояний с размерами матрицы 200x200, что неверно, как и следовало ожидать измерения 2x2. Очевидно, что размеры целых матриц рассматриваются.
Пример вывода для Примеров входных векторов:
S1toS10(1,1).a
-0,417825056426464 0 0 0 0 0 0 0 0 0
0 -0,341152729998142 0 0 0 0 0 0 0 0
0 0 -0,295446930748805 0 0 0 0 0 0 0
0 0 0 -0,264255768359200 0 0 0 0 0 0
0 0 0 0 -0,241231408801990 0 0 0 0 0
0 0 0 0 0 -0,223336886965331 0 0 0 0
0 0 0 0 0 0 -0,208912528213232 0 0 0
0 0 0 0 0 0 0 -0,196964620499203 0 0
0 0 0 0 0 0 0 0 -0,186857045774452 0
0 0 0 0 0 0 0 0 0 -0,590893861497609
S1toS10(1,1).b
0
0
0
0
0
0
0
0
0
33,3333333333333
S1toS10(1,1).c
1 1 1 1 1 1 1 1 1 1
S1toS10(1,1).d
0
Подход 2:
for i=1:length(A1toA100)
SS1toSS100(i)=arrayfun(@ss,A1toA100(i),B1toB100,C1toC100,D1toD100);
end
Заканчивается этой ошибкой.
Ошибка при использовании типа вывода arrayfun ss в настоящее время не реализована.
Спасибо за вашу помощь, Петр
1 ответ
Теперь я понимаю вашу проблему! Ваше последнее редактирование было важно.
Единственный способ хранить несколько моделей пространства состояний в одной переменной - это struct
, Поэтому ваш цикл должен выглядеть так:
SS1toSS100(100) = struct; %pre-allocation
for ii=1:100
temp_ss = ss( A1toA100(ii) , B1toB100(ii) , C1toC100(ii) , D1toD100(ii) );
SS1toSS100(ii) = struct('ss',temp_ss);
end
или даже короче
SS1toSS100(100) = struct; %pre-allocation
for ii=1:100
SS1toSS100(ii).ss = ss( A1toA100(ii) , B1toB100(ii) , C1toC100(ii) , D1toD100(ii) );
end
который дает вам структуру с 100 ss
объекты.
Если вы сейчас хотите получить доступ к 5-му, например, введите:
SS1toSS100(5).ss
и вы получите
ans =
a =
x1
x1 -0.5909
b =
u1
x1 33.33
c =
x1
y1 1
d =
u1
y1 0
Continuous-time state-space model.
PS: не использовать i
в качестве переменной итерации это внутренняя переменная Matlab, зарезервированная для комплексных чисел