exponenta event banner

Решить уравнения движения для дубинки, выброшенной в воздух

В этом примере решается система обыкновенных дифференциальных уравнений, моделирующих динамику брошенной в воздух дубинки [1]. Дубинка моделируется как две частицы с массами m1 и m2, соединенные стержнем длиной L. Дубинка выбрасывается в воздух и впоследствии перемещается в вертикальной плоскости xy под действием силы тяжести. Стержень образует с горизонталью угол, а координаты первой массы равны (x, y). При такой формулировке координаты второй массы равны (x + L cos, y + L sin

Уравнения движения для системы получаются путем применения уравнений Лагранжа для каждой из трех координат, x, y и

(m1+m2) θ-m2L θ˙2 греха x •-m2L θ •, потому что θ = 0, (m1+m2) y •-m2L θ •, потому что грех θ-m2L θ˙2 θ + (m1+m2) g=0, грех L2θ •-l x • θ + L y ¨, потому что θ + g L, потому что θ = 0.

Чтобы решить эту систему ОДУ в MATLAB ®, кодируйте уравнения в функцию перед вызовом решателяode45. Требуемые функции можно либо включить в качестве локальных функций в конце файла (как здесь сделано), либо сохранить их как отдельные именованные файлы в каталоге по пути MATLAB.

Уравнения кода

ode45 решатель требует, чтобы уравнения записывались в виде q˙=f (t, q), где q˙ - первая производная каждой координаты. В этой задаче вектор решения имеет шесть компонентов: x, y, угол, и их первые производные:

q=[q1q2q3q4q5q6]=[xx˙yy˙θθ˙].

С помощью этой записи можно переписать уравнения движения полностью в терминах элементов q:

(m1 + m2) q2˙-m2L q6˙ sin q5 = m2L q62cos q5, (m1 + m2) q4˙-m2L q6˙ cos q5 = m2L q62 sin q5- (m1 + m2) g,L2q6˙-L q2˙ sin q5 + L q4˙ cos q5 = -g L cos q5.

К сожалению, уравнения движения не укладываются в форму q˙=f (t, q), требуемую решателем, так как слева есть несколько слагаемых с первыми производными. В этом случае для представления левой части уравнения необходимо использовать массовую матрицу.

С помощью матричной нотации можно переписать уравнения движения как систему из шести уравнений, используя массовую матрицу в виде M (t, q) q˙=f (t, q). Массовая матрица выражает линейные комбинации первых производных в левой части уравнения матрично-векторным произведением. В этом виде система уравнений становится:

[1000000m1+m2000-m2L грешите q5001000000m1+m20m2L, потому что q50000100-L грешат q50L потому что q50L2] [q1˙q2˙q3˙q4˙q5˙q6˙] = [грех q2m2L q62cos q5q4m2L q62 q5-(m1+m2) gq6-g L потому что q5]

Из этого выражения можно записать функцию, которая вычисляет ненулевые элементы массовой матрицы. Функция принимает три входа: t и требуется вектор решения q (необходимо указать эти входы, даже если они не используются в теле функции), а P является необязательным дополнительным входом, используемым для передачи значений параметров. Чтобы передать функции параметры для этой проблемы, создайте P как структура, которая содержит значения параметров, а затем использует методику, описанную в Параметризирующих функциях (Parameterizing Functions), для передачи структуры функции в качестве дополнительного ввода.

function M = mass(t,q,P)
% Extract parameters
m1 = P.m1;
m2 = P.m2;
L = P.L;
g = P.g;

% Mass matrix function
M = zeros(6,6);
M(1,1) = 1;
M(2,2) = m1 + m2;
M(2,6) = -m2*L*sin(q(5));
M(3,3) = 1;
M(4,4) = m1 + m2;
M(4,6) = m2*L*cos(q(5));
M(5,5) = 1;
M(6,2) = -L*sin(q(5));
M(6,4) = L*cos(q(5));
M(6,6) = L^2;
end

Далее можно записать функцию для правой части каждого из уравнений в системе M (t, q) q˙=f (t, q). Как и функция матрицы масс, эта функция принимает два обязательных входа для t и q и один необязательный вход для значений параметров P.

function dydt = f(t,q,P)
% Extract parameters
m1 = P.m1;
m2 = P.m2;
L = P.L;
g = P.g;

% Equation to solve
dydt = [q(2)
        m2*L*q(6)^2*cos(q(5))
        q(4)
        m2*L*q(6)^2*sin(q(5))-(m1+m2)*g
        q(6)
        -g*L*cos(q(5))];
end

Система решений уравнений

Сначала создайте структуру P значений параметров для m1, m2, g и L путем установки соответствующих именованных полей в структуре. Структура P передается в массовую матрицу, и ОДУ функционирует как дополнительный вход.

P.m1 = 0.1;
P.m2 = 0.1;
P.L = 1;
P.g = 9.81
P = struct with fields:
    m1: 0.1000
    m2: 0.1000
     L: 1
     g: 9.8100

Создайте вектор с 25 точками от 0 до 4 для интервала времени интегрирования. При указании вектора времени ode45 возвращает интерполированные решения в запрошенное время.

tspan = linspace(0,4,25);

Задайте начальные условия проблемы. Так как дубинка брошена вверх под углом, используйте ненулевые значения для начальных скоростей, x0˙=4, y0˙=20 и θ0˙=2. Для исходных положений полицейская дубинка начинается в вертикальном положении, таким образом, θ0 =-π/2, x0=0, и y0=L.

y0 = [0; 4; P.L; 20; -pi/2; 2];

Использовать odeset для создания структуры опций, ссылающейся на функцию матрицы массы. Поскольку решатель ожидает, что функция матрицы массы будет иметь только два входа, используйте анонимную функцию для передачи параметров P из рабочей области.

opts = odeset('Mass',@(t,q) mass(t,q,P));

Наконец, решить систему уравнений с помощью ode45 с этими входами:

  • Анонимная функция для уравнений @(t,q) f(t,q,P)

  • Вектор tspan времени, когда запрашивается решение

  • Вектор y0 исходных условий

  • Структура опций opts которая ссылается на массовую матрицу

[t,q] = ode45(@(t,q) f(t,q,P),tspan,y0,opts);

Результаты графика

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

Законтрите каждый ряд раствора и на каждом временном шаге постройте график положения дубинки. Каждый конец дубинки окрашивайте по-разному, чтобы можно было видеть ее вращение со временем.

figure
title('Motion of a Thrown Baton, Solved by ODE45');
axis([0 22 0 25])
hold on
for j = 1:length(t)
   theta = q(j,5);
   X = q(j,1);
   Y = q(j,3);
   xvals = [X X+P.L*cos(theta)];
   yvals = [Y Y+P.L*sin(theta)];
   plot(xvals,yvals,xvals(1),yvals(1),'ro',xvals(2),yvals(2),'go')
end
hold off

Figure contains an axes. The axes with title Motion of a Thrown Baton, Solved by ODE45 contains 75 objects of type line.

Ссылки

[1] Уэллс, Dare A. Schaum наброски теории и проблемы лагранжевой динамики: с лечением уравнений движения Эйлера, уравнений Гамильтона и Гамильтона. Серия набросков Шаума. Нью-Йорк: Шаум Паб. Ко, 1967.

Локальные функции

Здесь перечислены локальные вспомогательные функции, вызываемые решателем ODE для вычисления решения. Кроме того, эти функции можно сохранить в виде собственных файлов в каталоге по пути MATLAB.

function dydt = f(t,q,P) % Equations to solve
% Extract parameters
m1 = P.m1;
m2 = P.m2;
L = P.L;
g = P.g;

% RHS of system of equations
dydt = [q(2)
        m2*L*q(6)^2*cos(q(5))
        q(4)
        m2*L*q(6)^2*sin(q(5))-(m1+m2)*g
        q(6)
        -g*L*cos(q(5))];
end
%------------------------------------------------
function M = mass(t,q,P) % Mass matrix function
% Extract parameters
m1 = P.m1;
m2 = P.m2;
L = P.L;
g = P.g;

% Set nonzero elements in mass matrix
M = zeros(6,6);
M(1,1) = 1;
M(2,2) = m1 + m2;
M(2,6) = -m2*L*sin(q(5));
M(3,3) = 1;
M(4,4) = m1 + m2;
M(4,6) = m2*L*cos(q(5));
M(5,5) = 1;
M(6,2) = -L*sin(q(5));
M(6,4) = L*cos(q(5));
M(6,6) = L^2;
end

См. также

Связанные темы