Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web servers, web development, networking and security services. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

Лагранжа аплету

Author: Peter Selinger. Translated by Galina Miklosic
Легко мати аплет Лагранжа імітувати власну динамічну систему.Для кожної динамічної системи, ви повинні визначити підклас класу MechSystem.Вихідний код аплету Лагранжа у файлі Lagrange.java.Саме тут окремі механічних систем, таких як SpringPendulum, визначені.Ви можете редагувати цей файл для реалізації інших механічних систем.Цей документ описує, як написати код, щоб зробити це.

На щастя, зумовленого класу MechSystem вже реалізує всі криваві подробиці лагранжевої механіки і реальне моделювання.Щоб визначити свою власну механічну систему, вам потрібно тільки надати інформацію, яка описує фізику конкретної системи, що ви хочете, щоб імітувати.Є три групи методів, які повинні бути визначені:

  1. Методи, які повертають інформацію про механічної системи, такі як кількість і імена її параметрів і координат.
  2. Методи, які обчислюють кінетичну і потенційну енергію системи.
  3. Методи, які визначають, як стан системи повинна бути намальована.
За бажанням, ви можете визначити четверта група методів, які визначають, як обробляти події миші.

В методи, які ви будете визначати, всі розрахунки проводяться в реальних фізичних одиницях, наприклад, метрах і кілограмах, а не в комп'ютері одиниць, таких, як пікселі.Відповідні перетворення в координати екрану і т.д. автоматично handeled від суперкласу MechSystem.Таким чином, вам тільки потрібно турбуватися про фізичні властивості механічної системи, яку ви визначаєте.

Приклад: Весна Маятник

Як приклад ми розглянемо, як клас SpringPendulum визначена.Навесні маятник подвійного маятника, де внутрішня нога маятник навесні, як це:
[Image]
Нехай т 0 і 1 м бути внутрішньою і зовнішньою маси, відповідно.Нехай ? 0 і L 1-довжина внутрішньої і зовнішньої нозі, де L 0, довжина пружина в розслабленому стані.Нехай до 0-постійна пружини.Маса вимірюється в кілограмах, довжина в метрах, а навесні констант в Ньютон / метр.Крім того, нехай г = 9.81m / с 2 буде гравітаційна постійна.Система має три координати: х і у координати першої маса, вимірюється в метрах в системі координат, яка має точки опори, як його походження.Альфа кута зовнішньої ноги в радіанах проти годинникової стрілки від півдня.Ми число координат: • 0 = х, д 1 = Y, Q 2 = альфа.

Кінетичної і потенційної енергії пружинного маятника мають вигляд:

[Рівняння]

Як визначити SpringPendulum класу

Тепер ми бачимо, як перевести цю фізичну інформацію в клас Java.Клас SpringPendulum визначається таким чином:
 Клас SpringPendulum розширює MechSystem {


Змінні екземпляра і загальні методи

По-перше, ви можете оголошувати будь-яких внутрішніх змінних, які ви збираєтеся використовувати.Зазвичай там буде однією змінною для кожного параметра (наприклад, маси і т.д.).У цьому випадку ми також оголошуємо дві цілі змінні, які буде проводити радіуси крапок, які представлятимуть дві маси.
 приватні подвійний m0, m1, L0, L1, К0, г; / / фізичних параметрів

приватних Int rad0, rad1 / / радіуси мас
Далі, нам необхідно визначити три методи, які надають загальну інформацію про систему.Метод getType() просто повертає ім'я цього класу.
 Рядок GetType () {

повернення "SpringPendulum"; }
Метод getParamInfo() повертає інформацію про фізичні параметри.У разі пружинного маятника, Є шість параметрів.Метод повертає масив об'єктів типу Parameter.Кожен запис описує один параметр, даючи свою назву, короткий опис, фізичних одиницях, а значення за замовчуванням.
 Параметр [] getParamInfo () {

Параметр [] = {paraminfo Новий параметр ("m0", "внутрішньої маси", "кг", 2), Новий параметр ("M1", "зовнішня маси", "кг", 1), Новий параметр ("l0", "внутрішня довжина", "м", 6),
Новий параметр ("L1", "зовнішня довжини", "м", 4), Новий параметр ("& 0", "пружини", "Н / м", 60), Новий параметр ("г", "тяжкості", "м / с ^ 2", 9,81),
}; повернення paraminfo; }
Метод getCoordInfo() повертає інформацію про координати.У цьому випадку, Є три координати: х, у, і альфа.Метод повертає масив об'єктів типу Coordinate.Кожен запис описує одну координату, даючи свою назву, короткий опис, фізичних одиниць, за замовчуванням початкове значення, за умовчанням початкове значення похідної, і період цього координат.Наприклад, в період координувати альфа 2pi.Координат х і у не є періодичними, тому в період встановлена ??в 0.
 Координат [] getCoordInfo () {

Координат [] = {coordinfo нових координат ("х", "координати внутрішньої маси, право на стрижень", "м",
2,2, 0, 0), нових координат ("у", "координати внутрішньої маси, вище стрижень", "м",
3, 0, 0),
нових координат («альфа», "Кут зовнішній нозі, проти годинникової стрілки з півдня",
"Радіан", 4, 0, 2 * Math.PI), };
повернення coordinfo; }
Метод setphysics() використовується для установки внутрішніх змінних, які залежать від фізичних параметрів, таких як M0, M1, і т.д. Це викликається під час ініціалізації, а також кожного разу, коли один з параметрів зміни.Значення параметрів передаються в double масиві param.Параметри з'являються в цьому масиві в тому порядку, в якому getParamInfo() оголошує їх.Це також місце для установки будь-яких інших внутрішніх змінних, які залежать від параметрів, таких як радіуси двох мас в цьому прикладі.
 недійсним setphysics (подвійний [] параметрів) {

m0 = параметр [0]; m1 = параметрами [1]; l0 = параметрами [2]; l1 = параметром [3];
k0 = параметра [4]; г = параметрами [5]; rad0 = (INT) (5 * Math.sqrt (m0/Math.max (m0, m1))); rad1 = (INT) (5 * Math.sqrt (m1/Math.max (m0, m1)));
}

Методи, які визначають кінетичної і потенційної енергії

Звернемося тепер до методів, які обчислюють кінетичну і потенційну енергію.Це просто переклад відповідних фізичних формул.Поточні значення координат, і їх поточний перших похідних, передаються в double масивів q, відповідно, qp.Метод sq(double), визначений у класі MechSystem, можуть бути використані для зведення в квадрат значення.

Моделювання аплету Лагранжа має збереження енергії вбудований, так що система не вийти з-під контролю, як легко в умовах численних помилок.З цієї причини ні потенційних, ні кінетичної енергії, можуть мати явна залежність часу.Крім того, алгоритм, використовуваний для налаштування повної енергії використовує той факт, що кінетична енергія квадратично залежить від перших похідних від координат, і цілком ймовірно, на провал, якщо кінетична енергія не володіють цією властивістю.(Тим не менш, змушені збереження енергії також може бути виключений).

 / / Кінетичну енергію

подвійний Т (подвійний д [], двічі др []) { повернення (m0 + m1) / 2 * (кв. (ф [0]) + кв (ф [1])) + M1 / ??2 * кв (L1) * кв (ін [2]) + M1 * др [2] * l1 * (Qp [0] * Math.cos (д [2]) + др [1] * Math.sin (д [2]));
}
/ / Потенційною енергії подвійний U (подвійний д []) { повернення k0 / 2 * кв (Math.sqrt (кв. (д [0]) + кв (д [1]))-l0)

+ (M0 + m1) * д * д [1]
- M1 * д * l1 * Math.cos (д [2]); }
Суперкласу MechSystem визначає три методи diffq(int i, double q[], double qp[]), diffpp(int i, int j, double q[], double qp[]), і diffqp(int i, int j, double q[], double qp[]), які використовують чисельний метод для розрахунку відповідних приватних похідних (де L = Т - U):
дл / dq_i, (г ^ 2 L) / (dq'_i dq'_j), (г ^ 2 L) / (dq_i dq'_j).
Якщо ви хочете, то можете перевизначити їх з методами, які обчислюють відповідні приватні похідні використанням точної формули, це буде трохи підвищити продуктивність.

Методи, які визначають, як система звертається

Далі, нам необхідно визначити два методи, які визначають, як механічна система повинна бути намальована.Метод drawsystem() малює поточний стан.Для цієї мети, він може звернути методи drawSpring(), drawLine(), drawMass(), drawCircle(), і recordTrace(), кожен з яких пропонує суперкласу MechSystem.Ці методи очікувати фізичні координати (в метрах); перетворення на екран координати піклуються суперкласу.

recordtrace метод повинен бути викликаний намалювати слід сегмента; це малюється на фоні bg, а також на передньому плані og.

Метод drawsystem() може також викликати довільні методи спираючись на графіки об'єкт og, однак у цьому випадку координати повинні бути перетворені явно, наприклад og.drawRectangle(cx(left), cy(top), c.dx(right-left), c.dy(bot-top)).Методи cx() і cy() перетворити фізичні координати в екранні координати, а також методи c.dx() і c.dy() перетворити відмінності фізичних координат до перепадів екранні координати.Зазначимо, що у фізичній системі координат, вісь у направлена ??вгору.Перед викликом методу малювання og, правильний колір повинен бути встановлений з og.setColor(Global.fgcolor).

 недійсним drawsystem (Graphics О.Г., Графіка BG) {

подвійний х0 = д [0]; подвійний у0 = д [1]; подвійний x1 = x0 + l1 * Math.sin (д [2]); подвійний y1 = y0-l1 * Math.cos (д [2]);
recordTrace (BG, О. Г., x1, y1);
drawSpring (ОГ, 0,0 х0, у0, 15,0.2); DrawLine (OG, x0, y0, x1, y1);
drawMass (OG, x0, y0, rad0); drawMass (ОГ, x1, y1, rad1); }
Метод bounds() використовується для визначення розміру зображення, drawsystem() буде нічия.Вона повертає прямокутник фізичних координат, яка представляє верхню і нижню межі від координат використовуються методи малювання в drawsystem().Важливо, щоб цей прямокутник досить великий, щоб залучити не тільки поточний стан, а й майбутніх станів, які можуть виникнути у міру розвитку системи.Збереження енергії можна припустити, для цієї мети; повинні зміна енергії, метод bounds() викликається знову.Метод E() може бути викликаний для розрахунку поточної повної енергії системи.Результат повинен бути повернутий із заявою return new DoubleRectangle(left,bot,right,top).enlarge(.05), де enlarge() метод на прямокутник додає небагато місця по краях.
 DoubleRectangle кордону () {

подвійний L = L1 + l0 + Math.sqrt (кв. ((m0 + m1) * g/k0) +2 * l0 * (m0 + m1) * g/k0 +2 * m1 * g/k0 +2 * E () / k0); подвійний рав = (m0 + m1) * g/k0;
повернути новий DoubleRectangle (-л,-одно-L, L, рав-+ л) збільшити (0,05). }

Карти подій миші (опціонально)

Нарешті, метод mouseMap() карти (х, у)-координати внутрішніх координат для миші дію.Він повинен містити послідовність операторів виду map(i,v), що означає набір ю координату до значення v. У разі нашого пружинного маятника, визначення mouseMap() просто так:
 недійсним mouseMap (подвійне х двічі у) {

Карта (0, х); Карта (1, у); }
Це означає, що при натисканні мишею по координатах (х, у), то координата д 0 з динамічних систем фіксованого х і по координаті Q 1 кріпиться до y.Якби ми мали деякі інші механічні системи, де координата д 0 позначає певний кут, виміряний проти годинникової стрілки з півдня, ми б визначити
 недійсним mouseMap (подвійне х двічі у) {

Карта (0, Math.atan2 (х,-у)); }
Реалізація за замовчуванням mouseMap нічого не робить, так що, якщо він не перевизначений, то клацання миші і перетягує буде мати ніякого ефекту.Це завершує визначення класу SpringPendulum.

Інші модифікації Lagrange.java

Нарешті, необхідно змінити код основний клас Лагранжа, щоб він міг розпізнати механічної системи, яку ви тільки що визначили.Ви повинні додати код в двох наступних місцях:
. (У новому DoublePendulum ()) appendInfoVector (infov);


. (У новому DoubleSpring ()) appendInfoVector (infov);
. (У новому SpringPendulum ()) appendInfoVector (infov); / / *** Додати свої власні системи тут ***
...
якщо (type.equals ("doublependulum")) { mechsys = новий DoublePendulum (); } Інакше якщо (type.equals ("springpendulum")) { mechsys = новий SpringPendulum ();
} Інакше якщо (type.equals ("doublespring")) { mechsys = новий DoubleSpring (); / / *** Додати свої власні системи тут ***
От і все.Радійте, створивши власну механічних систем!

Published (Last edited): 29-08-2011 , source: http://www.mscs.dal.ca/~selinger/lagrange/mechsystem.html