Стабилизация программной позиции маятника путём линеаризации уравнений в отклонениях
На примере простой механической системы посмотрим, как "оживить" картинки в Scilab без дополнительных плагинов и без использования comet() .
Будем стабилизировать простой математический маятник.

Рисунок. Математический маятник.
Уравнения которого имеют вид.
Стабилизировать маятник будем в программной позиции
Найдём программное управление up
Программное управление
Так как угол
Откуда можно выразить искомое программное управление
Перейдём к системе д.у.
Подробно переход к системе ДУ рассматривается в этом материале .
Введём фазовые координаты:
Тогда исходное уравнение (1) второго порядка сведётся к системе из двух дифференциальных уравнений первого порядка:
Программная позиция для системы
Наша задача - обеспечить скорейшую остановку маятника в заданной позиции, т.е. перевести маятник в позицию
Итак, для системы (3) нас интересует позиция:
Для того, чтобы к системе (3) можно было применят теоремы об асимтотической устойчивости нулевого положения равновесия, нам неоходимо перенести систему коордиинат в точку, где позиция
Переход к системе в отклонениях
Введём отклонения от программной позиции (4) в системе (3):
Подставим (5) в (3), тогда система в отклонениях примет вид:
Корректировка управляющего воздействия
Как правило, для эффективного управления динамическими системами одного программного управления
Тогда системе в отклонениях получим:
или
что приводит к
Линеаризация системы в отклонениях
Так как эффективнее всего теоремы об устойчивости работают для линейных систем, начнём с линеаризации системы (6).
Разложжим
Подставляя данное разложение в (6), получим:
Таким образом, система (6) примет вид:
Запишем систему (7) в векторно-матричном виде, чтобы с ней было бы удобнее работать:
Найдём стабилизирующее управление ust
Прежде всего, сделаем из системы (8) однородную систему. Для этого выберем
и подставив (9) в (8), получим чудесную линейную однородную систему дифуров:
Стабилизиирующее управление
В обычных условиях, система (10) сосвем не обязательно будет ас. устойчивой, но чтобы победить эту несправедливость мы и ввели управление
Значения
Итак, нам предстоит найти условия на основе
были бы расположены в левой полуплоскости комплекной плоскости.
Условия гурвицевости матрицы 11
Чтобы не утруждаться поиском с.з. и с.в. матрицы (11), воспользуемся критерием асисмтотической устойчивости вида:
Откуда получим условия на
Итак, выбирая стабилизирующее упарвление в виде:
мы добьёмся стабилизации линейной системы в отклонениях (7), что, в свою очередь будет значить схождение моделируемого движения маятника к программной позиции при решении задачи стабилизации положения равновесия, где управление будет складываться из программного и стабилизирующего управлений
Программная реализация
Приступим, наконец, к моделированию процесса стабилизации математического маятника в Scilab. Для этого нам понадобятся:
- Система (3)
- Управление (2)
- Управление (12)
- Замена (5)
Сначала зададим параметры, фигурирующие в системе:
g = 9.8;
m = 2;
k = 0.9;
L = 3.5;b = k/m;
a = g/L;
c = 1/(m*L*L);Параметры математического маятника.
Далее зададим программное положение
delta = %pi/5;
k1 = .1;
k2 = 10;Программная позиция и коэффициенты усиления
Зададим начальные условия, шаг дискретизации и отрезок интегрирования для решения системы ОДУ в Scilab:
Xo = [2.1; 0.5]; // Здесь первые два элемента - это н.у. (координата и скорость)
tmax = 20;
t0 = 0;
t = 0:1e-2:tmax;
X = ode(Xo, t0, t, systNelin);параметры для решения системы дифуров в Scilab.
И, наконец, запишем функцию, которая отвечает за формирование системы дифуров, описывающих движение маятника с найденным управлением:
function dx = systNelin(t, x)
y(1) = x(1) + delta;
y(2) = x(2);
Up = a/c * sin(delta);
Ust = -k1*y(1) - k2*y(2);
U = Up + Ust;
dx(1) = x(2);
dx(2) = c*U - b*x(2) - a*sin(x(1));
endfunctionфункциия системы ОДУ в Scilab.
Этого, в принципе, достаточно, чтобы получить статическую графическую интерпретацию решения нашей задачи.
subplot(121);
xgrid();xtitle("Угол отклонения маятника", "$\Large t$", "$\Large \theta$");
plot(t, t*0 + delta,'r--');
plot(t, X(1,:),'b');
gca().children.children(1).thickness = 2;
legend('$\delta