Я хочу смоделировать поведение системы, подобной двойному маятнику. Система представляет собой робот-манипулятор с 2 степенями свободы, который не приводится в действие и, следовательно, будет вести себя в основном как двойной маятник, на который действует сила тяжести. Единственное основное отличие двойного маятника состоит в том, что он состоит из двух твердых тел с массой и инерционными свойствами в их центрах масс.
По сути, я запрограммировал ode45
под Matlab решить систему ODE следующего типа:
где - угол первого тела относительно горизонтали, - угловая скорость первого тела; - угол второго тела относительно первого тела, а - угловая скорость второго тела. Все коэффициенты указаны в следующем коде, в и функциях , которые я создал.rhs
fMass
clear all
opts= odeset('Mass',@fMass,'MStateDependence','strong','MassSingular','no','OutputFcn',@odeplot);
sol = ode45(@(t,x) rhs(t,x),[0 5],[pi/2 0 0 0],opts);
function F=rhs(t,x)
m=[1 1];
l=0.5;
a=[0.25 0.25];
g=9.81;
c1=cos(x(1));
s2=sin(x(3));
c12=cos(x(1)+x(3));
n1=m(2)*a(2)*l;
V1=-n1*s2*x(4)^2-2*n1*s2*x(2)*x(4);
V2=n1*s2*x(2)^2;
G1=m(1)*a(1)*g*c1+m(2)*g*(l*c1+a(2)*c12);
G2=m(2)*g*a(2)*c12;
F(1)=x(2);
F(2)=-V1-G1;
F(3)=x(4);
F(4)=-V2-G2;
F=F';
end
function M=fMass(t,x)
m=[1 1];
l=0.5;
Izz=[0.11 0.11];
a=[0.25 0.25];
c2=cos(x(3));
n1=m(2)*a(2)*l;
M11=m(1)*a(1)^2+Izz(1)+m(2)*(a(2)^2+l^2)+2*n1*c2+Izz(2);
M12=m(2)*a(2)^2+n1*c2+Izz(2);
M22=m(2)*a(2)^2+Izz(2);
M=[1 0 0 0;0 M11 0 M12;0 0 1 0;0 M12 0 M22];
end
Обратите внимание, как я установил начальное условие (угол первого тела относительно горизонтали), чтобы система начинала в полностью вертикальном положении. Таким образом, поскольку действует только гравитация, очевидным результатом является то, что система вообще не должна двигаться из этой позиции.
ПРИМЕЧАНИЕ: на всех графиках ниже я построил решения и относительно времени.
ode45
Когда я запускаю симуляцию в течение 6 секунд ode45
, я получаю ожидаемое решение без каких-либо проблем, система остается на месте и не двигается:
Однако, когда я запускаю симуляцию в течение 10 секунд, система начинает двигаться неоправданно:
ode23
Затем я запустил симуляцию, ode23
чтобы проверить, не исчезла ли проблема. Я получаю такое же поведение, только на этот раз расхождение начинается через 1 секунду:
ode15s
Затем я запустил симуляцию, ode15s
чтобы увидеть, сохраняется ли проблема, и нет, система кажется стабильной даже в течение 100 секунд:
Опять же, ode15s
это только первый порядок и обратите внимание, что есть только несколько шагов интеграции. Так что я запустил еще одну симуляцию в ode15s
течение 10 секунд, но с MaxStep
размером для повышения точности, и, к сожалению, это приводит к тому же результату, что и для обоих, и для .ode45
ode23
Обычно очевидным результатом этих симуляций будет то, что система останется в своем первоначальном положении, поскольку ничто не мешает ей. Почему происходит это расхождение? Это как-то связано с тем, что системы такого типа хаотичны по своей природе? Это нормальное поведение для ode
функций в Matlab?
x1
и x3
. (Вставьте сухой комментарий о графиках без легенд и описаний.) Попробуйте построить логарифмы (абсолютные значения) x2
и x4
.