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?
źródło
x1
ix3
. (Wstaw suchy komentarz na temat wykresów bez legend i opisów.) Spróbuj wykreślić logarytmy (wartości bezwzględne)x2
ix4
.Odpowiedzi:
Myślę, że dwie główne kwestie zostały już przedstawione przez Briana i Ertxiema: twoja początkowa wartość jest niestabilną równowagą, a fakt, że twoje obliczenia liczbowe nigdy nie są naprawdę dokładne, zapewnia małe zaburzenie, które wywoła niestabilność.
Aby podać nieco więcej szczegółów, jak to się dzieje, rozważ swój problem w postaci ogólnego problemu z wartością początkową
W kodzie możesz to sprawdzić, wykonując obliczenia
co daje 6,191e-16 - czyli prawie, ale nie dokładnie zero. Jak to wpływa na dynamikę twojego systemu?
Ponadto, w bardzo krótkim czasie, rozwiązanie twojego systemu wygląda jak rozwiązanie systemu zlinearyzowanego
rhs
Nie mogłem sobie pozwolić na ręczne obliczenie jakobianu, więc użyłem automatycznego różnicowania, aby uzyskać dobre przybliżenie:
tak aby twoje równanie stało się
Teraz potrzebujemy ostatniego kroku: możemy obliczyć rozkład wartości własnej jakobianu w taki sposób, aby
źródło
źródło
sin(0)
cos(0)
sin(pi/2)
cos(pi/2)
rhs(t,[0,0,0 0] == [0,0,0,0]
Spójrz na składowe sił obliczonych w twoich funkcjach.
źródło
Początkowe założenie było takie, że pozycja początkowa znajdowała się w stabilnej równowadze (tj. Minimum energii potencjalnej) przy zerowej energii kinetycznej, a układ zaczął się oddalać od równowagi.
Ponieważ fizycznie tak się nie stanie (jeśli weźmiemy pod uwagę mechanikę klasyczną), przyszło mi do głowy dwie rzeczy:
Po drugie, być może coś jest nie tak z równaniami ruchu (może literówka gdzieś?). Czy możesz napisać równania wprost? Być może mógłbyś wykreślić przyspieszenie kątowe jako funkcję początkowej pozycji każdego wahadła, zakładając zerową prędkość kątową, aby sprawdzić, czy jest coś dziwnego.
źródło
Powinieneś poszukać więcej o podwójnych wahadłach: są to tak zwane „systemy chaotyczne”. Mimo że zachowują się według prostych zasad, zaczynając od nieco innych warunków początkowych, rozwiązania różnią się dość szybko. Wykonywanie symulacji numerycznych dla tego rodzaju systemów nie jest łatwe. Obejrzyj poniższy film, aby uzyskać lepszy wgląd w problem.
Dla prostego lub podwójnego wahadła możesz napisać wzór na całkowitą energię układu. Zakładając, że siły tarcia są zaniedbywane, całkowita energia jest zachowywana przez system analityczny. Liczbowo jest to zupełnie inna kwestia.
Przed wypróbowaniem podwójnego wahadła wypróbuj prosty wahadło. Zauważysz, że dla metod małego rzędu Runge-Kutty energia systemu będzie rosła w symulacji numerycznych, zamiast pozostać stała (tak dzieje się w twoich symulacjach: ruch jest niczym z niczego). Aby temu zapobiec, można zastosować metody RK wyższego rzędu (ode45 jest rzędu 4; RK rzędu 8 działałby lepiej). Istnieją inne metody zwane „metodami symplektycznymi”, które są zaprojektowane tak, aby symulacje numeryczne oszczędzały energię. Zasadniczo należy przerwać symulację, gdy tylko energia znacznie wzrośnie w porównaniu do inicjalizacji.
I spróbuj zrozumieć proste wahadło, zanim przejdziesz do podwójnego.
źródło
ode45
, otrzymuję wartość, która zaczyna się od zera, a następnie rośnie z czasem. Wartość jest bardzo mała w pierwszych sekundach, ale wciąż konsekwentnie rośnie od zera. Uważam, że dzieje się tak z powodu problemów, które zostały poruszone w powyższych odpowiedziach (przybliżenie