Chciałbym zasymulować zachowanie systemu podwójnie wahadłowego. System jest manipulatorem robota o 2 stopniach swobody, który nie jest uruchamiany i dlatego będzie zachowywał się głównie jak podwójne wahadło pod wpływem grawitacji. Jedyną główną różnicą w przypadku podwójnego wahadła jest to, że składa się on z dwóch sztywnych ciał o właściwościach masy i bezwładności w ich środkach masy.
Zasadniczo programowałem ode45
pod Matlabem, aby rozwiązać system ODE następujących typów:
gdzie jest kątem pierwszego ciała w stosunku do poziomu, jest prędkością kątową pierwszego ciała; to kąt drugiego ciała w stosunku do pierwszego ciała, a to prędkość kątowa drugiego ciała. Wszystkie te współczynniki są określone w kodeksie, przy użyciu rhs
i fMass
funkcji stworzyłem.
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
Zauważ, jak ustawiłem warunek początkowy (kąt pierwszego korpusu w stosunku do poziomu), aby system zaczął działać w pozycji całkowicie pionowej. W ten sposób, ponieważ działa tylko grawitacja, oczywistym rezultatem jest to, że system w ogóle nie powinien się poruszać z tej pozycji.
UWAGA: we wszystkich poniższych rysunkach przedstawiłem rozwiązania i w odniesieniu do czasu.
ODE45
Kiedy uruchamiam symulację przez 6 sekund ode45
, otrzymuję oczekiwane rozwiązanie bez żadnych problemów, system pozostaje tam, gdzie jest i nie porusza się:
Jednak gdy uruchamiam symulację przez 10 sekund, system zaczyna się poruszać nieracjonalnie:
ODE23
Następnie przeprowadziłem symulację, ode23
aby sprawdzić, czy problem nadal występuje. Skończyłem z tym samym zachowaniem, tylko tym razem dywergencja zaczyna się 1 sekundę później:
ODE15s
Następnie uruchomiłem symulację, ode15s
aby sprawdzić, czy problem nadal występuje i nie, system wydaje się być stabilny nawet przez 100 sekund:
Z drugiej strony, ode15s
jest tylko pierwsze zamówienie i zauważ, że jest tylko kilka kroków integrujących. Uruchomiłem więc kolejną symulację w ode15s
ciągu 10 sekund, ale MaxStep
rozmiar aby zwiększyć precyzję, i niestety, prowadzi to do tego samego wyniku, co w przypadku obu ode45
i ode23
.
Zwykle oczywistym rezultatem tych symulacji byłby fakt, że system pozostaje w początkowej pozycji, ponieważ nic go nie zakłóca. Dlaczego występuje ta rozbieżność? Czy ma to coś wspólnego z faktem, że tego rodzaju systemy mają charakter chaotyczny? Czy jest to normalne zachowanie ode
funkcji w Matlabie?
x1
i x3
. (Wstaw suchy komentarz na temat wykresów bez legend i opisów.) Spróbuj wykreślić logarytmy (wartości bezwzględne) x2
i x4
.