2013-11-24 11 views
1

Я хотел бы спросить, как создать несколько состояний из массивов.Как сгенерировать несколько пространств состояний из массивов в 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 ss>. Это:

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 пространства состояний с размерами матрицы 200х200, что не так, как я ожидал бы размеры 2х2. Очевидно, рассматриваются размеры целых матриц.

Пример выходных данных для примера входных векторов:

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

Почему нет: 'SS1toSS100 (i) = ss (A1toA100 (i), B1toB100 (i), C1toC100 (i), D1toD100 (i)); – thewaywewalk

+0

Учитывая, что у меня есть система 1-го порядка (всего 4 числа) и примените к ней эту функцию. Результат состоит в том, что каждое пространство состояний имеет матрицу A с размерами 200x200 (или любые размеры A1toA100). Это неверно. В дополнение к этому я обнаружил, что каждая из матриц А каждого из пространств состояний идентична. Таким образом, я предполагаю, что каким-то образом вся матрица взята в функцию пространства состояний. – PeV

+0

, пожалуйста, отправьте примеры элементов вашего входного вектора. – thewaywewalk

ответ

0

Теперь я получаю вашу проблему! Последнее изменение было необходимо.

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

+0

Они взяты из системы идентификации. Этот частный случай представляет собой систему первого порядка (порядок системы равен размерности матрицы А), но все же правильный. Я подключил ваш код, однако он заканчивается этой ошибкой. Ссылка на содержимое ячеек от объекта, не связанного с ячейкой. – PeV

+0

: используйте 'SS1toSS100 (i) = ss (A1toA100 (i), B1toB100 (i), C1toC100 (i), D1toD100 (i))' в вашем цикле. -.- – thewaywewalk

+0

Кажется, я не подчеркиваю этого достаточно. Я разместил матрицы в ss (в вопросе), которые я получаю, используя этот код, который вы публикуете (и мой первый подход). – PeV