Назад к материалам

Анимация стабилизации маятника в Scilab

Стабилизация программной позиции маятника путём линеаризации уравнений в отклонениях

Стабилизация программной позиции маятника путём линеаризации уравнений в отклонениях

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

Будем стабилизировать простой математический маятник.

Рисунок. Математический маятник
Рисунок. Математический маятник

Рисунок. Математический маятник.

Уравнения которого имеют вид.

Стабилизировать маятник будем в программной позиции с помощью вращающего момента:

(1)

Найдём программное управление up

Программное управление - это управление, которое обеспечивает программную позицию, т.е. отклоняет маятник на угол . Подставим в (1):

Так как угол - это постояннная величина, ведь мы хотим, чтобы маятник остановился в таком положении, её производные будут равны 0, следовательно:

Откуда можно выразить искомое программное управление :

(2)

Перейдём к системе д.у.

Подробно переход к системе ДУ рассматривается в этом материале .

Введём фазовые координаты:

Тогда исходное уравнение (1) второго порядка сведётся к системе из двух дифференциальных уравнений первого порядка:

Программная позиция для системы

Наша задача - обеспечить скорейшую остановку маятника в заданной позиции, т.е. перевести маятник в позицию , где скорость=0. Запишем это условие для фазовых координат

Итак, для системы (3) нас интересует позиция:

Для того, чтобы к системе (3) можно было применят теоремы об асимтотической устойчивости нулевого положения равновесия, нам неоходимо перенести систему коордиинат в точку, где позиция - это нуль.

Переход к системе в отклонениях

Введём отклонения от программной позиции (4) в системе (3):

Подставим (5) в (3), тогда система в отклонениях примет вид:

Корректировка управляющего воздействия

Как правило, для эффективного управления динамическими системами одного программного управления бывает недостаточно из-за неточностей в измерениях и влияния внешних источников, поэтому мы введём добавочное стабилизирующее управление :

Тогда системе в отклонениях получим:

или

что приводит к

Линеаризация системы в отклонениях

Так как эффективнее всего теоремы об устойчивости работают для линейных систем, начнём с линеаризации системы (6).

Разложжим в окрестности нуля:

Подставляя данное разложение в (6), получим:

Таким образом, система (6) примет вид:

Запишем систему (7) в векторно-матричном виде, чтобы с ней было бы удобнее работать:

Найдём стабилизирующее управление ust

Прежде всего, сделаем из системы (8) однородную систему. Для этого выберем вида:

и подставив (9) в (8), получим чудесную линейную однородную систему дифуров:

Стабилизиирующее управление - это управление, которое стабилизирует систему. То есть обеспечивает асимтотическую устойчивость нулевого положения равновесия этой системы.

В обычных условиях, система (10) сосвем не обязательно будет ас. устойчивой, но чтобы победить эту несправедливость мы и ввели управление в виде , подрегулировав значения которого, мы добьёмся того, чтобы корни характеристического уравнения системы (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);

Параметры математического маятника.

Далее зададим программное положение и пaраметры стабилизирующего управления :

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
,'$\theta
);
subplot(122);
xgrid();xtitle("Скорость маятника", "$\Large t$", "$\Large \dot\theta$");
plot(t, t*0 + 0,'r--');
plot(t, X(2,:),'b');
gca().children.children(1).thickness = 2;
legend('$\dot\delta
,'$\dot\theta
);

вывод графиков с настройкой толщины в Scilab.

Координата и скорость маятника под действием управления, к1, к2 = 0.1, 10
Координата и скорость маятника под действием управления, к1, к2 = 0.1, 10

Координата и скорость маятника под действием управления, (к1, к2) = (0.1, 10)

При этом, подправляя коэффициеты усиления, можно регулировать скорость сходимости.

Координата и скорость маятника под действием управления, к1, к2 = 0.1, 50
Координата и скорость маятника под действием управления, к1, к2 = 0.1, 50

Координата и скорость маятника под действием управления, (к1, к2) = (0.1, 50)

При этом, без управления маятник будет бултыхаться довольно долго и остановится в устойчивом положении равновесия (0,0):

...
  U   =  0;
...

отключим управление в функции системы ОДУ

Координата и скорость маятника без управляющего воздейсвтия
Координата и скорость маятника без управляющего воздейсвтия

Координата и скорость маятника без управляющего воздейсвтия

Создание анимации движения в Scilab

Пойдём дальше и приступим к реализации движущегося объекта.

Для начала, повернём сетку координат на 90 градусов, чтобы маятник смотрела вниз :)

X_r = X - %pi/2;
delta_r =  delta- %pi/2;

новые координаты.

Добавим звёздочки на координатную сетку - начальное положение и программную позицию маятника

plot(L*cos(X_r(1,1)), L*sin(X_r(1,1)), 'b*');
plot(L*cos(delta_r), L*sin(delta_r), 'r*');
legend('начальное положение', "программная позиция");
xtitle('Математический маятник');
xgrid;

начальное и конечное положения маятника

И изобразим маятник в исходном положении с помощью ломаной линии с координатами :

x_ = [0; L*cos(X_r(1,1))];
y_ = [0; L*sin(X_r(1,1))];
xpoly(x_, y_, "lines", 0);

рисуем прямую в Scilab.

Далее отредактируем параметры элемента xpoly() . Наличие соединений mark имитирует груз на конце стержня маятника, mark_style = 9 говорит, что это кружочек, а mark_offset = 1 отвечает за смещение кружочка относительно линии:

pendulum = gce();
pendulum.foreground = 1;
pendulum.thickness  = 2;
pendulum.mark_style = 9;
pendulum.mark_offset = 1;

рисуем прямую в Scilab.

Прямая с кружочком
Прямая с кружочком

Прямая с кружочком

Приступим к имитации движения маятника. Его траектория - это решени системы ОДУ, т.е. элементы матрицы X_r . В первой строке этой матрицы содержится координата маятника в момент времени , а во второй строке - скорость маятника в этот момент времени. Нам нужна координата для изменения позиции палочки с кружком, причём, центр маятника так и будет оставаться в положении , двигаться же будет его не закреплённый конец:

i = 1;
while i<=length(t)
    drawlater();
        sca(pendulum_axes);
        x_ = [0; L*cos(X_r(1,i))];
        y_ = [0; L*sin(X_r(1,i))];
        pendulum.data = [x_, y_];
    drawnow();
   i = i + 12;
end

Анимация движения маятника в Scilab. Рисуется каждая 12 точка - это имитация sleep()

Под действием выбранного управления, маятник быстренько стабилизируется и не бултыхается безумно:

Стабилизация маятника с управлением
Стабилизация маятника с управлением

Стабилизация маятника с управлением

Если же в теле функции systNelin() исключить найденное управление из процеса стабилизации маятника, получим поведения объекта под действием на него исходных внешних сил:

Стандартное движение маятника
Стандартное движение маятника

Стандартное поведение маятника

0просмотров

Комментарии