В этом примере показано, как моделировать движение простого маятника с помощью символьных математических Toolbox™. Выведите уравнение движения маятника, затем решите уравнение аналитически для малых углов и численно для любого угла.

Маятник представляет собой простую механическую систему, которая следует дифференциальному уравнению. Маятник первоначально находится в вертикальном положении. Когда маятник смещается на угол, освобождается, сила тяжести тянет его назад в положение покоя. Его импульс заставляет его перевыполняться и доходить до угла ( если сил трения нет) и так далее. Восстанавливающая сила вдоль движения маятника под действием силы тяжести равна . Таким образом, согласно второму закону Ньютона, масса, умноженная на ускорение, должна равняться .
syms m a g theta(t) eqn = m*a == -m*g*sin(theta)
eqn(t) =
Для маятника длиной ускорение маятникового боба равно угловым временам ускорения .
rd2startdt2.
Заменить помощью subs.
syms r
eqn = subs(eqn,a,r*diff(theta,2))eqn(t) =
Изолировать угловое ускорение в eqn с помощью isolate.
eqn = isolate(eqn,diff(theta,2))
eqn =
Соберите константы и в один параметр, который также известен как собственная частота.
гр.
syms omega_0
eqn = subs(eqn,g/r,omega_0^2)eqn =
Уравнение движения нелинейно, поэтому его трудно решить аналитически. Предположим, что углы малы и линеаризуем уравнение, используя расширение Тейлора .
syms x approx = taylor(sin(x),x,'Order',2); approx = subs(approx,x,theta(t))
approx =
Уравнение движения становится линейным уравнением.
eqnLinear = subs(eqn,sin(theta(t)),approx)
eqnLinear =
Решить уравнение eqnLinear с помощью dsolve. Укажите начальные условия в качестве второго аргумента. Упростите решение, предположив, что является реальным, используя assume.
syms theta_0 theta_t0 theta_t = diff(theta); cond = [theta(0) == theta_0, theta_t(0) == theta_t0]; assume(omega_0,'real') thetaSol(t) = dsolve(eqnLinear,cond)
thetaSol(t) =
Термин называется фазой. Косинусная и синусоидальная функции повторяются каждые . Время, необходимое для изменения на , называется периодом времени.
2.drg.
Период времени пропорционален квадратному корню длины маятника и не зависит от массы. Для линейного уравнения движения период времени не зависит от начальных условий.
Постройте график движения маятника для малоугловой аппроксимации.
Определите физические параметры:
Гравитационное ускорение м/с2
Длина маятника 1м
gValue = 9.81; rValue = 1; omega_0Value = sqrt(gValue/rValue); T = 2*pi/omega_0Value;
Установка начальных условий.
theta_0Value = 0.1*pi; % Solution only valid for small angles. theta_t0Value = 0; % Initially at rest.
В общий раствор замените физические параметры и исходные условия.
vars = [omega_0 theta_0 theta_t0]; values = [omega_0Value theta_0Value theta_t0Value]; thetaSolPlot = subs(thetaSol,vars,values);
Постройте график гармонического маятникового движения.
fplot(thetaSolPlot(t*T)/pi, [0 5]); grid on; title('Harmonic Pendulum Motion'); xlabel('t/T'); ylabel('\theta/\pi');

Найдя решение для (визуализируйте движение маятника.
x_pos = sin(thetaSolPlot); y_pos = -cos(thetaSolPlot); fanimator(@fplot,x_pos,y_pos,'ko','MarkerFaceColor','k','AnimationRange',[0 5*T]); hold on; fanimator(@(t) plot([0 x_pos(t)],[0 y_pos(t)],'k-'),'AnimationRange',[0 5*T]); fanimator(@(t) text(-0.3,0.3,"Timer: "+num2str(t,2)+" s"),'AnimationRange',[0 5*T]);

Введите команду playAnimation для воспроизведения анимации движения маятника.

Чтобы понять нелинейное движение маятника, визуализируйте траекторию маятника с помощью уравнения суммарной энергии. Общая энергия сохраняется.
Чтобы переписать масштабированную энергию, используйте тригонометрическое тождество 1-cosstart= 2sin2 (start/2) и уравнение λ 0 = g/r.
Поскольку энергия сохраняется, движение маятника может быть описано путями постоянной энергии в фазовом пространстве. Фазовое пространство представляет собой абстрактное пространство с координатами, Визуализация этих путей с помощью fcontour.
syms theta theta_t omega_0 E(theta, theta_t, omega_0) = (1/2)*(theta_t^2+(2*omega_0*sin(theta/2))^2); Eplot(theta, theta_t) = subs(E,omega_0,omega_0Value); figure; fc = fcontour(Eplot(pi*theta, 2*omega_0Value*theta_t), 2*[-1 1 -1 1], ... 'LineWidth', 2, 'LevelList', 0:5:50, 'MeshDensity', 1+2^8); grid on; title('Constant Energy Contours in Phase Space ( \theta vs. \theta_t )'); xlabel('\theta/\pi'); ylabel('\theta_t/2\omega_0');

Постоянные энергетические контуры симметричные о оси и оси, и периодические вдоль оси. На рисунке показаны две области с различным поведением.
Нижние энергии контурного графика сближаются сами с собой. Маятник качается назад и вперед между двумя максимальными углами и скоростями. Кинетической энергии маятника недостаточно, чтобы преодолеть гравитационную энергию и дать возможность маятнику сделать полную петлю.
Высшие энергии контурного графика не замыкаются на себе. Маятник всегда движется в одном угловом направлении. Кинетической энергии маятника достаточно, чтобы преодолеть гравитационную энергию и дать возможность маятнику сделать полную петлю.
Нелинейные уравнения движения являются дифференциальными уравнениями второго порядка. Численное решение этих уравнений с помощью ode45 решатель. Поскольку ode45 принимает только системы первого порядка, сокращает систему до системы первого порядка. Затем создайте дескрипторы функций, которые являются входными данными для ode45.
Перезаписать ОДУ второго порядка как систему ОДУ первого порядка.
syms theta(t) theta_t(t) omega_0 eqs = [diff(theta) == theta_t; diff(theta_t) == -omega_0^2*sin(theta)]
eqs(t) =
eqs = subs(eqs,omega_0,omega_0Value); vars = [theta, theta_t];
Найти массовую матрицу M системы и правой части уравнений F.
[M,F] = massMatrixForm(eqs,vars)
M =
F =
M и F см. эту форму.
x (t)).
Для упрощения дальнейших вычислений переписать систему в виде (t)).
f = M\F
f =
Новообращенный f к дескриптору функции MATLAB с помощью odeFunction. Результирующий дескриптор функции является входом в решатель MATLAB ODE ode45.
f = odeFunction(f, vars)
f = function_handle with value:
@(t,in2)[in2(2,:);sin(in2(1,:)).*(-9.81e+2./1.0e+2)]
Определение ОДУ для замкнутых энергетических контуров с помощью ode45.
Из графика энергетических контуров замкнутые контуры удовлетворяют условию 0θt0/2ω0≤1. Запишите в переменную начальные условияx0.
x0 = [0; 1.99*omega_0Value];
Укажите интервал времени от 0 с до 10 с для поиска решения. Этот интервал позволяет маятнику пройти через два полных периода.
tInit = 0; tFinal = 10;
Решить ОДУ.
sols = ode45(f,[tInit tFinal],x0)
sols = struct with fields:
solver: 'ode45'
extdata: [1x1 struct]
x: [1x45 double]
y: [2x45 double]
stats: [1x1 struct]
idata: [1x1 struct]
sols.y(1,:) представляет угловое смещение sols.y(2,:) представляет собой угловую скорость .
Постройте график решения с замкнутым контуром.
figure; yyaxis left; plot(sols.x, sols.y(1,:), '-o'); ylabel('\theta (rad)'); yyaxis right; plot(sols.x, sols.y(2,:), '-o'); ylabel('\theta_t (rad/s)'); grid on; title('Closed Path in Phase Space'); xlabel('t (s)');

Визуализация движения маятника.
x_pos = @(t) sin(deval(sols,t,1)); y_pos = @(t) -cos(deval(sols,t,1)); figure; fanimator(@(t) plot(x_pos(t),y_pos(t),'ko','MarkerFaceColor','k')); hold on; fanimator(@(t) plot([0 x_pos(t)],[0 y_pos(t)],'k-')); fanimator(@(t) text(-0.3,1.5,"Timer: "+num2str(t,2)+" s"));

Введите команду playAnimation для воспроизведения анимации движения маятника.

Определение ОДУ для контуров открытой энергии с помощью ode45. Из графика энергетических контуров, открытые контуры удовлетворяют условию 0> 1.
x0 = [0; 2.01*omega_0Value]; sols = ode45(f, [tInit, tFinal], x0);
Постройте график решения для контура открытой энергии.
figure; yyaxis left; plot(sols.x, sols.y(1,:), '-o'); ylabel('\theta (rad)'); yyaxis right; plot(sols.x, sols.y(2,:), '-o'); ylabel('\theta_t (rad/s)'); grid on; title('Open Path in Phase Space'); xlabel('t (s)');

Визуализация движения маятника.
x_pos = @(t) sin(deval(sols,t,1)); y_pos = @(t) -cos(deval(sols,t,1)); figure; fanimator(@(t) plot(x_pos(t),y_pos(t),'ko','MarkerFaceColor','k')); hold on; fanimator(@(t) plot([0 x_pos(t)],[0 y_pos(t)],'k-')); fanimator(@(t) text(-0.3,1.5,"Timer: "+num2str(t,2)+" s"));

Введите команду playAnimation для воспроизведения анимации движения маятника.
