Aplet Lagrange’a

Original: http://www.mscs.dal.ca/~selinger/lagrange/mechsystem.html

To jest łatwe do Lagrange Aplet symulacji własny system dynamiczny. Dla każdego układu dynamicznego, musisz zdefiniować podklasę MechSystem klasy. Kod źródłowy Lagrange aplet jest w pliku Lagrange.java. To jest, gdy poszczególne układy mechaniczne, takie jak SpringPendulum są zdefiniowane. Możesz edytować ten plik do realizacji innych systemów mechanicznych. Dokument ten opisuje jak pisać kod, aby to zrobić.
Na szczęście, predefiniowane klasy MechSystem już realizuje wszystkie krwawe szczegóły mechaniki Lagrange’a i rzeczywistej symulacji. Aby zdefiniować własny system mechaniczny, musisz jedynie dostarczyć informacji, które opisuje fizyka szczególny system, który ma symulować. Istnieją trzy grupy metod, które powinny być zdefiniowane:

Sposoby, które zwracają informacje o systemie mechanicznym, na przykład liczbę i nazwy parametrów i współrzędne.
Metody, które obliczają kinetyczną i potencjalną energię do systemu.
Metody, które określają, jak stan systemu jest sporządzona.
Opcjonalnie można zdefiniować czwartą grupę metod, które określają, jak obsługiwać zdarzenia myszy.
W metodach, które będą określają, wszystkie obliczenia wykonywane są w rzeczywistych jednostkach fizycznych, takich jak liczniki i kilogramach, a nie w jednostkach komputerowych, takich jak pikseli. Odpowiednie konwersje do ekranu współrzędne itd są automatycznie handeled przez nadklasy MechSystem. W ten sposób, tylko trzeba się martwić o właściwościach fizycznych układu mechanicznego definiowanej.

Przykład: Wiosna Pendulum

Jako przykład, będziemy sprawdzać, jak SpringPendulum klasa jest zdefiniowana. Wahadło jest wiosna podwójne wahadło, gdzie wewnętrzna noga wahadła jest wiosna, tak:

[image]

Niech m0 m1 jest masą wewnętrzną i zewnętrzną, odpowiednio. Pozwolić l0 oraz L1 jest długością nogi wewnętrznej i zewnętrznej, w którym L0 oznacza długość sprężyny w stanie rozluźnionym. Niech k0 być stała sprężyny. Masy są mierzone w kilogramach, długości w metrach, a stałe wiosną w Newton / metr. Ponadto, niech g = 9.81m / s2 jest stałą grawitacji.System ma trzy współrzędne: x i y są współrzędnymi pierwszej mszy, mierzone w metrach, w układzie współrzędnych, który ma punkt obrotu, co do jego pochodzenia. Alfa jest kąt zewnętrznej nogi, mierzona w radianach zegara z południu. Ponumerujmy współrzędne: q0 = x, y = Q1, Q2 = alfa.
Energia kinetyczna i energia potencjalna wahadła sprężyny są dane przez:

[equation]

Jak zdefiniowania klasy SpringPendulum

Będziemy teraz zobaczyć jak przetłumaczyć tę fizyczną informacji do klasy Java. Klasa SpringPendulum jest zdefiniowany w następujący sposób:
Klasa SpringPendulum rozciąga MechSystem {
Zmienne instancji i metody ogólne

Po pierwsze, można zadeklarować zmienne wewnętrzne, które zamierzasz użyć. Zazwyczaj nie będzie jedną zmienną dla każdego parametru (na przykład masy, etc.). W tym przypadku również zadeklarować dwie zmienne całkowite, które obejmą promienie kropek, które reprezentują dwie msze.
prywatny pokój M0, M1, L0, L1, k0, g; // parametry fizyczne
prywatnych int rad0, rad1; // Promienie masach
Następnie musimy zdefiniować trzy metody, które zapewniają ogólne informacje o systemie. Metoda getType () po prostu zwraca nazwę tej klasy.
String getType () {
powrót „SpringPendulum“;
}
Metoda getParamInfo () zwraca informacje o parametrach fizycznych. W przypadku wahadła sprężyny istnieje sześć parametrów. Metoda zwraca tablicę obiektów typu parametru. Każdy wpis opisuje jeden parametr, nadając jej nazwę, krótki opis, jednostki fizyczne i wartość domyślną.
Parametr [] getParamInfo () {
Parametr [] paraminfo = {
nowy parametr („m0“, „masa wewnętrzny“, „kg“, 2),
nowy parametr („M1“, „masa zewnętrzna“, „kg“, 1),
nowy parametr („l0“ „length wewnętrzny“, „m“, 6),
nowy parametr („l1“ „length zewnętrzny“, „m“, 4)
nowy parametr („k0“, „wiosna stała“, „N / m“, 60),
nowy parametr („g“, „grawitacja“, „m / s ^ 2“, 9.81),
};
powrót paraminfo;
}
Metoda getCoordInfo () zwraca informacje o współrzędnych. W tym przypadku istnieją trzy współrzędne: X, Y, i alfa. Metoda zwraca tablicę obiektów typu współrzędnych. Każdy wpis opisuje jeden współrzędnych, nadając jej nazwę, krótki opis, jednostki fizyczne, domyślne wartości początkowej, domyślnie wartość początkową pochodnej, a okres ten współrzędnych. Na przykład, okres alfa współrzędnych 2pi. Współrzędne x i y nie są okresowe, więc czas jest ustawiony na 0.
Koordynowanie [] getCoordInfo () {
Koordynowanie [] coordinfo = {
Nowy współrzędnych („x“, „współrzędnych masy wewnętrznej, prawo pivot“, „m“,
2.2, 0, 0),
nową współrzędną („y“, „współrzędną masy wewnętrznej powyżej sworznia“, „m“,
3, 0, 0),
Nowy współrzędnych („alpha“,
„Kąt zewnętrznej nogi, w lewo od południa“,
„rad“, 4, 0, 2 * Math.PI),
};
powrót coordinfo;
}
W setphysics metoda () służy do ustawiania zmiennych wewnętrznych, które zależą od parametrów fizycznych, takich jak M0, M1, itp nazywane jest w trakcie inicjalizacji, a także za każdym razem, jedną ze zmian parametrów. Wartości parametrów są przekazywane w podwójnej tablicy param. Parametry pojawiają się w tej tablicy w kolejności, w jakiej getParamInfo () deklaruje je. Jest to również miejsce na ustawienie innych wewnętrznych zmiennych, które zależą od parametrów, takich jak promieniami dwóch mas w tym przykładzie.
void setphysics (double [] param) {
m0 = param [0];
m1 = param [1];
l0 = param [2];
l1 = param [3];
k0 = param [4];
g = param [5];
rad0 = (int) (5 * Math.sqrt (m0 / Math.max (m0 m1)));
rad1 = (int) (5 * Math.sqrt (m1 / Math.max (m0 m1)));
}
Metody, które definiują energii kinetycznej i potencjalnej

Zwróćmy się teraz do metod, które obliczenia energii kinetycznej i potencjalnej. Są to po prostu tłumaczenia odpowiednich wzorów fizycznych. Aktualne wartości współrzędnych, a ich obecne pierwsze pochodne, są przekazywane w podwójnych tablic q, odpowiednio, qp. Sposób sq (podwójne), zdefiniowane w MechSystem klasy mogą być wykorzystywane do kwadratury wartość.
Symulacja Lagrange apletu ma zachowanie energii wbudowanej, tak aby system nie wymkną się spod kontroli, jak łatwo w obliczu błędów numerycznych. Z tego powodu, nie potencjału ani energia kinetyczna mogą mieć wyraźny zależność czasową. Ponadto, algorytm, aby dostosować całkowitą energię wykorzystuje fakt, że energia kinetyczna zależy kwadratowo na pierwszych pochodnych współrzędnych, i to prawdopodobnie się nie powiedzie, jeśli energia kinetyczna nie ma tej właściwości. (Jednak zmuszony zachowania energii może być wyłączony).

// Energia kinetyczna
podwójne T (podwójny q [], podwójne qp []) {
powrotu (m0 + m1) / 2 * (kw (qp [0]) + kw (qp [1]))
+ M1 / ​​2 * sq (l1) * sq (qp [2])
+ M1 * qp [2] * l1 * (qp [0] * Math.cos (q) [2] + qp [1] * Math.sin (q [2]));
}

// Energia potencjalna
podwójne U (podwójne q []) {
powrotu k0 / 2 * sq (Math.sqrt (kw (q [0]) + sq (q [1])) – l0)
+ (M0 + m1) * g * q [1]
– M1 * g * l1 * Math.cos (q) [2];
}
Nadklasą MechSystem definiuje trzy metody diffq (int i, dwukrotnie q [], podwójne qp []), diffpp (int i, int j dwukrotnie q [], podwójne qp []), a diffqp (int i, int j, podwójne q [], podwójne qp []), że stosowanie metody numeryczne obliczyć pochodne cząstkowe odpowiednie (gdzie L = T – U):

dL/dq_i, (d^2 L)/(dq'_i dq'_j), (d^2
L)/(dq_i dq'_j).

Jeśli chcesz, możesz zastąpić je z metod obliczania odpowiednie pochodne cząstkowe za pomocą dokładnej formuły; Ten nieznacznie zwiększa wydajność.
Metody, które określają, w jaki sposób system jest sporządzony

Następnie musimy zdefiniować dwie metody, które określają, w jaki sposób system mechaniczny jest sporządzona. Metoda drawsystem () zwraca aktualny stan. W tym celu, może wywołać drawSpring metod () drawLine () drawMass () drawCircle () i recordTrace (), z których wszystkie dostarczane są przez nadklasy MechSystem. Metody te oczekują współrzędne fizyczne (w metrach); konwersji do współrzędnych ekranu są załatwione przez nadrzędnej.
Metoda recordtrace musi być powołany do rysowania segment śledzenia; to jest rysowane na tle bg, jak również na og pierwszym planie.

Metoda drawsystem () może również powołać się na dowolne sposoby rysowania obiektu Graphics og; Jednakże, w tym przypadku, współrzędne muszą być przekształcone w sposób wyraźny, na przykład og.drawRectangle (cx (po lewej), cy (u góry), c.dx (prawa na lewo), c.dy (bot-top)). Cx metody () i cy () konwersji współrzędnych fizycznych ekranie współrzędne i c.dx metody () i c.dy () przekonwertować różnic współrzędnych fizycznych różnic współrzędnych ekranu. Należy pamiętać, że w układzie współrzędnych, fizycznego punkty osi Y w górę. Przed wywołaniem metody rysowania og, prawidłowy kolor musi być ustawiony z og.setColor (Global.fgcolor).

nieważne drawsystem (Graphics og, Grafika bg) {
x0 = q dwukrotnie [0];
podwójne y0 = q [1];
podwójne x0 + x1 = l1 * Math.sin (q) [2];
podwójne y1 = y0-l1 * Math.cos (q) [2];

recordTrace (bg, og, x1, y1);

drawSpring (i, 0,0, x0, y0,15,0.2);
drawLine (i, x0, y0, x1, y1);
drawMass (i, x0, y0, rad0);
drawMass (i, x1, y1, rad1);
}
Granice metoda () służy do określenia rozmiaru obrazu, który drawsystem () będzie wyciągnąć. Zwraca prostokąt fizycznych współrzędnych, który reprezentuje górne i dolne granice na współrzędnych stosowanych metodami rysowania w drawsystem (). Ważne jest, że ten prostokąt jest wystarczająco duży, aby wyciągnąć nie tylko aktualny stan, ale także przyszłych stanów, które mogą powstać w system ewoluuje. Zasada zachowania energii można przyjąć w tym celu; powinna zmiany energii, granice metoda () jest wywoływana ponownie. Sposób E () może być wywołana w celu obliczenia bieżącego całkowitej energii układu. Wynik powinien być zwrócony wraz z oświadczeniem zwrotu nowego DoubleRectangle (z lewej, bot, prawy, górny) .enlarge (0,05), gdzie metoda powiększ () na prostokącie dodaje trochę miejsca wokół krawędzi.
Granice DoubleRectangle () {
podwójne l = l1 + l0 +
Math.sqrt (kw ((m0 + m1) * g / k0) + 2 * l0 * (m0 + m1) * g / k0 + 2 * m1 * g / k0 + 2 * E () / k0);
podwójne równo = (M0 + m1) * g / k0;

powrót nowego DoubleRectangle (-l, -equi-l, l, l) + -equi (0,05 .enlarge);
}
Mapowanie zdarzeń myszy (opcjonalnie)

Na koniec, sposób mouseMap (map) (x, y) współrzędnych -coordinates wewnętrznych w celu myszy. Powinien on zawierać sekwencję deklaracji mapie formularza (i, v), co oznacza, ustawione ego współrzędnych do wartości v W przypadku naszej wiosennej wahadła, definicja mouseMap () jest po prostu to.:
unieważnić mouseMap (double x, double y) {
Mapa (0, x);
Mapa (1, y);
}
Oznacza to, że gdy kliknie on mouse współrzędnych (x, y), a następnie Q0 systemów dynamicznych jest przymocowany do współrzędnej x i koordynowania q1 jest przymocowany do y. Gdybyśmy mieli jakiś inny układ mechaniczny, gdzie q0 współrzędnych oznaczony jakiś kąt, mierzony w lewo od południa, by zdefiniować
unieważnić mouseMap (double x, double y) {
Mapa (0, Math.atan2 (x, -y));
}
Domyślna implementacja mouseMap nic nie robi; więc jeśli nie jest przesłonięta, a następnie kliknięcia myszą i ciągnie nie przyniesie żadnego efektu. Kończy to definicji SpringPendulum klasy.
Inne modyfikacje Lagrange.java

Wreszcie, należy zmodyfikować kod głównego klasy Lagrange, aby mógł on rozpoznać układ mechaniczny właśnie zdefiniowany. Należy dodać kod w dwóch miejscach:
(New DoublePendulum ()) appendInfoVector (infov.);
(New DoubleSpring ()) appendInfoVector (infov.);
(New SpringPendulum ()) appendInfoVector (infov.);
// *** Dodać swój własny system tutaj ***

if (type.equals („doublependulum“)) {
mechsys = new DoublePendulum ();
} Else if (type.equals („springpendulum“)) {
mechsys = new SpringPendulum ();
} Else if (type.equals („doublespring“)) {
mechsys = new DoubleSpring ();
// *** Dodać swój własny system tutaj ***
To jest to. Miłej zabawy projektowania własnych systemów mechanicznych!
Pokój Pendulum,
Pokój Wiosna,
Wiosna Pendulum.

 

Comments are closed.