Как получить выходной ответ из уравнения пространства состояний? - PullRequest
0 голосов
/ 23 мая 2018

Для уравнения пространства состояний, в котором матрица A зависит от переменной t (время), как я могу получить ответ шага или вывода?

Это код, который неработа:

A = [sin(t) 0;0 cos(t)];
B = [0.5; 0.0];
C = [1 0; 0 1];
G = ss(A,B,C,[]);
step(G,t)
x0 = [-1;0;2];
initial(G,x0)

Вот сообщение об ошибке:

Ошибка при использовании horzcat Размеры сцепляемых матриц не согласованы.

Ошибка в ответе (строка 11)A = [sin (t) 0; 0 cos (t)];

1 Ответ

0 голосов
/ 28 мая 2018

Как уже указывалось, вы можете использовать только функцию ss для генерации систем LTI, но вы можете аналитически дискретизировать свою модель, используя такие методы, как прямой Эйлер, обратный Эйлер, Тустин и т. Д., И моделировать свою модель с помощью цикла for.

Для вашего примера вы могли бы выполнить что-то вроде этого:

  • рассмотрите период выборки h = 0.01 (или ниже, если динамика не фиксируется должным образом);
  • выберите N в качестве количества шагов для моделирования (100, 1000 и т. Д.);
  • объявите вектор моментов времени t = (0:N-1)*h;
  • создайте for цикл, который вычисляет состояние системы и выводит ее, используя метод прямого Эйлера (см. https://en.wikipedia.org/wiki/Euler_method):

    % A = [sin(t) 0;0 cos(t)]; 
    B = [0.5; 0.0];
    C = [1 0; 0 1];
    D = [0; 0];
    x0 = [-1;1];  % the initial state must have two elements as this is a second-order system
    u = 0;  % constant zero input, but can be modified
    N = 1000;
    h = 0.01;
    t = (0:N-1)*h;
    x_vec = [];
    y_vec = [];
    xk = x0;
    yk = [0;0];
    for k=1:N
        Ad = eye(2)+h*[sin(t(k)) 0; 0 cos(t(k))];
        Bd = h*B; % C and D remain the same
        yk = C*xk + D*u;
        xk = Ad*xk + Bd*u;
        x_vec = [x_vec, xk]; % keep results in memory
        y_vec = [y_vec, yk];
    end
    
    % Plot output response
    plot(t,y_vec);
    
...