Редактирование: Статистические распределения в двумерном кристалле с треугольной решеткой
Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.
Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия | Ваш текст | ||
Строка 1: | Строка 1: | ||
− | + | [[Виртуальная лаборатория]] > [[Статистические распределения в двумерном кристалле с треугольной решеткой]] | |
− | [[Виртуальная лаборатория]] > [[Статистические распределения в двумерном кристалле с треугольной решеткой]] | ||
Рассматривается система частиц моделируемых материальными точками с линейным законом взаимодействия | Рассматривается система частиц моделируемых материальными точками с линейным законом взаимодействия | ||
Строка 24: | Строка 23: | ||
<math>m = 1,\quad c = 1</math>, шаг интегрирования <math>dt = 0.005</math>. | <math>m = 1,\quad c = 1</math>, шаг интегрирования <math>dt = 0.005</math>. | ||
− | {{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Tsaplin/TriLatLin.html |width=1050 |height= | + | {{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Tsaplin/TriLatLin.html |width=1050 |height=1700 |border=0 }} |
Скачать программу: [[Медиа:TriLatLin.zip | TriLatLin.zip]] | Скачать программу: [[Медиа:TriLatLin.zip | TriLatLin.zip]] | ||
Строка 33: | Строка 32: | ||
function MainTriLatticeTemper() | function MainTriLatticeTemper() | ||
{ | { | ||
− | var ctx_X = canvas_densitas_Vx.getContext("2d"); | + | var ctx_X = canvas_densitas_Vx.getContext("2d"); |
var width_X = canvas_densitas_Vx.width; | var width_X = canvas_densitas_Vx.width; | ||
var height_X = canvas_densitas_Vx.height; | var height_X = canvas_densitas_Vx.height; | ||
− | var ctx_Y = canvas_densitas_Vy.getContext("2d"); | + | var ctx_Y = canvas_densitas_Vy.getContext("2d"); |
var width_Y = canvas_densitas_Vy.width; | var width_Y = canvas_densitas_Vy.width; | ||
var height_Y = canvas_densitas_Vy.height; | var height_Y = canvas_densitas_Vy.height; | ||
− | var ctx_E = canvas_energy.getContext("2d"); | + | var ctx_E = canvas_energy.getContext("2d"); |
var width_E = canvas_energy.width; | var width_E = canvas_energy.width; | ||
var height_E = canvas_energy.height; | var height_E = canvas_energy.height; | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
// частица содержит перемещения и скорости | // частица содержит перемещения и скорости | ||
Строка 57: | Строка 48: | ||
var _Vx; | var _Vx; | ||
var _Vy; | var _Vy; | ||
− | var Vx2_sum; | + | var Vx2_sum; // сумма квадратов координат скорости Vx (с весом s) |
− | var Vxy_sum; | + | var Vxy_sum; // сумма произведений координат скорости VxVy (с весом s) |
− | var Vy2_sum; | + | var Vy2_sum; // сумма квадратов координат скорости Vy (с весом s) |
− | var Vx4_sum; | + | var Vx4_sum; // сумма (координат скорости Vx)^4 (с весом s) |
− | var Vy4_sum; | + | var Vy4_sum; // сумма (координат скорости Vy)^4 (с весом s) |
var U1x_sum, U1y_sum; | var U1x_sum, U1y_sum; | ||
− | var Vx2_av; | + | var Vx2_av; // средний Vx^2 c эксп. весом (для графиков) |
− | var Vy2_av; | + | var Vy2_av; // средний Vy^2 c эксп. весом |
− | var suspended = 0; | + | var suspended = 0; // вычисление приостановлено == 1 |
// массив частиц | // массив частиц | ||
Строка 72: | Строка 63: | ||
var Arr_prt = []; | var Arr_prt = []; | ||
− | var n1 = 30; | + | var n1 = 30; // число рядов 1 |
var n2 = 30; | var n2 = 30; | ||
− | var n = n1 * n2; | + | var n = n1 * n2; // число частиц |
− | //var a = 1; | + | //var a = 1; // равновесное расстояние между центрами частиц |
− | //var c = 1; | + | //var c = 1; // линейная жесткость упругой связи |
− | //var m = 1; | + | //var m = 1; // масса частицы |
//var с_m = c/m; | //var с_m = c/m; | ||
var dt_sc_m = 0.005; // шаг интегрирования по времени dt_sc_m = dt*sqrt(c_m) | var dt_sc_m = 0.005; // шаг интегрирования по времени dt_sc_m = dt*sqrt(c_m) | ||
Строка 85: | Строка 76: | ||
var Vx = 10; | var Vx = 10; | ||
var Vy = 0.1; | var Vy = 0.1; | ||
− | var Vc_x = 0; | + | var Vc_x = 0; // скорость |
− | var Vc_y = 0; | + | var Vc_y = 0; // центра масс |
− | var K1 = []; | + | var K1 = []; // кин. энергия |
− | var P = []; | + | var P = []; // пот. энергия |
slider_input_X.value = Vx; | slider_input_X.value = Vx; | ||
Строка 96: | Строка 87: | ||
number_input_Y.value = Vy; | number_input_Y.value = Vy; | ||
sV_axis = 0; | sV_axis = 0; | ||
+ | // var str = "arr=\n"; | ||
− | var s = 0; | + | var s = 0; // шаг по времени |
− | var V_max; | + | var V_max; // максимальная координата скорости на графике |
− | var sV_max; | + | var sV_max; // максимальный корень из координаты скорости на графике |
− | var norm = 0; | + | var norm = 0; // начальные координаты скорости имеют нормальное распределение == 1 |
− | var Par = []; | + | var Par = []; // возвращаемое значение функции RandomNorm() |
// Случайные числа с нормальным распределением | // Случайные числа с нормальным распределением | ||
Строка 191: | Строка 183: | ||
sV_max = Math.sqrt(Math.max(Vx, Vy)*2); // максимальное значение абсциссы на графиках | sV_max = Math.sqrt(Math.max(Vx, Vy)*2); // максимальное значение абсциссы на графиках | ||
− | V_max = 2*Math.max(Vx, Vy); | + | V_max = 2*Math.max(Vx, Vy); // максимальное значение абсциссы на графиках |
ExCalculateReset(); | ExCalculateReset(); | ||
Строка 204: | Строка 196: | ||
function Step() | function Step() | ||
{ | { | ||
− | + | if (!suspended) | |
− | + | { | |
− | + | Calculate(); // шаг интегрирования по времени | |
− | + | ExCalculate(k_sen); // подготовка для вывода графиков | |
− | + | s++; | |
− | + | Paint(); // рисование графиков | |
− | + | } | |
} | } | ||
Строка 439: | Строка 431: | ||
span_t.innerHTML = (s*dt_sc_m).toFixed(2); | span_t.innerHTML = (s*dt_sc_m).toFixed(2); | ||
span_steps.innerHTML = s; | span_steps.innerHTML = s; | ||
− | |||
− | |||
− | |||
} | } | ||
Строка 456: | Строка 445: | ||
if (sV_axis) | if (sV_axis) | ||
{ | { | ||
− | + | /*dens_V_max = 1; | |
+ | for (var i = 0; i < N_graph_Vx; i++) | ||
+ | if (V_dens[i] > dens_V_max) { dens_V_max = V_dens[i]; }*/ | ||
+ | |||
+ | dens_V_max = n*2*sV_max/(N_graph_Vx-1)*Math.sqrt(Math.sqrt(2/Math.E/(n_col ? Vy2_av : Vx2_av))/Math.PI); | ||
} | } | ||
else dens_V_max = n*2*V_max/(N_graph_Vx-1)/Math.sqrt(2*Math.PI*(n_col ? Vy2_av : Vx2_av)); | else dens_V_max = n*2*V_max/(N_graph_Vx-1)/Math.sqrt(2*Math.PI*(n_col ? Vy2_av : Vx2_av)); | ||
Строка 472: | Строка 465: | ||
{ | { | ||
var width2 = width*width; | var width2 = width*width; | ||
− | |||
− | |||
− | |||
if (sV_axis) // распределение по sqrt(V_(x,y)) | if (sV_axis) // распределение по sqrt(V_(x,y)) | ||
{ | { | ||
+ | ctx.strokeStyle = "#006000"; | ||
+ | ctx.beginPath(); | ||
+ | |||
var x1 = -V_max*V_max/width2/width2/(n_col ? Vy2_av : Vx2_av)/2; | var x1 = -V_max*V_max/width2/width2/(n_col ? Vy2_av : Vx2_av)/2; | ||
var y1 = y_scal*dens_V_max*Math.sqrt(Math.sqrt(2*Math.E/(n_col ? Vy2_av : Vx2_av)))*sV_max/width; | var y1 = y_scal*dens_V_max*Math.sqrt(Math.sqrt(2*Math.E/(n_col ? Vy2_av : Vx2_av)))*sV_max/width; | ||
Строка 497: | Строка 490: | ||
//y = Math.floor(height - y1*width*Math.exp(width2*width2*x1)); | //y = Math.floor(height - y1*width*Math.exp(width2*width2*x1)); | ||
//ctx.lineTo(width, y); | //ctx.lineTo(width, y); | ||
+ | |||
+ | ctx.stroke(); | ||
} | } | ||
else // распределение по V_(x,y) | else // распределение по V_(x,y) | ||
{ | { | ||
+ | ctx.strokeStyle = "#006000"; | ||
+ | ctx.beginPath(); | ||
+ | |||
var y1 = y_scal*dens_V_max;// y_scal*n*2*V_max/(N_graph_Vx-1)/Math.sqrt(2*Math.PI*(n_col ? Vy2_av : Vx2_av)); | var y1 = y_scal*dens_V_max;// y_scal*n*2*V_max/(N_graph_Vx-1)/Math.sqrt(2*Math.PI*(n_col ? Vy2_av : Vx2_av)); | ||
var x1 = -V_max*V_max/width/width/(n_col ? Vy2_av : Vx2_av)/2; | var x1 = -V_max*V_max/width/width/(n_col ? Vy2_av : Vx2_av)/2; | ||
Строка 517: | Строка 515: | ||
y = Math.floor(height - y1*Math.exp(width*width*x1)); | y = Math.floor(height - y1*Math.exp(width*width*x1)); | ||
ctx.lineTo(width, y); | ctx.lineTo(width, y); | ||
+ | |||
+ | ctx.stroke(); | ||
} | } | ||
− | |||
− | |||
} | } | ||
Строка 550: | Строка 548: | ||
var y_d = (j == 0) ? V_dens[1]-V_dens[0] : (V_dens[j+1]-V_dens[j-1])/2; | var y_d = (j == 0) ? V_dens[1]-V_dens[0] : (V_dens[j+1]-V_dens[j-1])/2; | ||
− | y += y_d * (fi-1) * (fi-1) * fi; | + | y += y_d * (fi-1) * (fi-1) * fi; // производная в левом узле |
y_d = (j == N_graph_Vx-2) ? V_dens[N_graph_Vx-1]-V_dens[N_graph_Vx-2] : (V_dens[j+2]-V_dens[j])/2; | y_d = (j == N_graph_Vx-2) ? V_dens[N_graph_Vx-1]-V_dens[N_graph_Vx-2] : (V_dens[j+2]-V_dens[j])/2; | ||
− | y += y_d * fi * fi * (fi-1); | + | y += y_d * fi * fi * (fi-1); // производная в правом узле |
− | y = Math.floor(height - y_scal*y); | + | y = Math.floor(height - y_scal*y); // линейное отображение в область построения |
y = Math.max(0, y); | y = Math.max(0, y); | ||
y = Math.min(y, height); | y = Math.min(y, height); | ||
Строка 617: | Строка 615: | ||
ctx_E.lineTo(width_E, y); | ctx_E.lineTo(width_E, y); | ||
ctx_E.stroke(); | ctx_E.stroke(); | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
Строка 690: | Строка 649: | ||
Restart(); | Restart(); | ||
}; | }; | ||
− | |||
− | |||
suspend_calc.onclick = function() | suspend_calc.onclick = function() | ||
{ | { | ||
suspended = !suspended; | suspended = !suspended; | ||
− | |||
− | |||
− | |||
− | |||
var str = suspend_calc.value; | var str = suspend_calc.value; | ||
suspend_calc.value = suspend_calc.name; | suspend_calc.value = suspend_calc.name; | ||
suspend_calc.name = str; | suspend_calc.name = str; | ||
− | |||
− | |||
− | |||
− | |||
}; | }; | ||
− | |||
− | |||
number_input_n1.oninput = function() | number_input_n1.oninput = function() | ||
{ | { | ||
Строка 757: | Строка 704: | ||
Restart(); | Restart(); | ||
− | + | setInterval(Step, 1000 / 30); // функция step будет запускаться 30 раз в секунду (в 1000 мс) | |
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 769: | Строка 716: | ||
<!link rel="stylesheet" type="text/css" href="js_tm_styles.css" /> | <!link rel="stylesheet" type="text/css" href="js_tm_styles.css" /> | ||
</head> | </head> | ||
− | <body onload="MainTriLatticeTemper() | + | <body onload="MainTriLatticeTemper();"> |
− | |||
<p>Количество частиц: | <p>Количество частиц: | ||
<input type="range" id="slider_input_n1" | <input type="range" id="slider_input_n1" | ||
Строка 874: | Строка 820: | ||
(1/<I>k</I><SUB>2</SUB> = <span id="span_1k2"></span>) | (1/<I>k</I><SUB>2</SUB> = <span id="span_1k2"></span>) | ||
− | <! | + | <!span id="span_U"> <!/span> <!br> |
<p><B>Изменение кинетической энергии во времени.</B> Горизонтальная линия – половина полной энергии.</p> | <p><B>Изменение кинетической энергии во времени.</B> Горизонтальная линия – половина полной энергии.</p> | ||
<canvas id="canvas_energy" width="1000" height="300" style="border: 1px solid #000000"></canvas> | <canvas id="canvas_energy" width="1000" height="300" style="border: 1px solid #000000"></canvas> | ||
Строка 885: | Строка 831: | ||
<br> | <br> | ||
Время <I>t</I> = <span id="span_t"> </span> (<span id="span_steps"></span> шагов)</p> | Время <I>t</I> = <span id="span_t"> </span> (<span id="span_steps"></span> шагов)</p> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
</body> | </body> | ||
</html> | </html> | ||
Строка 915: | Строка 839: | ||
[[Category: Виртуальная лаборатория]] | [[Category: Виртуальная лаборатория]] | ||
[[Category: Программирование]] | [[Category: Программирование]] | ||
− | |||
[[Category: JavaScript]] | [[Category: JavaScript]] |