Задача 5. По книге Гулд Тобочник Компьютерное моделирование в физике сделай на Processing 3 программу для моделирования задачи 6.2 "Потенциал межмолекулярного взаимодействия"

Особенности:

  1. Модель: Реализация потенциала Леннард-Джонса: U(r) = 4ε[(σ/r)¹/² - (σ/r)6]; Расчет равновесного расстояния: r_eq = 2^(1/6)σ; Визуализация ключевых точек (минимум, σ и др.).

  2. Интерактивность: Слайдеры для изменения параметров ε и σ;  Кнопка сброса параметров; Автоматический перерасчет графика при изменении параметров.

  3. Визуализация: Отображение осей с подписями; Особые точки выделены цветами; Подписи всех элементов; Формула потенциала на графике; Отображение текущих параметров; Координаты особых точек.

Использование:

  1. Изменяйте параметры ε и σ с помощью слайдеров;

  2. Наблюдайте как меняется форма потенциала;

  3. Изучайте положение равновесной точки (красная метка);

  4. Используйте кнопку сброса для возврата к стандартным параметрам.

Вид экрана

Программа: (скопируйте код в редактор 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);
}

 

 

 

Free Web Hosting