Создание модели в Simulink¶
В этом уроке мы перенесём матрицы пространства состояний \(A\), \(B\), \(C\), \(D\) из MATLAB-скрипта (см. Урок 4) в Simulink-схему, получим работающую динамическую модель и подготовим её для последующей кодогенерации в DLL/SO для Python (см. Урок 6).
Зачем переносить модель в Simulink¶
MATLAB-скрипт — удобный язык вычислений, но не симулятор реального времени. Simulink даёт несколько важных вещей, которых нет в чистом скрипте:
- Дискретные интеграторы по времени (фиксированный или переменный шаг) с автоматической синхронизацией всех блоков.
- Графический интерфейс, в котором структура объекта управления видна в виде блок-схемы — удобно для отладки и для документирования.
- Кодогенерация Embedded Coder — превращает модель в C/C++ с
фиксированным
dt, готовый к встраиванию в DLL/SO для вызова из Python. Без этого шага Python-обёрткиctypes(Урок 6) построить нельзя.
Создание объекта управления в Simulink¶
Для создания ОУ в Simulink выполните:
- В рабочее поле добавьте элементы из библиотеки Simulink:
- Simulink/Continuous/State-Space — реализация уравнений \(\dot{x} = Ax + Bu\), \(y = Cx + Du\) в одном блоке. Это и есть ваш ОУ.
- Simulink/Sources/Digital Clock — источник модельного времени; удобен для логирования и для блоков, явно зависящих от \(t\).
- Simulink/Commonly Used Blocks/In1 — внешний вход модели
(вектор управления \(u\)). Embedded Coder при кодогенерации
преобразует его в поле структуры
ExtU. - Simulink/Commonly Used Blocks/Out1 — внешний выход модели
(вектор \(y\)). При кодогенерации становится полем
ExtY. - Переименуйте блоки In1/Out1 в осмысленные имена сигналов — например,
ref_signalдля входа,u/w/q/thetaдля компонент выхода. Эти имена один к одному попадут в C-структуры и в обёрткуctypesна стороне Python (Урок 6). - В блоке State-Space задайте параметры — удобнее всего ссылками на переменные рабочего пространства MATLAB:
- A: имя переменной матрицы состояния (заполняется из скрипта Урока 4).
- B: матрица управления.
- C, D: матрицы наблюдения и проброса. Если все компоненты состояния доступны как выход, обычно \(C = I\) и \(D = 0\).
- Initial conditions: начальный вектор \(x_0\) (часто
zeros).
Параметры расчёта¶
Перед запуском зайдите в Simulation → Model Configuration Parameters и задайте:
- Solver type:
Fixed-step(для совместимости с кодогенерацией — переменный шаг Embedded Coder не поддерживает). - Fixed-step size: тот же
dt, что вы используете в Python-среде (например,0.01с для F-16,0.02с для B747). - Stop time: длительность симуляции; влияет только на запуск из Simulink, при кодогенерации шаг управляется внешним циклом.
- Solver:
ode4 (Runge-Kutta)— хороший компромисс между точностью и предсказуемостью для линейных и слабо нелинейных систем.
Согласование dt
Если dt в Simulink и в Python-обёртке (Урок 6) различаются, динамика
будет искажена: дискретные матрицы \(A_d, B_d\) зависят от dt.
Лучшая практика — задать dt константой в MATLAB-скрипте и ссылаться
на неё и в Simulink-параметрах, и в Python-коде.
Проверка перед кодогенерацией¶
Запустите симуляцию из Simulink (Ctrl+T) с тестовым входом — например,
ступенчатым через блок Step — и убедитесь, что:
- Графики выходов
Out1совпадают с тем, что даёт прямой расчёт \(y = Ce^{At}x_0 + \int_0^t Ce^{A(t-\tau)}Bu(\tau)\,d\tau\) в MATLAB. - Нет предупреждений типа
Algebraic loopилиSample time mismatch. - Размерности сигналов на портах согласованы с матрицами
A,B,C,D.
После этого можно переходить к Уроку 6 — кодогенерации Embedded Coder и сборке DLL/SO для Python.

