Этот пример показывает, как смоделировать движение двойного маятника с помощью MATLAB ® и Symbolic Math Toolbox™.
Решите уравнения движения двойного маятника и создайте анимацию, чтобы смоделировать движение двойного маятника.
Следующий рисунок показывает модель двойного маятника. Двойной маятник состоит из двух бобышек маятника и двух твёрдых стержней.
Опишите движение двойного маятника путем определения переменных состояния:
угловое положение первого боба
угловое положение второго боба
Опишите свойства двойного маятника путем определения переменных:
длина первого стержня
длина второго стержня
масса первого боба
масса второго боба
ускорение свободного падения
Для простоты игнорируйте массы двух жестких стержней. Задайте все переменные при помощи 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));
Затем создайте объект анимации о стоп-движении первого маятника bob при помощи 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
воспроизведение анимации двойного маятника.