Этот пример решает систему обыкновенных дифференциальных уравнений, которые моделируют динамику палочки, выброшенной в воздух [1]. Дубинка моделируется как две частицы с массами и соединенный стержнем длины . Дубинка выбрасывается в воздух и впоследствии перемещается в вертикальной xy-плоскости под действием силы тяжести. Шток образует угол с горизонтальной и координатами первой массы . С помощью этой формулировки координаты второй массы .
Уравнения движения для системы получаются путем применения уравнений Лагранжа для каждой из трех координат, , , и :
Чтобы решить эту систему ОДУ в MATLAB ®, кодируйте уравнения в функцию перед вызовом решателя ode45
. Можно либо включить необходимые функции в качестве локальных функций в конец файла (как это сделано здесь), либо сохранить их как отдельные именованные файлы в директории по пути MATLAB.
The ode45
решатель требует, чтобы уравнения были записаны в виде , где является первой производной от каждой координаты. В этой задаче вектор решения имеет шесть компонентов: , , угол и их первые производные:
С помощью этого обозначения можно переписать уравнения движения полностью в терминах элементов :
К сожалению, уравнения движения не вписываются в форму требуется решателем, так как слева несколько членов с первыми производными. Когда это происходит, необходимо использовать большую матрицу, чтобы представлять левую сторону уравнения.
С помощью матричного обозначения можно переписать уравнения движения как систему шести уравнений с помощью большой матрицы в виде . Большая матрица выражает линейные комбинации первых производных в левой части уравнения с матрицей-векторного продукта. В этом виде система уравнений становится:
Из этого выражения можно написать функцию, которая вычисляет ненулевые элементы большой матрицы. Функция принимает три входов: и вектор решения требуются (необходимо задать эти входы, даже если они не используются в теле функции), и является необязательным дополнительным входом, используемым для передачи значений параметров. Чтобы передать параметры для этой задачи функции, создайте 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
Далее можно записать функцию для правой стороны каждого из уравнений в системе . Как и функция большой матрицы, эта функция принимает два необходимых входов для и и один необязательный вход для значений параметров .
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
значений параметров для , , , и путем установки соответствующих именованных полей в структуре. Структура 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);
Установите начальные условия задачи. Поскольку дубинка выброшена вверх под углом, используйте ненулевые значения для начальных скоростей, , , и . Для начальных позиций дубинка начинается в вертикальном положении, поэтому , , и .
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
[1] Wells, Dare A. Schaum's Outline of Theory and Problems of Lagrangian Dynamics: С обработкой уравнений движения Эйлера, уравнений Гамильтона и принципа Гамильтона. Серия контуров Шаума. Нью-Йорк: Шаум Паб. Ко, 1967.
Здесь перечислены локальные вспомогательные функции, которые вызывается решатель ОДУ для вычисления решения. Также можно сохранить эти функции как собственные файлы в директории по пути 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