КОМПЬЮТЕРНОЕ МОДЕЛИРОВАНИЕ ФИЗИЧЕСКИХ ПРОЦЕССОВ..


Советский район
МАОУ Гимназия №6 “Горностай”
Секция информатики
Седухин Олег Андреевич
11Ф класс, контактный телефон 332-00-62
КОМПЬЮТЕРНОЕ МОДЕЛИРОВАНИЕ ФИЗИЧЕСКИХ ПРОЦЕССОВ
НА МОЛЕКУЛЯРНОМ УРОВНЕ
Научный руководитель:

Семенов Аркадий Ремович Ведущий инженер-технолог
Лаборатории физической химии
конденсированных сред
ИНХ СО РАН
Контактный телефон: 316 58 35 
Новосибирск, 2012
Постановка задачи
Требуется смоделировать столкновение упругих шариков в замкнутом пространстве.
Структура программы
Программа написана на языке Java.
Основной класс – class World extends JFrame, в котором хранятся глобальные переменные, ArrayList шариков (класс Entity), выполняются расчеты и отрисовка.
Любая сущность (шарик или статичный объект) является экземпляром класса Entity. В нем находятся координаты и скорости тела по осям X и Y. В класс включены 2 метода: update() и move();
Время дискретно.
update():
Рассчитывает координаты и скорость тела через единицу времени (на основе текущих координат и скорости тела и информации о других телах вычисляет действующие со стороны других тел силы, н основе этих сил – следующие скорости по X и Y, на основе скоростей – следующие координаты.)
move():
Перемещает тело на новые координаты.
Класс World выполняет следующие действия:
Создает фрейм
Устанавливает переменные, создает шарики
Для всех шариков вызывает метод update()
Для всех шариков вызывает метод move()
Выполняет отрисовку с двойной буферизацией
Переходит к шагу 3;
Так же создается фрейм, где можно менять различные параметры.
Вот как это выглядит:

В данном случае между шариками действуют только силы эластичности с неким коэффициентом упругости. При запуске программы, шарики ведут себя вполне естественно – летают и соударяются. Однако затем они начинают самопроизвольно ускоряться.
Возможное объяснение этому факту приведено на рисунке:

a – реальная траектория тела, a’ – расчетная;
Поскольку за время dt быстро летящее тела может войти в препятствие глубже, чем надо, то его скорость в результате увеличитс.
Уменьшить этот эффект возможно уменьшением dt, или, что аналогично, уменьшением всех действующих сил. С уменьшением dt в N раз, отклонение от реальности уменьшатся в N2 раз.
Чтобы нейтрализовать это, метод update() каждый тик умножает скорость на некий множитель, например, 0.99. Тогда суммарная энергия системы стремится к какому-то значению (при множителе 1.0 система тоже не ускоряется до бесконечности, видимо, там вступают в силу другие эффекты). Данное воздействие похоже на силу сопротивления воздуха.
С помошью данной программы также возможно моделирование движение планет.
Если в систему добавить притяжение шариков, то получится подобие кристаллической решетки (плотная упаковка шаров); здесь уже можно моделировать физические эффекты вроде изменения агрегатного состояния или прохождения волн. На следующих скриншотах показаны конечные состояния системы при наличии гравитации и различных параметрах:

multiplier = 0.96;

multiplier = 0.98; (все еще модель твердого вещества, но тепловые колебания уже значительные)

multiplier = 0.985; (модель жидкости)

multiplier = 0.995; (модель газа)
Впрочем, стоит отметить наличие в данной системе различных переходных состояний, например, пульсирующего газа при multiplier = 0.99. Это связано, видимо, с тремя причинами –
во-первых, малым количеством атомов, во-вторых, сила взаимодействия слишком мало меняется с расстоянием (об этом ниже). В-третьих, на систему не оказывается внешнего давления.
В толстом слое шариков можно видеть увеличение давления снизу (при наличии вертикальной гравитации):

Следующий эффект, который можно смоделировать – это волны, однако при уменьшенном multiplier волны быстро затухают, а при увеличенном – система становится хаотичной, и трудно разглядеть бегущую волну. Для этого волна должна быть более сильной и бежать в более толстом слое.
Теперь отметим, что мы использовали сначала метод update() для всех шаров, а потом move(). Можно использовать update() и move() одновременно для каждого шара. При этом в целом тепловые колебания шаров уменьшаются. Однако вместо этого появляется иной эффект – от небольшого возмущения в среде распространяются ударные волны, полностью разрушающие структуру, а так же не сохраняется импульс системы.


Стоит отметить, что данный эффект не существует в реальности.
Еще одна возможность данной программы – наблюдать дефекты кристаллической решетки. Это может быть отсутстыие ячеек или взаимный поворот отдельных частей решетки. Такая система не обладает дальней упорядоченностью. Ниже приведены примеры.


В предыдущих примерах использовалась только сила отталкивания, зависящая линейно от расстояния, и сила притяжения, зависящая от расстояния квадратично. Однако, известно, что сила взаимодействия между атомами может быть описана так:
F= arn- brmГде n=7, m=13;
Однако, такие высокие степени замедляют работу программы, а кроме того, при небольшом изменении расстояния сила возрастает значительно, что усиляет эффект увеличения энергии со временем, и бороться с этим можно только уменьшая dt, что, в свою очередь, тоже замедляет алгоритм.
При этом, пользы от этого нет, т. к. устойчивое равновесие сил на определенном расстоянии все как присутствовало, так и присутствует, а практическое отсутствие силы притяжения между атомами на больших расстояниях нам ни к чему.
В завершение, можно смоделировать образование ионного кристалла из двух типов атомов. Однако, тут тоже есть проблема. Если установить силу отталкивания между одноименно зараженными атомами равной силе притяжения между разноименно заряженными атомами, то атомы собираются в пары или тройки, а образования кристалла не происходит. О причинах этого явления можно размышлять, а пока уменьшим силу отталкивания в несколько раз. Тогда происходит образование кристалла:

Программа написана в среде Eclipse Juno 4.2.
Приблизительное содержание класса Entity:
import java.util.ListIterator;
import java.util.Random;
class Entity {

//********parameters********************

double x,y,next_x,next_y;
double v_x,v_y,next_v_x,next_v_y;
double m,r;

World world;
public Entity(double x, double y, double v_x, double v_y, World world){
this.x=x;
this.y=y;
this.v_x=v_x;
this.v_y=v_y;
this.world = world;
}

public void update(){

next_v_x = v_x;
next_v_y = v_y;
next_x = x;
next_y = y;

double dx,dy,dr,deep;
double F2,F_elast,F_elast_x,F_elast_y,F,F_x,F_y;
ListIterator<Entity> itr = world.entities.listIterator();
while(itr.hasNext()) {
Entity e2=itr.next();
if(e2!=this){
dx = (e2.x-x);
dy = (e2.y-y);
if(dx == 0 && dy == 0){return;}
dr = Math.sqrt(dx*dx+dy*dy);
if(dr<(e2.r+r)){
deep = e2.r - dr + r;
F_elast = -deep * world.k_elast /10;
F_elast_x = F_elast * dx/dr;
F_elast_y = F_elast * dy/dr;
next_v_x += F_elast_x / m;
next_v_y += F_elast_y / m;
}
F=3*m*e2.m/dr/dr;
F_x = F * dx/dr;
F_y = F * dy/dr;
next_v_x += F_x / m;
next_v_y += F_y / m;
}
}
next_v_y += world.g_y;
next_v_x += world.g_x;

next_y += (v_y + next_v_y) / 2;
next_x += (v_x + next_v_x) / 2;
if(world.borders){
if(next_x<20+r){next_v_x=Math.abs(next_v_x);next_x=20+r;}
if(next_x>world.x-20-r){next_v_x=-Math.abs(next_v_x);next_x=world.x-20-r;}
if(next_y<20+r){next_v_y=Math.abs(next_v_y);next_y=20+r;}
if(next_y>world.y-20-r){next_v_y=-Math.abs(next_v_y);next_y=world.y-20-r;}
}
next_v_y *= world.v_y_multiplier;
next_v_x *= world.v_x_multiplier;
}

public void move(){
x=next_x;
y=next_y;
v_x=next_v_x;
v_y=next_v_y;
}
}
Некоторые методы класса World:
public World(String name, String params){
...
while(true){
paint(this.getGraphics());
if(q.pauseButton.isSelected()){continue;}
run();
}
}
void run(){
for(int i=0;i<loop;i++){
if(bug){
ListIterator<Entity> itrA = entities.listIterator();
while(itrA.hasNext()){
Entity e = itrA.next();
e.update();
e.move();
}
}
else{
ListIterator<Entity> itrA = entities.listIterator();
while(itrA.hasNext()){
itrA.next().update();
}
ListIterator<Entity> itrB = entities.listIterator();
while(itrB.hasNext()){
itrB.next().move();
}
}
}
}

Приложенные файлы

  • docx 8933692
    Размер файла: 1 MB Загрузок: 0

Добавить комментарий