Функция MATLAB LSIM в C ++ - PullRequest
       2

Функция MATLAB LSIM в C ++

0 голосов
/ 07 июля 2011

Я разрабатываю программное обеспечение для моделирования в Qt (C ++), которое должно принимать входные данные (u) для динамической системы SISO, определяемой матрицами A, B, C, D и получать выходные данные (y) на основе начального значения состояние (x0):

dx = Ax + Bu
y  = Cx + Du

Такого рода вещи можно сделать с помощью функции Matlab LSIM ... Я знаю, что могу определить дифференциальные уравнения и решить их численно, однако определить их и решить их в правильном порядке немного сложно, поэтому мне интересно, если кто-нибудь знает, существует ли существующая библиотека C ++ или пример C ++, который может сделать это ...

Редактировать отсюда ...

Я разрабатываю свое приложение Qt как отдельное приложение без Matlab ... Поэтому я подумал, что у меня есть способ, подобный этому, если у меня есть система с двумя состояниями для одного состояния системы:

double y(double A[2][2], double B[2], double C[2], double D, double XAct[2], double XNext[2], double u)

Но, несмотря ни на что, я обнаружил, что могу сделать что-то вроде этого:

X[k+1] = A*X[k] + B*u[k]
y[k] = C*X[k] + D*u[k]

Однако я беспокоюсь о временных метках, так что ... я не знаю, правильно ли это для систем с массивом в качестве входных данных ... я полагаю, что да, но ...

Ответы [ 2 ]

0 голосов
/ 01 декабря 2016

Вы можете использовать этот набор уравнений в C (++) или на любом другом языке, однако A, B, C, D должны быть из дискретной модели пространства состояний: Ad, Bd, Cd, Dd.

X[k+1] = A*X[k] + B*u[k]
y[k] = C*X[k] + D*u[k]

Время выборки (Ts) входных данных будет использоваться для дискретизации модели пространства непрерывных состояний.Для этого в MATLAB есть функция c2d.

sys = ss(A,B,C,D);
sysd = c2d(sys,Ts);
Ad = sysd.A;
Bd = sysd.B;
Cd = sysd.C;
Cd = sysd.D;

Получив Ad, Bd, Cd, Dd, вы можете использовать их в своем коде C (++) со следующими уравнениями:

X[k+1] = Ad*X[k] + Bd*u[k]
y[k] = Cd*X[k] + Dd*u[k]
0 голосов
/ 07 июля 2011

взгляните на Научную библиотеку Gnu (GSL), которая может решить эту проблему за вас У меня была похожая проблема, и вот что я использовал

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...