Как создать несколько пространств состояний из массивов в 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, зарезервированная для комплексных чисел

Другие вопросы по тегам