Потенциал Ми — различия между версиями
Денис (обсуждение | вклад) |
|||
(не показано 20 промежуточных версий 3 участников) | |||
Строка 1: | Строка 1: | ||
[[ТМ|Кафедра ТМ]] > [[Научный справочник]] > [[Потенциалы взаимодействия]] > [[Парные силовые потенциалы взаимодействия | Парные силовые]] > [[Потенциал Ми | Ми]]<HR> | [[ТМ|Кафедра ТМ]] > [[Научный справочник]] > [[Потенциалы взаимодействия]] > [[Парные силовые потенциалы взаимодействия | Парные силовые]] > [[Потенциал Ми | Ми]]<HR> | ||
+ | |||
Парный силовой потенциал взаимодействия. | Парный силовой потенциал взаимодействия. | ||
Определяется формулой: | Определяется формулой: | ||
− | + | ::<math> | |
− | <math> | ||
\varPi(r) = | \varPi(r) = | ||
\frac{D}{n-m} | \frac{D}{n-m} | ||
Строка 11: | Строка 11: | ||
где | где | ||
− | * <math>D</math> | + | * <math>D</math> — энергия связи, |
− | * <math>a</math> | + | * <math>a</math> — длина связи, |
− | * <math>m < n</math> | + | * <math>m</math>, <math>n</math> — безразмерные параметры взаимодействия. |
+ | |||
+ | Потенциал имеет два независимых безразмерных параметра. Частным случаем потенциала Ми при <math>m=6</math>, <math>n=12</math> является [[потенциал Леннард-Джонса]]. | ||
− | + | Сила, соответствующая потенциалу Ми, вычисляется по формуле | |
+ | ::<math> | ||
+ | F(r) = \frac{mn}{m-n}\,\frac{D}{a}\left[\left(\frac{a}{r}\right)^{n+1} - \left(\frac{a}{r}\right)^{m+1}\right]. | ||
+ | </math> | ||
− | + | Для потенциала Ми жесткость связи, критическая длина связи и прочность связи, соответственно, равны | |
+ | ::<math> | ||
+ | C = \varPi''(a) = mn\,\frac{D}{a^2}, \qquad b = \sqrt[n-m]{\frac{n+1}{m+1}}\,a, \qquad P = |F(b)| = mn\sqrt[n-m]{\frac{(m+1)^{m+1}}{(n+1)^{n+1}}}\,\frac{D}{a}. | ||
+ | </math> | ||
− | == | + | Сравнение взаимодействия Ми с взаимодействием [[Потенциал Морзе|Морзе]] и [[Потенциал Леннард-Джонса|Леннард-Джонса]] приведено на интерактивных графиках ниже. Показана зависимость от расстояния потенциала <math>\varPi</math> и силы <math>F</math>. Сравнение проведено при одинаковых значениях энергии связи <math>D</math> и длины связи <math>a</math>. Перемещение слайдера позволяет проследить влияние безразмерных параметров потенциалов, при этом энергия связи <math>D</math> и длина связи <math>a</math> остаются неизменными. Значения критической длины связи <math>b</math> и прочности связи <math>P</math>, отмеченные на графиках, соответствуют потенциалу Леннард-Джонса. |
+ | |||
+ | <htmlet nocache="yes">Krivtsov/Mie_TM</htmlet> | ||
+ | |||
+ | Чекбоксы под слайдерами позволяют установить или удалить связь между параметрами. В частности, можно убедиться, что при <math>\alpha a = \sqrt{\frac{nm}2}</math> взаимодействия Ми и Морзе близки — в этом случае для них совпадает жесткость связи <math>C = \varPi''(a)</math>. | ||
+ | |||
+ | <div class="mw-collapsible mw-collapsed" style="width:100%" > | ||
+ | '''Текст программы построения графиков на языке JavaScript:''' <div class="mw-collapsible-content"> | ||
+ | Файл '''"Mie.js"''' | ||
+ | <syntaxhighlight lang="javascript" line start="1" enclose="div"> | ||
+ | // Сравнение взаимодействий Леннард-Джонса, Ми и Морзе | ||
+ | // Разработчики А.М. Кривцов и Д.В. Цветков | ||
+ | // 06.05.2014 | ||
+ | // 15.05.2014 коррекция для совместимости с Google Chrome | ||
+ | // 06.11.2014 коррекция - удаление const (Цветков) | ||
+ | // Интернет: tm.spbstu.ru/Mie | ||
+ | |||
+ | function MainMie(canvas_1, canvas_2) { | ||
+ | |||
+ | // Предварительные установки | ||
+ | |||
+ | var X_max = canvas_1.width; | ||
+ | var Y_max = canvas_1.height; | ||
+ | |||
+ | // Размерные параметры | ||
+ | |||
+ | var a = 1.; // длина связи | ||
+ | var D = 1.; // энергия связи | ||
+ | |||
+ | // Расчет параметров взаимодействия | ||
+ | |||
+ | var b = a * Math.pow(13./7, 1./6); // положение минимума силы Леннард-Джонса (= 1.1086834 a) | ||
+ | var b2 = b * b; | ||
+ | var P0 = 12 * D / a; // коэффициент в выражении для силы Леннард-Джонса | ||
+ | var P = 42. / 169 * P0 / b; // модуль минимума силы Леннард-Джонса | ||
+ | |||
+ | // Задаваемые параметры | ||
+ | |||
+ | var m = 6; // параметр взаимодействия Ми | ||
+ | var n = 12; // параметр взаимодействия Ми | ||
+ | var kappa = 6; // параметр взаимодействия Морзе | ||
+ | |||
+ | // Область построения графика | ||
+ | var x_min = 0.3 * a; | ||
+ | var x_max = 2.5 * a; | ||
+ | var y_min_1 = -1.5 * D; | ||
+ | var y_min_2 = -1.5 * P; | ||
+ | |||
+ | var y_max_1 = -y_min_1; | ||
+ | var y_max_2 = -y_min_2; | ||
+ | |||
+ | var N = X_max; // число точек по оси x | ||
+ | var dx = x_max / N; // шаг по оси x | ||
+ | var sx = X_max / x_max; // масштаб по оси x | ||
+ | |||
+ | var y_min; | ||
+ | var y_max; | ||
+ | var sy; // масштаб по оси y | ||
+ | var Y0; // положение 0 оси y в экранных координатах | ||
+ | var context; // на context происходит рисование | ||
+ | |||
+ | // Установка флажков чекбоксов | ||
+ | var LJ_flag = true; | ||
+ | var Mie_flag = true; | ||
+ | var Morse_flag = true; | ||
+ | var nm_flag = false; | ||
+ | var n2m_flag = false; | ||
+ | var kappa_flag = false; | ||
+ | |||
+ | // настройка слайдеров и текстовых полей | ||
+ | Slider_01.min = 2; | ||
+ | Slider_01.max = 18; | ||
+ | Slider_01.step = 0.1; | ||
+ | Slider_01.value = m; // значение ползунка должно задаваться после min, max и step | ||
+ | Text_01.value = m; | ||
+ | Slider_02.min = Slider_01.min; | ||
+ | Slider_02.max = Slider_01.max; | ||
+ | Slider_02.step = Slider_01.step; | ||
+ | Slider_02.value = n; | ||
+ | Text_02.value = n; | ||
+ | Slider_03.min = Slider_01.min; | ||
+ | Slider_03.max = Slider_01.max; | ||
+ | Slider_03.step = Slider_01.step; | ||
+ | Slider_03.value = kappa; | ||
+ | Text_03.value = kappa; | ||
+ | |||
+ | draw(); | ||
+ | |||
+ | // функция, запускающаяся при перемещении слайдера | ||
+ | this.set_01 = function(input) { m = Number(input); draw(); } | ||
+ | this.set_02 = function(input) { n = Number(input); nm_flag = n2m_flag = false; draw(); } | ||
+ | this.set_03 = function(input) { kappa = Number(input); kappa_flag = false; draw(); } | ||
+ | |||
+ | // Функции, запускающиеся при изменении элементов управления | ||
+ | this.setCheckbox_01 = function(bool) {LJ_flag = bool; draw(); } | ||
+ | this.setCheckbox_02 = function(bool) {Mie_flag = bool; draw(); } | ||
+ | this.setCheckbox_03 = function(bool) {Morse_flag = bool; draw(); } | ||
+ | this.setCheckbox_04 = function(bool) {nm_flag = bool; if(!bool) return; n2m_flag = false; draw(); } | ||
+ | this.setCheckbox_05 = function(bool) {n2m_flag = bool; if(!bool) return; nm_flag = false; draw(); } | ||
+ | this.setCheckbox_06 = function(bool) {kappa_flag = bool; if(!bool) return; draw(); } | ||
+ | |||
+ | function set_n(value) { n = value; Slider_02.value = n; Text_02.value = n; } | ||
+ | function set_kappa(value) { kappa = value; Slider_03.value = kappa; Text_03.value = kappa; } | ||
+ | |||
+ | // Отображение | ||
+ | |||
+ | function draw() | ||
+ | { | ||
+ | if (nm_flag) set_n(m); | ||
+ | if (n2m_flag) set_n(2 * m); | ||
+ | if (kappa_flag) set_kappa(Math.sqrt(m * n / 2)); | ||
+ | |||
+ | checkbox_04.checked = nm_flag; | ||
+ | checkbox_05.checked = n2m_flag; | ||
+ | checkbox_06.checked = kappa_flag; | ||
+ | |||
+ | draw_1(); | ||
+ | draw_2(); | ||
+ | } | ||
+ | |||
+ | function draw_1() | ||
+ | { | ||
+ | // Расчет параметров графики | ||
+ | |||
+ | y_min = y_min_1; | ||
+ | y_max = y_max_1; | ||
+ | |||
+ | sy = Y_max / (y_max - y_min); // масштаб по оси y | ||
+ | Y0 = Y_max + y_min * sy; // положение 0 оси y в экранных координатах | ||
+ | |||
+ | context = canvas_1.getContext("2d"); // на context происходит рисование | ||
+ | |||
+ | context.clearRect(0, 0, X_max, Y_max); // очистить экран | ||
+ | |||
+ | // Горизонтальная ось | ||
+ | context.strokeStyle = 'lightgrey'; | ||
+ | context.beginPath(); | ||
+ | context.moveTo(0, Y0); | ||
+ | context.lineTo(X_max, Y0); | ||
+ | context.stroke(); | ||
+ | |||
+ | // Пунктирные линии | ||
+ | context.beginPath(); | ||
+ | context.setLineDash([5]); | ||
+ | context.moveTo(a * sx, Y0); | ||
+ | context.lineTo(a * sx, Y0 + D * sy); | ||
+ | context.lineTo(0, Y0 + D * sy); | ||
+ | context.stroke(); | ||
+ | context.setLineDash([0]); | ||
+ | |||
+ | // Надписи | ||
+ | context.fillStyle = 'black'; | ||
+ | context.font = "italic 20px Times" | ||
+ | context.fillText("r", x_max * sx - 15, Y0 - 7); | ||
+ | context.fillText("Π", 5, 20); | ||
+ | context.fillText("0", 3, Y0 - 3); | ||
+ | context.fillStyle = 'grey'; | ||
+ | context.fillText("a", a * sx - 5, Y0 - 3); | ||
+ | context.fillText("-D", 3, Y0 + D * sy - 5); | ||
+ | |||
+ | // Графики потенциалов | ||
+ | Graph(U_LJ, LJ_flag, 'grey'); | ||
+ | Graph(U_Mie, Mie_flag, 'blue'); | ||
+ | Graph(U_Morse, Morse_flag, 'magenta'); | ||
+ | } | ||
+ | |||
+ | function draw_2() | ||
+ | { | ||
+ | // Расчет параметров графики | ||
+ | |||
+ | y_min = y_min_2; | ||
+ | y_max = y_max_2; | ||
+ | |||
+ | sy = Y_max / (y_max - y_min); // масштаб по оси y | ||
+ | Y0 = Y_max + y_min * sy; // положение 0 оси y в экранных координатах | ||
+ | |||
+ | context = canvas_2.getContext("2d"); // на context происходит рисование | ||
+ | |||
+ | context.clearRect(0, 0, X_max, Y_max); // очистить экран | ||
+ | |||
+ | // Горизонтальная ось | ||
+ | context.strokeStyle = 'lightgrey'; | ||
+ | context.beginPath(); | ||
+ | context.moveTo(0, Y0); | ||
+ | context.lineTo(X_max, Y0); | ||
+ | context.stroke(); | ||
+ | |||
+ | // Пунктирные линии | ||
+ | context.beginPath(); | ||
+ | context.setLineDash([5]); | ||
+ | context.moveTo(b * sx, Y0); | ||
+ | context.lineTo(b * sx, Y0 + P * sy); | ||
+ | context.lineTo(0, Y0 + P * sy); | ||
+ | context.stroke(); | ||
+ | context.setLineDash([0]); | ||
+ | |||
+ | // Надписи | ||
+ | context.fillStyle = 'black'; | ||
+ | context.font = "italic 20px Times"; | ||
+ | context.fillText("r", x_max * sx - 15, Y0 - 7); | ||
+ | context.fillText("F", 5, 20); | ||
+ | context.fillText("0", 3, Y0 - 3); | ||
+ | context.fillStyle = 'grey'; | ||
+ | context.fillText("a", a * sx + 3, Y0 - 3); | ||
+ | context.fillText("b", b * sx - 3, Y0 - 3); | ||
+ | context.fillText("-P", 3, Y0 + P * sy - 5); | ||
+ | |||
+ | // Графики сил | ||
+ | Graph(F_LJ, LJ_flag, 'grey'); | ||
+ | Graph(F_Mie, Mie_flag, 'blue'); | ||
+ | Graph(F_Morse, Morse_flag, 'magenta'); | ||
+ | } | ||
+ | |||
+ | // Построение графика функции | ||
+ | |||
+ | function Graph(F, flag, color) | ||
+ | { | ||
+ | if (!flag) return; | ||
+ | |||
+ | context.strokeStyle = color; | ||
+ | context.beginPath(); | ||
+ | for (var x = x_min; x < x_max; x+=dx) | ||
+ | { | ||
+ | var y = F(x); | ||
+ | var X = x * sx; | ||
+ | var Y = Y0 - y * sy; | ||
+ | |||
+ | // if (x == x_min) context.moveTo(X, Y); // Не требуется? | ||
+ | if (Y > -Y_max) context.lineTo(X, Y); // Отключение графики сильно выходящей за границы области | ||
+ | } | ||
+ | context.stroke(); | ||
+ | } | ||
+ | |||
+ | // Потенциал Ми | ||
+ | |||
+ | function U_Mie(r) | ||
+ | { | ||
+ | var s = a / r; | ||
+ | // return D / (n - m) * (m * Math.pow(s, n) - n * Math.pow(s, m)); | ||
+ | var n1 = n + 0.00001; // для обработки случая m = n | ||
+ | return D / (n1 - m) * (m * Math.pow(s, n1) - n1 * Math.pow(s, m)); | ||
+ | } | ||
+ | |||
+ | // Сила Ми | ||
+ | |||
+ | function F_Mie(r) | ||
+ | { | ||
+ | var s = a / r; | ||
+ | // return n * m / (n - m) * D / a * (Math.pow(s, n + 1) - Math.pow(s, m + 1)); | ||
+ | var n1 = n + 0.00001; // для обработки случая m = n | ||
+ | return n1 * m / (n1 - m) * D / a * (Math.pow(s, n1 + 1) - Math.pow(s, m + 1)); | ||
+ | } | ||
+ | |||
+ | // Потенциал Морзе | ||
+ | |||
+ | function U_Morse(r) | ||
+ | { | ||
+ | var al = kappa / a; | ||
+ | var s = Math.exp(al * (a - r)); | ||
+ | return D * s * (s - 2); | ||
+ | } | ||
+ | |||
+ | // Сила Морзе | ||
+ | |||
+ | function F_Morse(r) | ||
+ | { | ||
+ | var al = kappa / a; | ||
+ | var s = Math.exp(al * (a - r)); | ||
+ | return 2 * al * D * s * (s - 1); | ||
+ | } | ||
+ | |||
+ | // Потенциал Леннард-Джонса | ||
+ | |||
+ | function U_LJ(r) | ||
+ | { | ||
+ | var s2 = 1 / (r * r); | ||
+ | var s6 = s2 * s2 * s2; | ||
+ | return D * s6 * (s6 - 2); | ||
+ | } | ||
+ | |||
+ | // Сила Леннард-Джонса | ||
+ | |||
+ | function F_LJ(r) | ||
+ | { | ||
+ | var s2 = 1 / (r * r); | ||
+ | var s4 = s2 * s2; | ||
+ | return P0 * s4 * s4 * (s4 * s2 - 1) * r; | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | Файл '''"MLJ.html"''' | ||
+ | <syntaxhighlight lang="html5" line start="1" enclose="div"> | ||
+ | <!DOCTYPE html> | ||
+ | <html> | ||
+ | <head> | ||
+ | <meta charset="UTF-8" /> | ||
+ | <title>LJ, Mie & Morse Interaction</title> | ||
+ | <script src="Mie.js"></script> | ||
+ | </head> | ||
+ | <body> | ||
+ | <canvas id="canvasGraph_1" width="800" height="300" style="border:1px solid #000000;"></canvas> | ||
+ | <canvas id="canvasGraph_2" width="800" height="300" style="border:1px solid #000000;"></canvas> | ||
+ | |||
+ | <!--Выбор графика (чекбоксы)--> | ||
+ | <div> | ||
+ | Взаимодействие: | ||
+ | <font color="#000000" size="5"><B>—</B></font> | ||
+ | <input type="checkbox" id="checkbox_01" name="" onchange="app.setCheckbox_01(this.checked);" checked/>Леннард-Джонса, | ||
+ | <font color="#0000ff" size="5"><B>—</B></font> | ||
+ | <input type="checkbox" id="checkbox_02" name="" onchange="app.setCheckbox_02(this.checked);" checked/>Ми, | ||
+ | <font color="#ff00ff" size="5"><B>—</B></font> | ||
+ | <input type="checkbox" id="checkbox_03" name="" onchange="app.setCheckbox_03(this.checked);" checked/>Морзе | ||
+ | </div> | ||
+ | |||
+ | <!--Установка параметров взаимодействия (текстовые поля и слайдеры)--> | ||
+ | <div>Ми: | ||
+ | <font face= "Times New Roman"><I> | ||
+ | m = <input id="Text_01" style="width: 4.2ex;" required pattern="[-+]?([0-9]*\.[0-9]+|[0-9]+)" oninput=" | ||
+ | // если введено не число - строка не пройдет валидацию по паттерну выше, и checkValidity() вернет false | ||
+ | if (!this.checkValidity()) return; | ||
+ | app.set_01(this.value); | ||
+ | document.getElementById('Slider_01').value = this.value; | ||
+ | "> | ||
+ | <input type="range" id="Slider_01" style="width: 100px;" oninput="app.set_01(this.value); document.getElementById('Text_01').value = this.value;"> | ||
+ | n = <input id="Text_02" style="width: 4.2ex;" required pattern="[-+]?([0-9]*\.[0-9]+|[0-9]+)" oninput=" | ||
+ | if (!this.checkValidity()) return; | ||
+ | app.set_02(this.value); | ||
+ | document.getElementById('Slider_02').value = this.value; | ||
+ | "> | ||
+ | <input type="range" id="Slider_02" style="width: 100px;" oninput="app.set_02(this.value); document.getElementById('Text_02').value = this.value;"> | ||
+ | </I></font> | ||
+ | Морзе: | ||
+ | <font face= "Times New Roman"><I> | ||
+ | αa = | ||
+ | <input id="Text_03" style="width: 4.2ex;" required pattern="[-+]?([0-9]*\.[0-9]+|[0-9]+)" oninput=" | ||
+ | if (!this.checkValidity()) return; | ||
+ | app.set_03(this.value); | ||
+ | document.getElementById('Slider_03').value = this.value; | ||
+ | "> | ||
+ | <input type="range" id="Slider_03" style="width: 100px;" oninput="app.set_03(this.value); document.getElementById('Text_03').value = this.value;"> | ||
+ | </I></font> | ||
+ | </div> | ||
+ | |||
+ | <!--Задание связей (чекбоксы)--> | ||
+ | <div> | ||
+ | Связь между параметрами:<font face= "Times New Roman"><I> | ||
+ | <input type="checkbox" id="checkbox_04" name="" onchange="app.setCheckbox_04(this.checked);" unchecked/>n = m, | ||
+ | <input type="checkbox" id="checkbox_05" name="" onchange="app.setCheckbox_05(this.checked);" unchecked/>n = 2m, | ||
+ | <input type="checkbox" id="checkbox_06" name="" onchange="app.setCheckbox_06(this.checked);" unchecked/>(αa)<SUP>2</SUP> = nm/2 | ||
+ | </I></font> | ||
+ | </div> | ||
+ | |||
+ | <script type="text/javascript">var app = new MainMie( | ||
+ | document.getElementById('canvasGraph_1'), | ||
+ | document.getElementById('canvasGraph_2') | ||
+ | );</script> | ||
+ | |||
+ | </body> | ||
+ | </html> | ||
+ | </syntaxhighlight> | ||
+ | </div> | ||
+ | </div> | ||
+ | |||
+ | == См. также == | ||
+ | * [[Потенциал Леннард-Джонса]] | ||
+ | * [[Потенциал Морзе]] | ||
* [[Парные силовые потенциалы взаимодействия]] | * [[Парные силовые потенциалы взаимодействия]] | ||
− | |||
− | |||
[[Category: Потенциальные взаимодействия|Ми]] | [[Category: Потенциальные взаимодействия|Ми]] | ||
+ | [[Category: Виртуальная лаборатория]] |
Текущая версия на 09:11, 11 марта 2015
Кафедра ТМ > Научный справочник > Потенциалы взаимодействия > Парные силовые > Ми
Парный силовой потенциал взаимодействия.
Определяется формулой:
где
- — энергия связи,
- — длина связи,
- , — безразмерные параметры взаимодействия.
Потенциал имеет два независимых безразмерных параметра. Частным случаем потенциала Ми при потенциал Леннард-Джонса.
, являетсяСила, соответствующая потенциалу Ми, вычисляется по формуле
Для потенциала Ми жесткость связи, критическая длина связи и прочность связи, соответственно, равны
Сравнение взаимодействия Ми с взаимодействием Морзе и Леннард-Джонса приведено на интерактивных графиках ниже. Показана зависимость от расстояния потенциала и силы . Сравнение проведено при одинаковых значениях энергии связи и длины связи . Перемещение слайдера позволяет проследить влияние безразмерных параметров потенциалов, при этом энергия связи и длина связи остаются неизменными. Значения критической длины связи и прочности связи , отмеченные на графиках, соответствуют потенциалу Леннард-Джонса.
Чекбоксы под слайдерами позволяют установить или удалить связь между параметрами. В частности, можно убедиться, что при
взаимодействия Ми и Морзе близки — в этом случае для них совпадает жесткость связи .Файл "Mie.js"
1 // Сравнение взаимодействий Леннард-Джонса, Ми и Морзе
2 // Разработчики А.М. Кривцов и Д.В. Цветков
3 // 06.05.2014
4 // 15.05.2014 коррекция для совместимости с Google Chrome
5 // 06.11.2014 коррекция - удаление const (Цветков)
6 // Интернет: tm.spbstu.ru/Mie
7
8 function MainMie(canvas_1, canvas_2) {
9
10 // Предварительные установки
11
12 var X_max = canvas_1.width;
13 var Y_max = canvas_1.height;
14
15 // Размерные параметры
16
17 var a = 1.; // длина связи
18 var D = 1.; // энергия связи
19
20 // Расчет параметров взаимодействия
21
22 var b = a * Math.pow(13./7, 1./6); // положение минимума силы Леннард-Джонса (= 1.1086834 a)
23 var b2 = b * b;
24 var P0 = 12 * D / a; // коэффициент в выражении для силы Леннард-Джонса
25 var P = 42. / 169 * P0 / b; // модуль минимума силы Леннард-Джонса
26
27 // Задаваемые параметры
28
29 var m = 6; // параметр взаимодействия Ми
30 var n = 12; // параметр взаимодействия Ми
31 var kappa = 6; // параметр взаимодействия Морзе
32
33 // Область построения графика
34 var x_min = 0.3 * a;
35 var x_max = 2.5 * a;
36 var y_min_1 = -1.5 * D;
37 var y_min_2 = -1.5 * P;
38
39 var y_max_1 = -y_min_1;
40 var y_max_2 = -y_min_2;
41
42 var N = X_max; // число точек по оси x
43 var dx = x_max / N; // шаг по оси x
44 var sx = X_max / x_max; // масштаб по оси x
45
46 var y_min;
47 var y_max;
48 var sy; // масштаб по оси y
49 var Y0; // положение 0 оси y в экранных координатах
50 var context; // на context происходит рисование
51
52 // Установка флажков чекбоксов
53 var LJ_flag = true;
54 var Mie_flag = true;
55 var Morse_flag = true;
56 var nm_flag = false;
57 var n2m_flag = false;
58 var kappa_flag = false;
59
60 // настройка слайдеров и текстовых полей
61 Slider_01.min = 2;
62 Slider_01.max = 18;
63 Slider_01.step = 0.1;
64 Slider_01.value = m; // значение ползунка должно задаваться после min, max и step
65 Text_01.value = m;
66 Slider_02.min = Slider_01.min;
67 Slider_02.max = Slider_01.max;
68 Slider_02.step = Slider_01.step;
69 Slider_02.value = n;
70 Text_02.value = n;
71 Slider_03.min = Slider_01.min;
72 Slider_03.max = Slider_01.max;
73 Slider_03.step = Slider_01.step;
74 Slider_03.value = kappa;
75 Text_03.value = kappa;
76
77 draw();
78
79 // функция, запускающаяся при перемещении слайдера
80 this.set_01 = function(input) { m = Number(input); draw(); }
81 this.set_02 = function(input) { n = Number(input); nm_flag = n2m_flag = false; draw(); }
82 this.set_03 = function(input) { kappa = Number(input); kappa_flag = false; draw(); }
83
84 // Функции, запускающиеся при изменении элементов управления
85 this.setCheckbox_01 = function(bool) {LJ_flag = bool; draw(); }
86 this.setCheckbox_02 = function(bool) {Mie_flag = bool; draw(); }
87 this.setCheckbox_03 = function(bool) {Morse_flag = bool; draw(); }
88 this.setCheckbox_04 = function(bool) {nm_flag = bool; if(!bool) return; n2m_flag = false; draw(); }
89 this.setCheckbox_05 = function(bool) {n2m_flag = bool; if(!bool) return; nm_flag = false; draw(); }
90 this.setCheckbox_06 = function(bool) {kappa_flag = bool; if(!bool) return; draw(); }
91
92 function set_n(value) { n = value; Slider_02.value = n; Text_02.value = n; }
93 function set_kappa(value) { kappa = value; Slider_03.value = kappa; Text_03.value = kappa; }
94
95 // Отображение
96
97 function draw()
98 {
99 if (nm_flag) set_n(m);
100 if (n2m_flag) set_n(2 * m);
101 if (kappa_flag) set_kappa(Math.sqrt(m * n / 2));
102
103 checkbox_04.checked = nm_flag;
104 checkbox_05.checked = n2m_flag;
105 checkbox_06.checked = kappa_flag;
106
107 draw_1();
108 draw_2();
109 }
110
111 function draw_1()
112 {
113 // Расчет параметров графики
114
115 y_min = y_min_1;
116 y_max = y_max_1;
117
118 sy = Y_max / (y_max - y_min); // масштаб по оси y
119 Y0 = Y_max + y_min * sy; // положение 0 оси y в экранных координатах
120
121 context = canvas_1.getContext("2d"); // на context происходит рисование
122
123 context.clearRect(0, 0, X_max, Y_max); // очистить экран
124
125 // Горизонтальная ось
126 context.strokeStyle = 'lightgrey';
127 context.beginPath();
128 context.moveTo(0, Y0);
129 context.lineTo(X_max, Y0);
130 context.stroke();
131
132 // Пунктирные линии
133 context.beginPath();
134 context.setLineDash([5]);
135 context.moveTo(a * sx, Y0);
136 context.lineTo(a * sx, Y0 + D * sy);
137 context.lineTo(0, Y0 + D * sy);
138 context.stroke();
139 context.setLineDash([0]);
140
141 // Надписи
142 context.fillStyle = 'black';
143 context.font = "italic 20px Times"
144 context.fillText("r", x_max * sx - 15, Y0 - 7);
145 context.fillText("Π", 5, 20);
146 context.fillText("0", 3, Y0 - 3);
147 context.fillStyle = 'grey';
148 context.fillText("a", a * sx - 5, Y0 - 3);
149 context.fillText("-D", 3, Y0 + D * sy - 5);
150
151 // Графики потенциалов
152 Graph(U_LJ, LJ_flag, 'grey');
153 Graph(U_Mie, Mie_flag, 'blue');
154 Graph(U_Morse, Morse_flag, 'magenta');
155 }
156
157 function draw_2()
158 {
159 // Расчет параметров графики
160
161 y_min = y_min_2;
162 y_max = y_max_2;
163
164 sy = Y_max / (y_max - y_min); // масштаб по оси y
165 Y0 = Y_max + y_min * sy; // положение 0 оси y в экранных координатах
166
167 context = canvas_2.getContext("2d"); // на context происходит рисование
168
169 context.clearRect(0, 0, X_max, Y_max); // очистить экран
170
171 // Горизонтальная ось
172 context.strokeStyle = 'lightgrey';
173 context.beginPath();
174 context.moveTo(0, Y0);
175 context.lineTo(X_max, Y0);
176 context.stroke();
177
178 // Пунктирные линии
179 context.beginPath();
180 context.setLineDash([5]);
181 context.moveTo(b * sx, Y0);
182 context.lineTo(b * sx, Y0 + P * sy);
183 context.lineTo(0, Y0 + P * sy);
184 context.stroke();
185 context.setLineDash([0]);
186
187 // Надписи
188 context.fillStyle = 'black';
189 context.font = "italic 20px Times";
190 context.fillText("r", x_max * sx - 15, Y0 - 7);
191 context.fillText("F", 5, 20);
192 context.fillText("0", 3, Y0 - 3);
193 context.fillStyle = 'grey';
194 context.fillText("a", a * sx + 3, Y0 - 3);
195 context.fillText("b", b * sx - 3, Y0 - 3);
196 context.fillText("-P", 3, Y0 + P * sy - 5);
197
198 // Графики сил
199 Graph(F_LJ, LJ_flag, 'grey');
200 Graph(F_Mie, Mie_flag, 'blue');
201 Graph(F_Morse, Morse_flag, 'magenta');
202 }
203
204 // Построение графика функции
205
206 function Graph(F, flag, color)
207 {
208 if (!flag) return;
209
210 context.strokeStyle = color;
211 context.beginPath();
212 for (var x = x_min; x < x_max; x+=dx)
213 {
214 var y = F(x);
215 var X = x * sx;
216 var Y = Y0 - y * sy;
217
218 // if (x == x_min) context.moveTo(X, Y); // Не требуется?
219 if (Y > -Y_max) context.lineTo(X, Y); // Отключение графики сильно выходящей за границы области
220 }
221 context.stroke();
222 }
223
224 // Потенциал Ми
225
226 function U_Mie(r)
227 {
228 var s = a / r;
229 // return D / (n - m) * (m * Math.pow(s, n) - n * Math.pow(s, m));
230 var n1 = n + 0.00001; // для обработки случая m = n
231 return D / (n1 - m) * (m * Math.pow(s, n1) - n1 * Math.pow(s, m));
232 }
233
234 // Сила Ми
235
236 function F_Mie(r)
237 {
238 var s = a / r;
239 // return n * m / (n - m) * D / a * (Math.pow(s, n + 1) - Math.pow(s, m + 1));
240 var n1 = n + 0.00001; // для обработки случая m = n
241 return n1 * m / (n1 - m) * D / a * (Math.pow(s, n1 + 1) - Math.pow(s, m + 1));
242 }
243
244 // Потенциал Морзе
245
246 function U_Morse(r)
247 {
248 var al = kappa / a;
249 var s = Math.exp(al * (a - r));
250 return D * s * (s - 2);
251 }
252
253 // Сила Морзе
254
255 function F_Morse(r)
256 {
257 var al = kappa / a;
258 var s = Math.exp(al * (a - r));
259 return 2 * al * D * s * (s - 1);
260 }
261
262 // Потенциал Леннард-Джонса
263
264 function U_LJ(r)
265 {
266 var s2 = 1 / (r * r);
267 var s6 = s2 * s2 * s2;
268 return D * s6 * (s6 - 2);
269 }
270
271 // Сила Леннард-Джонса
272
273 function F_LJ(r)
274 {
275 var s2 = 1 / (r * r);
276 var s4 = s2 * s2;
277 return P0 * s4 * s4 * (s4 * s2 - 1) * r;
278 }
279 }
Файл "MLJ.html"
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <meta charset="UTF-8" />
5 <title>LJ, Mie & Morse Interaction</title>
6 <script src="Mie.js"></script>
7 </head>
8 <body>
9 <canvas id="canvasGraph_1" width="800" height="300" style="border:1px solid #000000;"></canvas>
10 <canvas id="canvasGraph_2" width="800" height="300" style="border:1px solid #000000;"></canvas>
11
12 <!--Выбор графика (чекбоксы)-->
13 <div>
14 Взаимодействие:
15 <font color="#000000" size="5"><B>—</B></font>
16 <input type="checkbox" id="checkbox_01" name="" onchange="app.setCheckbox_01(this.checked);" checked/>Леннард-Джонса,
17 <font color="#0000ff" size="5"><B>—</B></font>
18 <input type="checkbox" id="checkbox_02" name="" onchange="app.setCheckbox_02(this.checked);" checked/>Ми,
19 <font color="#ff00ff" size="5"><B>—</B></font>
20 <input type="checkbox" id="checkbox_03" name="" onchange="app.setCheckbox_03(this.checked);" checked/>Морзе
21 </div>
22
23 <!--Установка параметров взаимодействия (текстовые поля и слайдеры)-->
24 <div>Ми:
25 <font face= "Times New Roman"><I>
26 m = <input id="Text_01" style="width: 4.2ex;" required pattern="[-+]?([0-9]*\.[0-9]+|[0-9]+)" oninput="
27 // если введено не число - строка не пройдет валидацию по паттерну выше, и checkValidity() вернет false
28 if (!this.checkValidity()) return;
29 app.set_01(this.value);
30 document.getElementById('Slider_01').value = this.value;
31 ">
32 <input type="range" id="Slider_01" style="width: 100px;" oninput="app.set_01(this.value); document.getElementById('Text_01').value = this.value;">
33 n = <input id="Text_02" style="width: 4.2ex;" required pattern="[-+]?([0-9]*\.[0-9]+|[0-9]+)" oninput="
34 if (!this.checkValidity()) return;
35 app.set_02(this.value);
36 document.getElementById('Slider_02').value = this.value;
37 ">
38 <input type="range" id="Slider_02" style="width: 100px;" oninput="app.set_02(this.value); document.getElementById('Text_02').value = this.value;">
39 </I></font>
40 Морзе:
41 <font face= "Times New Roman"><I>
42 αa =
43 <input id="Text_03" style="width: 4.2ex;" required pattern="[-+]?([0-9]*\.[0-9]+|[0-9]+)" oninput="
44 if (!this.checkValidity()) return;
45 app.set_03(this.value);
46 document.getElementById('Slider_03').value = this.value;
47 ">
48 <input type="range" id="Slider_03" style="width: 100px;" oninput="app.set_03(this.value); document.getElementById('Text_03').value = this.value;">
49 </I></font>
50 </div>
51
52 <!--Задание связей (чекбоксы)-->
53 <div>
54 Связь между параметрами:<font face= "Times New Roman"><I>
55 <input type="checkbox" id="checkbox_04" name="" onchange="app.setCheckbox_04(this.checked);" unchecked/>n = m,
56 <input type="checkbox" id="checkbox_05" name="" onchange="app.setCheckbox_05(this.checked);" unchecked/>n = 2m,
57 <input type="checkbox" id="checkbox_06" name="" onchange="app.setCheckbox_06(this.checked);" unchecked/>(αa)<SUP>2</SUP> = nm/2
58 </I></font>
59 </div>
60
61 <script type="text/javascript">var app = new MainMie(
62 document.getElementById('canvasGraph_1'),
63 document.getElementById('canvasGraph_2')
64 );</script>
65
66 </body>
67 </html>