MechSystem.Вихідний код аплету Лагранжа у файлі Lagrange.java.Саме тут окремі механічних систем, таких як SpringPendulum, визначені.Ви можете редагувати цей файл для реалізації інших механічних систем.Цей документ описує, як написати код, щоб зробити це. На щастя, зумовленого класу MechSystem вже реалізує всі криваві подробиці лагранжевої механіки і реальне моделювання.Щоб визначити свою власну механічну систему, вам потрібно тільки надати інформацію, яка описує фізику конкретної системи, що ви хочете, щоб імітувати.Є три групи методів, які повинні бути визначені:
В методи, які ви будете визначати, всі розрахунки проводяться в реальних фізичних одиницях, наприклад, метрах і кілограмах, а не в комп'ютері одиниць, таких, як пікселі.Відповідні перетворення в координати екрану і т.д. автоматично handeled від суперкласу MechSystem.Таким чином, вам тільки потрібно турбуватися про фізичні властивості механічної системи, яку ви визначаєте.
Нехай т 0 і 1 м бути внутрішньою і зовнішньою маси, відповідно.Нехай ? 0 і L 1-довжина внутрішньої і зовнішньої нозі, де L 0, довжина пружина в розслабленому стані.Нехай до 0-постійна пружини.Маса вимірюється в кілограмах, довжина в метрах, а навесні констант в Ньютон / метр.Крім того, нехай г = 9.81m / с 2 буде гравітаційна постійна.Система має три координати: х і у координати першої маса, вимірюється в метрах в системі координат, яка має точки опори, як його походження.Альфа кута зовнішньої ноги в радіанах проти годинникової стрілки від півдня.Ми число координат: • 0 = х, д 1 = Y, Q 2 = альфа.
Кінетичної і потенційної енергії пружинного маятника мають вигляд:
Клас 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): Якщо ви хочете, то можете перевизначити їх з методами, які обчислюють відповідні приватні похідні використанням точної формули, це буде трохи підвищити продуктивність.
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. . (У новому DoublePendulum ()) appendInfoVector (infov);От і все.Радійте, створивши власну механічних систем!
. (У новому DoubleSpring ()) appendInfoVector (infov);
. (У новому SpringPendulum ()) appendInfoVector (infov); / / *** Додати свої власні системи тут ***
...
якщо (type.equals ("doublependulum")) { mechsys = новий DoublePendulum (); } Інакше якщо (type.equals ("springpendulum")) { mechsys = новий SpringPendulum ();
} Інакше якщо (type.equals ("doublespring")) { mechsys = новий DoubleSpring (); / / *** Додати свої власні системи тут ***