Всем привет 👋 Давно я не писал статей, и это надо исправлять. Я решил рассказать о том, как я писал программу, рассчитывающую движение частиц, с какими проблемами я сталкивался, а также о том, что я потом делал с этой программой. Материала так много, что это будет целая серия статей.

💡 Идея

Начну я свой рассказ с того, как мне пришла эта идея. В 10 классе на уроках физики изучается молекулярно-кинетическая теория. В ней из определённых предположений о строении вещества получаются уравнения состояния для разных веществ, а также объяснения различных физических эффектов, которые наблюдаются на практике. Например, в начале изучения МКТ рассматривается идеальный газ. Эта модель строится на следующих предположениях:

  1. Газ состоит из частиц
  2. Эти частицы не взаимодействуют между собой (не сталкиваются и не взаимодействуют на расстоянии)
  3. Размерами частиц можно пренебречь
  4. Все взаимодействия со стенками абсолютно упругие
  5. Движение частиц подчиняется Ньютоновской механике

Из этих предположений выводится огромная теория, которая сходится с практикой при определённых условиях. Например, один из результатов МКТ:

Для идеального газа всегда выполняется 

Pasted Graphic.tiff

Здесь p - давление газа, V - объём, υ - количество вещества (в молях), R - универсальная газовая постоянная, T - температура в Кельвинах. Это называется уравнением Менделеева-Клайперона.

Но у теории, связанной с идеальным газом есть существенный недостаток - он слишком идеален. Если уходить из нормальных условий, то эти уравнения перестают выполняться.

И вот при изучении всего этого мне пришла идея написать программу, которая бы рассчитывала движение частиц, составляющих газ, или может даже жидкость, чтобы поставить несколько экспериментов (ставить эксперименты в реальном мире - это как-то скучновато).

🔭 Физика

В физике существует понятие потенциальной энергии. Потенциальная энергия - это в первую очередь характеристика состояния системы. Определяется она необычным образом: разность потенциальных энергий двух состояний системы равна работе, необходимой, чтобы систему перевести из одного состояния в другое. То есть нам неизвестно конкретное значение потенциальной энергии, а известна лишь разность этих значений. Для того, чтобы было удобно говорить о конкретном значении потенциальной энергии часто говорят, что на бесконечном удалении от системы потенциальная энергия равна 0. Рассмотрим для примера гравитационное взаимодействие. Пусть у нас есть тело массой m на расстоянии r от земли. Будем считать, что гравитационное поле везде однородно. Рассмотрим случай, когда тело перемещается с высоты h1 на высоту h2:

Pasted Graphic 22.tiff

Здесь U1 и U2 - потенциальные энергии в двух точках. Третий переход верен, ведь угол между векторами F и S - 0 градусов.

Заметим, что здесь мы не можем определить значения U1 и U2, а можем лишь узнать их разность. Давайте примем, что на высоте 0 потенциальная энергия равна 0. Пусть тогда h2 = 0. Получаем всем известную формулу:

Pasted Graphic 24.tiff

На самом деле, конечно, поле неоднородно, но в таком случае нужны вычисления пострашнее, но об этом как-нибудь потом.

Исследуя просторы интернета, можно найти некий потенциал Леннарда-Джонса. Выглядит он следующим образом:

Pasted Graphic 25.tiff

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

Для начала давайте немного изучим имеющуюся у нас формулу. В неё входят 2 константы: ε - глубина потенциальной ямы, а σ - расстояние, на котором энергия становится равна 0. Формула состоит из 2 основных слагаемых (те, которые в квадратных скобках):

Первое (входящее в формулу со знаком «+») отвечает за отталкивания между молекулами. Заметим, что при уменьшении расстояния потенциальная энергия взаимодействия растёт очень быстро (12 степень!). Это означает, что нам необходимо очень много энергии, чтобы подвести две молекулы очень близко (в данной модели).

Второе же слагаемое отвечает за силу притяжения между молекулами. Энергия здесь растёт медленнее, но на достаточных расстояниях это слагаемое вносит больший вклад, нежели первое.

Интересные вещи можно обнаружить, если посмотреть на график этого потенциала:

400px-12-6-lennard-jones-potential.png

Во-первых, здесь явно видна потенциальная яма. Если у нас будет система, состоящая из 2 частиц и изолированная от всех внешних источников энергии, то из-за закона сохранения энергии, если изначально энергии не будет хватать для выхода из этой потенциальной ямы, то частицы так и будут колебаться на определённом расстоянии, не выходя из этой ямы. 

Во-вторых, на этом графике хорошо видно наше предположение, что на бесконечном удалении потенциальная энергия равна 0.

Хорошо, у нас есть какая-то формула для потенциальной энергии, но как из неё получить силу взаимодействия двух молекул, так необходимую при моделировании? Есть очень простая связь потенциальной энергии и силы:

Pasted Graphic 26.tiff

Сила - это градиент потенциальной энергии, взятый с противоположным знаком. Если говорить неформальным языком, то градиент - это вектор, указывающий в сторону наибольшего возрастания функции. Если говорить формально, то градиент для трёхмерного пространства определяется как-то так:

Pasted Graphic 27.tiff

Здесь e… - это соответствующие единичные вектора.

Я сам очень плох в формальной части матанализа, но попробую привести здесь доказательство этого факта (для трёхмерного случая). Прошу знатоков матанализа меня исправить в комментариях:

Pasted Graphic 29.tiff

Получается, что, зная функцию потенциальной энергии, мы можем получить силу в любой точке!

Итак, рассмотрим наш потенциал Леннарда-Джонса. Это 1-мерный случай, поэтому, чтобы найти силу, достаточно взять производную с противоположным знаком. Вектор силы будет располагаться на прямой, соединяющей 2 молекулы.

Теперь у нас есть довольно простая формула для силы! Осталось только вспомнить второй закон Ньютона и уравнения движения.

Pasted Graphic 31.tiff

Теперь у нас есть все формулы, необходимые для расчёта движения молекул. Давайте возьмём какой-нибудь попавшийся под руку язык программирования и что-нибудь напишем.

🧑‍💻 Программирование

Под руку попался язык программирования C++ с графической библиотекой SFML. Программа здесь очень проста. Создадим класс, который будет хранить информацию о частице, затем каждый кадр будем производить следующие действия:

  1. Для каждой пары частиц рассчитываем силы по нашей формуле
  2. Рассчитав силы в каждой паре, находим ускорение, как равнодействующая сила, делённая на массу частицы
  3. К скорости прибавляем ускорение, умноженное на шаг времени
  4. К координате прибавляем скорость, умноженную на шаг времени

Эти простые действия позволяют нам рассчитывать положение частиц. Давайте для начала посмотрим, как будут вести себя 2 частицы, не обладающие энергией, достаточной для выхода из потенциальной ямы:

ezgif-5-228a27bf68.gif

Вроде бы всё в порядке, частицы колеблются, не улетают и не сближаются. Но что происходит с полной механической энергией? По закону сохранения энергии она не должна меняться:

Снимок экрана 2022-08-17 в 18.15.26.png

Синяя полоса - это значение энергии в нашей симуляции. Зелёная - рассчитанное значение энергии. Если бы всё работало правильно, зелёная и синяя полоса бы совпадали, но мы видим, что они явно не совпадают. Надо в этом разобраться. Давайте попробуем запустить симуляцию большего числа частиц:

ezgif-5-22a9b5bf48.gif

Вроде бы всё хорошо, но давайте посмотрим на график энергии. Обозначения те же.

Снимок экрана 2022-08-17 в 18.28.13.png

Теперь здесь явно что-то не так. Можно заметить, что сначала энергия моментально становится гораздо меньше, а потом резко возрастает и даже после этого меняется. А ведь эта величина должна быть постоянной. Здесь явно есть ошибка, но она кроется не в физике, и не в работе программы. Ошибка кроется в том, как мы рассчитываем новое положение частиц, зная силы, действующие на них. В следующей статье, которая выйдет ровно через 2 недели, я подробно расскажу о том, что это за проблема, что человечество сделало для решения этой проблемы, и после решу эту проблему. А пока что вы можете присылать в комментариях ваши догадки о природе данной проблемы. Спасибо за внимание!

📚 Литература



Симаков Михаил
14 сен 2022 г. 21:59

Вторая часть статьи уже вышла. Можете прочитать по ссылке: https://ftk-sut.ru/articles/456