exponenta event banner

Анимация и решение двойного маятникового движения

В этом примере показано, как моделировать движение двойного маятника с помощью Toolbox™ MATLAB ® и Symbolic Math.

Решите уравнения движения двойного маятника и создайте анимацию для моделирования движения двойного маятника.

Шаг 1. Определение смещения, скорости и ускорения двойных маятниковых масс

На следующем рисунке показана модель двойного маятника. Двойной маятник состоит из двух маятниковых бобин и двух жестких стержней.

Опишите движение двойного маятника, определив переменные состояния:

  • угловое положение первого боба (t)

  • угловое положение второго боба

Опишите свойства двойного маятника, определив переменные:

  • длина первого стержня L1

  • длина второго стержня L2

  • масса первого боба m1

  • масса второго боба м2

  • гравитационная постоянная g

Для простоты игнорируйте массы двух жестких стержней. Укажите все переменные с помощью 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);

Шаг 2: Определение уравнений движения

Определите уравнения движения на основе законов Ньютона.

Сначала задайте натяжение первого стержня, как T1, и натяжение второго стержня T2.

syms T_1 T_2

Затем создайте диаграммы свободного тела сил, которые действуют на обе массы.

Оцените силы, действующие на m1. Определите уравнения движения первого боба, уравновешивая горизонтальную и вертикальную составляющие силы. Укажите эти два уравнения как символические 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 = 

-m1L1sin(θ1(t))t θ1(t)2-L1cos(θ1(t))2t2 θ1(t)=T2sin(θ2(t))-T1sin(θ1(t))-m_1*(L_1*sin(theta_1(t))*(diff(theta_1(t), t))^2 - L_1*cos(theta_1(t))*diff(theta_1(t), t, 2)) == T_2*sin(theta_2(t)) - T_1*sin(theta_1(t))

eqy_1 = m_1*ay_1(t) == T_1*cos(theta_1(t)) - T_2*cos(theta_2(t)) - m_1*g
eqy_1 = 

m1L1sin(θ1(t))2t2 θ1(t)+L1cos(θ1(t))t θ1(t)2=T1cos(θ1(t))-gm1-T2cos(θ2(t))m_1*(L_1*sin(theta_1(t))*diff(theta_1(t), t, 2) + L_1*cos(theta_1(t))*(diff(theta_1(t), t))^2) == T_1*cos(theta_1(t)) - g*m_1 - T_2*cos(theta_2(t))

Оцените силы, действующие на м2. Определите уравнения движения второго боба, уравновешивая горизонтальную и вертикальную составляющие силы. Укажите эти два уравнения как символические eqx_2 и eqy_2.

eqx_2 = m_2*ax_2(t) == -T_2*sin(theta_2(t))
eqx_2 = 

-m2L1sin(θ1(t))t θ1(t)2+L2sin(θ2(t))t θ2(t)2-L1cos(θ1(t))2t2 θ1(t)-L2cos(θ2(t))2t2 θ2(t)=-T2sin(θ2(t))-m_2*(L_1*sin(theta_1(t))*(diff(theta_1(t), t))^2 + L_2*sin(theta_2(t))*(diff(theta_2(t), t))^2 - L_1*cos(theta_1(t))*diff(theta_1(t), t, 2) - L_2*cos(theta_2(t))*diff(theta_2(t), t, 2)) == -T_2*sin(theta_2(t))

eqy_2 = m_2*ay_2(t) == T_2*cos(theta_2(t)) - m_2*g
eqy_2 = 

m2L1cos(θ1(t))t θ1(t)2+L2cos(θ2(t))t θ2(t)2+L1sin(θ1(t))2t2 θ1(t)+L2sin(θ2(t))2t2 θ2(t)=T2cos(θ2(t))-gm2m_2*(L_1*cos(theta_1(t))*(diff(theta_1(t), t))^2 + L_2*cos(theta_2(t))*(diff(theta_2(t), t))^2 + L_1*sin(theta_1(t))*diff(theta_1(t), t, 2) + L_2*sin(theta_2(t))*diff(theta_2(t), t, 2)) == T_2*cos(theta_2(t)) - g*m_2

Шаг 3: Оценка сил и уменьшение уравнений системы

Четыре уравнения движения описывают кинематику двойного маятника. Оцените силы, действующие на стержни, и уменьшите набор из четырех уравнений до двух уравнений.

Уравнение движения имеет четыре неизвестных: start1, start2, T1 и T2. Оцените двух неизвестных T1 и T2 из eqx_1 и eqy_1. Использовать solve функция для поиска T1 и T2.

Tension = solve([eqx_1 eqy_1],[T_1 T_2]);

Заменить решения для T1 и T2 на 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]);

Два приведенных уравнения полностью описывают движение маятника.

Шаг 4: Решение системных уравнений

Решите системные уравнения, чтобы описать движение маятника.

Сначала определите значения для масс в кг, длины стержней в м и силы тяжести в м/с2 (единицы СИ). Замените эти значения двумя приведенными уравнениями.

L_1 = 1;
L_2 = 1.5;
m_1 = 2;
m_2 = 1;
g = 9.8;
eqn_1 = subs(eqRed_1)
eqn_1 = 

cos(θ1(t))σ1-3sin(θ2(t))t θ2(t)22-sin(θ1(t))t θ1(t)2+3cos(θ2(t))2t2 θ2(t)2=-2sin(θ2(t))cos(θ1(t))2σ1+sin(θ1(t))2σ1+49sin(θ1(t))5cos(θ1(t))sin(θ2(t))-cos(θ2(t))sin(θ1(t))where  σ1=2t2 θ1(t)cos(theta_1(t))*diff(theta_1(t), t, 2) - (3*sin(theta_2(t))*(diff(theta_2(t), t))^2)/2 - sin(theta_1(t))*(diff(theta_1(t), t))^2 + (3*cos(theta_2(t))*diff(theta_2(t), t, 2))/2 == -(2*sin(theta_2(t))*(cos(theta_1(t))^2*diff(theta_1(t), t, 2) + sin(theta_1(t))^2*diff(theta_1(t), t, 2) + (49*sin(theta_1(t)))/5))/(cos(theta_1(t))*sin(theta_2(t)) - cos(theta_2(t))*sin(theta_1(t)))

eqn_2 = subs(eqRed_2)
eqn_2 = 

cos(θ1(t))t θ1(t)2+3cos(θ2(t))t θ2(t)22+sin(θ1(t))σ1+3sin(θ2(t))2t2 θ2(t)2=2cos(θ2(t))cos(θ1(t))2σ1+sin(θ1(t))2σ1+49sin(θ1(t))5cos(θ1(t))sin(θ2(t))-cos(θ2(t))sin(θ1(t))-495where  σ1=2t2 θ1(t)cos(theta_1(t))*(diff(theta_1(t), t))^2 + (3*cos(theta_2(t))*(diff(theta_2(t), t))^2)/2 + sin(theta_1(t))*diff(theta_1(t), t, 2) + (3*sin(theta_2(t))*diff(theta_2(t), t, 2))/2 == (2*cos(theta_2(t))*(cos(theta_1(t))^2*diff(theta_1(t), t, 2) + sin(theta_1(t))^2*diff(theta_1(t), t, 2) + (49*sin(theta_1(t)))/5))/(cos(theta_1(t))*sin(theta_2(t)) - cos(theta_2(t))*sin(theta_1(t))) - sym(49/5)

Эти два уравнения являются нелинейными дифференциальными уравнениями второго порядка. Чтобы решить эти уравнения, преобразуйте их в дифференциальные уравнения первого порядка с помощью odeToVectorField функция.

[V,S] = odeToVectorField(eqn_1,eqn_2);

Элементы вектора V представляют дифференциальные уравнения первого порядка, которые равны временной производной элементов S. Элементы S являются переменными состояния start2, dü 2/dt, start1 и dstart1/dt. Переменные состояния описывают угловые смещения и скорости двойного маятника.

S
S = 

(θ2Dtheta2θ1Dtheta1)[theta_2; Dtheta_2; theta_1; Dtheta_1]

Затем преобразуйте уравнения первого порядка в функцию 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)')

Figure contains an axes. The axes with title Solutions of State Variables contains 4 objects of type line. These objects represent \theta_2, d\theta_2/dt, \theta_1, d\theta_1/dt.

Шаг 5: Создание анимации колеблющегося двойного маятника

Создайте анимацию колебательного двойного маятника.

Сначала создайте четыре функции, которые используют 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;

Figure contains an axes. The axes contains 5 objects of type line, text.

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