Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУ_ЛР_СисАнВыч_Мехат_б.pdf
Скачиваний:
60
Добавлен:
10.05.2015
Размер:
2.34 Mб
Скачать

Получение дифференциальных уравнений из блок-схемы Simulink

Для этой цели служит функция linmod, которая возвращает четыре матрицы, определяющие модель в пространстве состояний. Для того, чтобы эта функция сработала, нужно, чтобы в модели присутствовали входные и выходные порты. Этим портам будут соответствовать входы и выходы ss-модели.

Пример 1

Пусть мы создали (и обязательно сохранили на диске!) блок-схему под названием model:

После выполнения функции linmod получим следующие матрицы:

>> [A B C D]=linmod('model') A =

0

 

0

3.0000

0

-1.0000

0

0

1.0000

0

B =

 

 

 

0

 

 

 

1.0000

 

 

0

 

 

 

C =

 

 

 

1.0000

0

0

0

 

0

3.0000

D =

 

 

 

0

 

 

 

0

 

 

 

>>

 

 

 

Из этих матриц теперь можно получить ss-модель с использованием обычного конструктора. Заметьте, что утеряна всякая информация об именах переменных, как входных и выходных, так и переменных состояния. Это, несомненно, некоторый недостаток описываемого инструмента. Впрочем, он преодолим, причѐм не единственным способом. Один из них заключается в получении этой информации обращением к той же функции, но в другой форме:

>> StructInfo=linmod('model') StructInfo =

a:[3x3 double]

b:[3x1 double]

c:[2x3 double]

d:[2x1 double] StateName: {3x1 cell}

OutputName: {2x1 cell} InputName: {'model/Phi'} OperPoint: [1x1 struct]

Ts: 0

>>

Вся разница в том, как задан выходной параметр. В данном случае задана простая переменная, и она оказывается структурой (это такой тип данных), содержащей всю информацию о модели: четыре матрицы (a, b, c, d), имена переменных состояния (StateName), имена входных (InputName) и выходных (OutputName) переменных, шаг дискретизации (Ts). Обратите внимание на имя входной переменной. Оно повторяет имя входного порта с добавлением имени модели (файла с блок-схемой). То же самое относится и к имени выходных переменных:

>> StructInfo.OutputName{:,:} ans =

model/X1 ans = model/X2

>>

Имена переменных состояния совпадают с именами блоков, причѐм если в блоке содержится звено 2-го порядка, то его имя встретится 2 раза.

>>StructInfo.StateName{:,:} ans =

model/Nagruzka ans = model/Obmotka ans = model/Obmotka

>>

Как это ни обидно, но полученная структура не является LTI-объектом и не может быть напрямую преобразована в такой объект с помощью конструктора, хотя имеет практически ту же структуру, те же поля. Это можно сделать только в несколько приѐмов. Например так:

>>S=ss(StructInfo.a, StructInfo.b, StructInfo.c, StructInfo.d);

>>S.StateName=StructInfo.StateName;

>>S.OutputName=StructInfo.OutputName;

>>S.InputName=StructInfo.InputName;

>>S

a =

model/Nagruz model/Obmotk model/Obmotk

model/Nagruz

0

0

3

model/Obmotk

0

-1

0

model/Obmotk

0

1

0

b =

 

 

 

 

model/Phi

 

 

model/Nagruz

0

 

 

model/Obmotk

1

 

 

model/Obmotk

0

 

 

c =

model/Nagruz model/Obmotk model/Obmotk

model/X1

1

0

0

model/X2

0

0

3

d =

 

 

 

 

model/Phi

 

 

model/X1

0

 

 

model/X2

0

 

 

Continuous-time model.

>>

Вполученной структуре StructInfo есть ещѐ одно поле – OperPoint.

>>StructInfo.OperPoint

ans =

x: [0x1 double]

u:[1x0 double]

t:[]

>>

Это точка линеаризации (Operating Point), о которой стоит поговорить особо. Дело в том, что функция linmod может справиться и с нелинейной моделью, возвратив еѐ линеаризованный вариант.

Пример 2

Пусть теперь мы работаем с нелинейной моделью (ширина мѐртвой зоны составляет ±0.5):

>>SI=linmod('model_N');

>>SI.a

ans =

0

0

0

0

-1.0000

0

0

1.0000

0

>>

Первая строка матрицы А вся состоит из нулей. Это понятно, потому что в нуле зона нечувствительности имеет нулевой наклон, система стала неуправляемой, разорванной. Однако линеаризацию можно произвести в другой точке пространства состояний, которую можно задать вторым параметром функции linmod. Третьим параметром может быть значение входного сигнала (соответствующей размерности).

>>SI=linmod('model_N',[1 1 1],3); >> SI.a

ans =

0

0

3.0000

0

-1.0000

0

0

1.0000

0

>>

Теперь получена та же матрица, что и для линейной системы.

Следует, однако, помнить, что линеаризованная модель имеет совсем другие переменные состояния, чем исходная. Она записана "в отклонениях" от точки линеаризации (Operating Point). Впрочем, если точка линеаризации не указана, то есть совпадает с началом координат, то отклонения и сами координаты совпадают.

Достаточно часто в качестве точки линеаризации выбирают точку равновесия, то есть установившееся состояние (Steady State) системы. Эта точка определяется входным сигналом, который должен быть постоянным. Такую точку равновесия можно, конечно, рассчитать вручную, приравняв нулю все производные в уравнениях системы. Для чего, разумеется, надо иметь эти уравнения. Но можно воспользоваться функцией trim, вычисляющей точки равновесия (Steady State) для Simulink-схемы.