Задача 5.
По книге Гулд
Тобочник
Компьютерное моделирование в физике сделай на
Processing
3 программу для моделирования задачи 6.2 "Потенциал межмолекулярного
взаимодействия"
Особенности:
-
Модель: Реализация
потенциала Леннард-Джонса: U(r) = 4ε[(σ/r)¹/² - (σ/r)6];
Расчет равновесного расстояния: r_eq = 2^(1/6)σ;
Визуализация ключевых точек (минимум, σ и др.).
-
Интерактивность: Слайдеры
для изменения параметров ε и σ; Кнопка сброса параметров; Автоматический
перерасчет графика при изменении параметров.
-
Визуализация: Отображение
осей с подписями; Особые точки выделены цветами; Подписи всех элементов;
Формула потенциала на графике; Отображение текущих параметров; Координаты
особых точек.
Использование:
-
Изменяйте параметры ε и σ с помощью слайдеров;
-
Наблюдайте как меняется форма потенциала;
-
Изучайте положение равновесной точки (красная
метка);
-
Используйте кнопку сброса для возврата к
стандартным параметрам.
Вид экрана
Программа: (скопируйте код в редактор Processing
и запустите на выполнение)
import controlP5.*;
ControlP5 cp5;
// Параметры потенциала Леннард-Джонса
float epsilon = 1.0; // Глубина потенциальной ямы
float sigma = 1.0; // Расстояние, где потенциал = 0
float r_min = 0.9; // Минимальное расстояние
float r_max = 3.0; // Максимальное расстояние
void setup() {
size(900, 600);
smooth();
// Настройка интерфейса
cp5 = new ControlP5(this);
// Слайдер для параметра ε (эпсилон)
cp5.addSlider("epsilon")
.setPosition(550, 30)
.setSize(200, 20)
.setRange(0.1, 5.0)
.setValue(1.0)
.setLabel("ε (Interaction energy)")
.setColorCaptionLabel(0);
// Слайдер для параметра σ (сигма)
cp5.addSlider("sigma")
.setPosition(550, 70)
.setSize(200, 20)
.setRange(0.5, 2.0)
.setValue(1.0)
.setLabel("σ (Characteristic distance)")
.setColorCaptionLabel(0);
// Кнопка сброса
cp5.addButton("reset")
.setPosition(550, 110)
.setSize(80, 30)
.setLabel("Reset")
.setColorCaptionLabel(0);
}
void draw() {
background(255);
// Отрисовка графика потенциала
drawPotentialGraph();
// Отображение информации
fill(0);
textSize(24);
text("Потенциал Леннард-Джонса: U(r) = 4ε[(σ/r)¹² - (σ/r)⁶]", 50, 560);
textSize(14);
text(String.format("Текущие параметры: ε = %.2f, σ = %.2f", epsilon, sigma),
550, 190);
}
void drawPotentialGraph() {
// Настройки области графика
int graphX = 100;
int graphY = 250;
int graphWidth = 700;
int graphHeight = 250;
// Оси
stroke(0);
strokeWeight(1);
line(graphX, graphY + graphHeight/2, graphX + graphWidth, graphY + graphHeight/2);
// Ось X
line(graphX, graphY, graphX, graphY + graphHeight); // Ось Y
// Подписи осей
fill(0);
textSize(14);
text("r", graphX + graphWidth + 10, graphY + graphHeight/2 + 5);
text("U(r)", graphX - 30, graphY + 10);
// Деления на оси X
for (float r = r_min; r <= r_max; r += 0.5) {
float x = graphX + map(r, r_min, r_max, 0, graphWidth);
line(x, graphY + graphHeight/2 - 5, x, graphY + graphHeight/2 + 5);
text(String.format("%.1f", r), x - 10, graphY + graphHeight/2 + 20);
}
// Деления на оси Y
for (float U = -2; U <= 2; U += 0.5) {
float y = graphY + graphHeight/2 - map(U, -2, 2, -graphHeight/2, graphHeight/2);
line(graphX - 5, y, graphX + 5, y);
text(String.format("%.1f", U), graphX - 40, y + 5);
}
// Расчет и отрисовка кривой потенциала
noFill();
stroke(0, 0, 255);
strokeWeight(2);
beginShape();
for (float r = r_min; r <= r_max; r += 0.01) {
float U = lennardJones(r);
float x = graphX + map(r, r_min, r_max, 0, graphWidth);
float y = graphY + graphHeight/2 - map(U, -2, 2, -graphHeight/2, graphHeight/2);
vertex(x, y);
}
endShape();
// Особые точки
float r_eq = pow(2, 1.0/6) * sigma; // Равновесное расстояние
float U_min = lennardJones(r_eq); // Минимальная энергия
drawSpecialPoint(r_eq, U_min, "Равновесие", color(255, 0, 0));
drawSpecialPoint(sigma, 0, "σ", color(0, 150, 0));
}
float lennardJones(float r) {
// Потенциал Леннард-Джонса
float term1 = pow(sigma/r, 12);
float term2 = pow(sigma/r, 6);
return 4 * epsilon * (term1 - term2);
}
void drawSpecialPoint(float r, float U, String label, color c) {
int graphX = 100;
int graphY = 250;
int graphWidth = 700;
int graphHeight = 250;
float x = graphX + map(r, r_min, r_max, 0, graphWidth);
float y = graphY + graphHeight/2 - map(U, -2, 2, -graphHeight/2, graphHeight/2);
fill(c);
noStroke();
ellipse(x, y, 8, 8);
fill(c);
textSize(12);
text(label, x + 10, y - 10);
text(String.format("(%.2f, %.2f)", r, U), x + 10, y + 5);
}
// Обработчик кнопки сброса
public void reset() {
epsilon = 1.0;
sigma = 1.0;
cp5.getController("epsilon").setValue(epsilon);
cp5.getController("sigma").setValue(sigma);
}
