В этом примере показано, как моделировать движение двойного маятника с помощью Toolbox™ MATLAB ® и Symbolic Math.
Решите уравнения движения двойного маятника и создайте анимацию для моделирования движения двойного маятника.
На следующем рисунке показана модель двойного маятника. Двойной маятник состоит из двух маятниковых бобин и двух жестких стержней.

Опишите движение двойного маятника, определив переменные состояния:
угловое положение первого боба ()
угловое положение второго боба
Опишите свойства двойного маятника, определив переменные:
длина первого стержня
длина второго стержня
масса первого боба
масса второго боба
гравитационная постоянная
Для простоты игнорируйте массы двух жестких стержней. Укажите все переменные с помощью syms.
syms theta_1(t) theta_2(t) L_1 L_2 m_1 m_2 g
Определите перемещения двойного маятника в декартовых координатах.
x_1 = L_1*sin(theta_1); y_1 = -L_1*cos(theta_1); x_2 = x_1 + L_2*sin(theta_2); y_2 = y_1 - L_2*cos(theta_2);
Определение скоростей путем дифференциации смещений по времени с помощью diff функция.
vx_1 = diff(x_1); vy_1 = diff(y_1); vx_2 = diff(x_2); vy_2 = diff(y_2);
Найдите ускорения, дифференцируя скорости по времени.
ax_1 = diff(vx_1); ay_1 = diff(vy_1); ax_2 = diff(vx_2); ay_2 = diff(vy_2);
Определите уравнения движения на основе законов Ньютона.
Сначала задайте натяжение первого стержня, как , и натяжение второго стержня .
syms T_1 T_2
Затем создайте диаграммы свободного тела сил, которые действуют на обе массы.

Оцените силы, действующие на . Определите уравнения движения первого боба, уравновешивая горизонтальную и вертикальную составляющие силы. Укажите эти два уравнения как символические eqx_1 и eqy_1.
eqx_1 = m_1*ax_1(t) == -T_1*sin(theta_1(t)) + T_2*sin(theta_2(t))
eqx_1 =
eqy_1 = m_1*ay_1(t) == T_1*cos(theta_1(t)) - T_2*cos(theta_2(t)) - m_1*g
eqy_1 =

Оцените силы, действующие на . Определите уравнения движения второго боба, уравновешивая горизонтальную и вертикальную составляющие силы. Укажите эти два уравнения как символические eqx_2 и eqy_2.
eqx_2 = m_2*ax_2(t) == -T_2*sin(theta_2(t))
eqx_2 =
eqy_2 = m_2*ay_2(t) == T_2*cos(theta_2(t)) - m_2*g
eqy_2 =
Четыре уравнения движения описывают кинематику двойного маятника. Оцените силы, действующие на стержни, и уменьшите набор из четырех уравнений до двух уравнений.
Уравнение движения имеет четыре неизвестных: , , и . Оцените двух неизвестных и из eqx_1 и eqy_1. Использовать solve функция для поиска и .
Tension = solve([eqx_1 eqy_1],[T_1 T_2]);
Заменить решения для и на eqx_2 и eqy_2.
eqRed_1 = subs(eqx_2,[T_1 T_2],[Tension.T_1 Tension.T_2]); eqRed_2 = subs(eqy_2,[T_1 T_2],[Tension.T_1 Tension.T_2]);
Два приведенных уравнения полностью описывают движение маятника.
Решите системные уравнения, чтобы описать движение маятника.
Сначала определите значения для масс в , длины стержней в и силы тяжести в (единицы СИ). Замените эти значения двумя приведенными уравнениями.
L_1 = 1; L_2 = 1.5; m_1 = 2; m_2 = 1; g = 9.8; eqn_1 = subs(eqRed_1)
eqn_1 =
eqn_2 = subs(eqRed_2)
eqn_2 =
Эти два уравнения являются нелинейными дифференциальными уравнениями второго порядка. Чтобы решить эти уравнения, преобразуйте их в дифференциальные уравнения первого порядка с помощью odeToVectorField функция.
[V,S] = odeToVectorField(eqn_1,eqn_2);
Элементы вектора V представляют дифференциальные уравнения первого порядка, которые равны временной производной элементов S. Элементы S являются переменными состояния , , и . Переменные состояния описывают угловые смещения и скорости двойного маятника.
S
S =
Затем преобразуйте уравнения первого порядка в функцию MATLAB с помощью маркера M.
M = matlabFunction(V,'vars',{'t','Y'});
Определите начальные условия переменных состояния как [pi/4 0 pi/6 0]. Используйте ode45 функция для решения переменных состояния. Решения являются функцией времени в интервале [0 10].
initCond = [pi/4 0 pi/6 0]; sols = ode45(M,[0 10],initCond);
Постройте график решений переменных состояния.
plot(sols.x,sols.y) legend('\theta_2','d\theta_2/dt','\theta_1','d\theta_1/dt') title('Solutions of State Variables') xlabel('Time (s)') ylabel('Solutions (rad or rad/s)')

Создайте анимацию колебательного двойного маятника.
Сначала создайте четыре функции, которые используют deval для оценки координат обоих маятников из решений sols.
x_1 = @(t) L_1*sin(deval(sols,t,3)); y_1 = @(t) -L_1*cos(deval(sols,t,3)); x_2 = @(t) L_1*sin(deval(sols,t,3))+L_2*sin(deval(sols,t,1)); y_2 = @(t) -L_1*cos(deval(sols,t,3))-L_2*cos(deval(sols,t,1));
Затем создайте объект анимации стоп-движения первого маятникового узла с помощью fanimator функция. По умолчанию fanimator создает анимационный объект с 10 сгенерированными кадрами в единицу времени в диапазоне t от 0 до 10. Постройте график координат с помощью plot функция. Задайте для осей X и Y одинаковую длину.
fanimator(@(t) plot(x_1(t),y_1(t),'ro','MarkerSize',m_1*10,'MarkerFaceColor','r')); axis equal;
Затем добавьте объекты анимации первого жесткого стержня, второго маятника и второго жесткого стержня.
hold on; fanimator(@(t) plot([0 x_1(t)],[0 y_1(t)],'r-')); fanimator(@(t) plot(x_2(t),y_2(t),'go','MarkerSize',m_2*10,'MarkerFaceColor','g')); fanimator(@(t) plot([x_1(t) x_2(t)],[y_1(t) y_2(t)],'g-'));
Добавление фрагмента текста для подсчета прошедшего времени с помощью text функция. Использовать num2str для преобразования параметра времени в строку.
fanimator(@(t) text(-0.3,0.3,"Timer: "+num2str(t,2))); hold off;

Используйте команду playAnimation для воспроизведения анимации двойного маятника.
