Редактирование: Колебания энергий в одномерном кристалле
Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.
Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия | Ваш текст | ||
Строка 1: | Строка 1: | ||
− | [[en: | + | [[en:Fluctuations in energy-dimensional crystal]] |
− | |||
[[Виртуальная лаборатория]] > [[Колебания энергий в одномерном кристалле]] <HR> | [[Виртуальная лаборатория]] > [[Колебания энергий в одномерном кристалле]] <HR> | ||
− | |||
Данная программа демонстрирует колебания кинетической, потенциальной и полной энергий в одномерном кристалле. | Данная программа демонстрирует колебания кинетической, потенциальной и полной энергий в одномерном кристалле. | ||
− | + | {{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Tcvetkov/Bessel_fluctuations/Bessel_fluctuations_v2.3_no_realiz/Bessel_fluctuations.html |width=1030 |height=640 |border=0 }} | |
− | + | Скачать программу: [[Медиа:Bessel_fluctuations_v2.3_no_realiz.zip|Bessel_fluctuations_v2.3_no_realiz.zip]] | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | Скачать программу: [[Медиа: | ||
<div class="mw-collapsible mw-collapsed" style="width:100%" > | <div class="mw-collapsible mw-collapsed" style="width:100%" > | ||
− | '''Текст программы на языке JavaScript ( | + | '''Текст программы на языке JavaScript (разработчик [[Цветков Денис]]):''' <div class="mw-collapsible-content"> |
Файл '''"Bessel_fluctuations.js"''' | Файл '''"Bessel_fluctuations.js"''' | ||
<syntaxhighlight lang="javascript" line start="1" enclose="div"> | <syntaxhighlight lang="javascript" line start="1" enclose="div"> | ||
Строка 40: | Строка 27: | ||
var dt = 0.02 * t0; // шаг интегрирования по времени | var dt = 0.02 * t0; // шаг интегрирования по времени | ||
− | + | var N = 100000; // количество частиц в каждой реализации | |
− | var N = | + | var T = 15; // время расчета |
− | var | ||
var koeff = C / (dx * dx) / m * dt; // коэффициент для уравнения динамики частиц | var koeff = C / (dx * dx) / m * dt; // коэффициент для уравнения динамики частиц | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
// интерфейс программы | // интерфейс программы | ||
N_number.value = N; | N_number.value = N; | ||
N_number.oninput = function() {N = parseInt(N_number.value);}; | N_number.oninput = function() {N = parseInt(N_number.value);}; | ||
− | + | T_number.value = T; | |
− | + | T_number.oninput = function() {T = parseInt(T_number.value);}; | |
− | |||
− | |||
− | |||
− | |||
button_start.onclick = calculate_new_system; | button_start.onclick = calculate_new_system; | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | var ctx = BF_canvas.getContext("2d"); | + | checkbox_K.onchange = function() {if (first_calc) draw();}; |
− | var w = BF_canvas.width; | + | checkbox_P.onchange = function() {if (first_calc) draw();}; |
− | var h = BF_canvas.height; | + | checkbox_E.onchange = function() {if (first_calc) draw();}; |
+ | |||
+ | var ctx = BF_canvas.getContext("2d"); // на context происходит рисование | ||
+ | var w = BF_canvas.width; // ширина окна в расчетных координатах | ||
+ | var h = BF_canvas.height; // высота окна в расчетных координатах | ||
// основная расчетная функция | // основная расчетная функция | ||
var data_K, data_P, data_E; // данные для графика | var data_K, data_P, data_E; // данные для графика | ||
+ | var first_calc = false; // произведен ли первый расчет | ||
var t, n; | var t, n; | ||
var t_start; | var t_start; | ||
− | |||
− | |||
function calculate_new_system() { | function calculate_new_system() { | ||
+ | first_calc = true; | ||
t = 0; | t = 0; | ||
n = N + 2; // количество узлов по оси x + 2 для ГУ | n = N + 2; // количество узлов по оси x + 2 для ГУ | ||
− | |||
− | |||
− | |||
span_time_calc.innerHTML = ""; | span_time_calc.innerHTML = ""; | ||
div_calc_speed.style.display = "none"; | div_calc_speed.style.display = "none"; | ||
− | |||
− | |||
// задание начальных условий | // задание начальных условий | ||
− | var | + | var P = []; |
− | + | for (var i = 1; i < n - 1; i++) { | |
− | + | P[i] = {}; | |
− | + | P[i].u = 0; | |
− | + | P[i].v = (2 * Math.random() - 1) * 0.25; | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
+ | // периодические граничные условия | ||
+ | P[0] = P[n - 2]; | ||
+ | P[n - 1] = P[1]; | ||
data_K = []; data_P = []; data_E = []; | data_K = []; data_P = []; data_E = []; | ||
Строка 130: | Строка 74: | ||
// основной расчет | // основной расчет | ||
t_start = performance.now(); | t_start = performance.now(); | ||
− | calculate( | + | calculate(P); |
} | } | ||
− | |||
− | function calculate( | + | function calculate(P) { |
var t1 = performance.now(); | var t1 = performance.now(); | ||
+ | |||
while (t < T) { | while (t < T) { | ||
// расчет энергий для графиков | // расчет энергий для графиков | ||
var Kin = 0; | var Kin = 0; | ||
var Pot = 0; | var Pot = 0; | ||
− | + | for (var j = 1; j < n - 1; j++) {Kin += P[j].v * P[j].v;} | |
− | + | for (var j = 1; j < n - 1; j++) {Pot += Math.pow(P[j].u - P[j - 1].u, 2);} | |
− | + | Kin = Kin * m; | |
− | + | Pot = Pot * C; | |
− | |||
− | Kin = Kin * m | ||
− | Pot = Pot * C | ||
data_K.push(Kin); | data_K.push(Kin); | ||
data_P.push(Pot); | data_P.push(Pot); | ||
Строка 152: | Строка 93: | ||
// расчет состояния системы на следующем шаге | // расчет состояния системы на следующем шаге | ||
− | + | for (var i = 1; i < n - 1; i++) { | |
− | + | P[i].v += (P[i + 1].u - 2 * P[i].u + P[i - 1].u) * koeff; | |
− | + | } | |
− | + | for (var i = 1; i < n - 1; i++) { | |
− | + | P[i].u += P[i].v * dt; | |
− | |||
− | |||
− | |||
} | } | ||
+ | |||
t += dt; | t += dt; | ||
− | |||
− | |||
− | |||
if ((performance.now() - t1) > 200) { | if ((performance.now() - t1) > 200) { | ||
− | + | draw(); | |
− | + | setTimeout( function(){calculate(P); }, 10); | |
− | + | div_container_progress.style.display = "block"; | |
− | + | button_start.style.display = "none"; | |
− | + | progress_bar.style.width = Math.round(t / T * 100) + "%"; | |
− | + | span_progress.innerHTML = (t / T * 100).toFixed(2) + "%"; | |
− | |||
− | |||
− | |||
return; | return; | ||
} | } | ||
} | } | ||
− | |||
− | |||
− | |||
− | |||
draw(); | draw(); | ||
div_container_progress.style.display = "none"; | div_container_progress.style.display = "none"; | ||
button_start.style.display = "inline"; | button_start.style.display = "inline"; | ||
− | |||
div_calc_speed.style.display = "block"; | div_calc_speed.style.display = "block"; | ||
− | span_time_calc.innerHTML = | + | span_time_calc.innerHTML = ((performance.now() - t_start) / N * 1000 / Math.ceil(T/t)).toFixed(2); |
return true; | return true; | ||
} | } | ||
Строка 194: | Строка 122: | ||
ctx.clearRect(0, 0, w, h); // очистка экрана | ctx.clearRect(0, 0, w, h); // очистка экрана | ||
− | + | // подпись к оси ("х") | |
− | + | ctx.font = "20pt Arial"; | |
− | + | ctx.textAlign = "right"; | |
− | + | ctx.textBaseline = "bottom"; | |
− | + | ctx.fillStyle = "#666666"; | |
− | + | ctx.fillText("x", w - 4, h); | |
− | + | ||
− | + | var title_y = 3; // начальный отступ для подписи | |
− | + | var title_y_plus = 30; // на столько увеличивается отступ для каждой следующей подписи | |
− | |||
− | |||
if (checkbox_K.checked) { | if (checkbox_K.checked) { | ||
Строка 216: | Строка 142: | ||
} | } | ||
ctx.stroke(); | ctx.stroke(); | ||
+ | |||
+ | // подпись | ||
+ | ctx.textAlign = "center"; | ||
+ | ctx.textBaseline = "top"; | ||
+ | ctx.fillStyle = "#ff0000"; | ||
+ | ctx.fillText("K", w - 24, title_y); | ||
+ | title_y += title_y_plus; | ||
} | } | ||
Строка 228: | Строка 161: | ||
} | } | ||
ctx.stroke(); | ctx.stroke(); | ||
+ | |||
+ | ctx.textAlign = "center"; | ||
+ | ctx.textBaseline = "top"; | ||
+ | ctx.fillStyle = "#0000ff"; | ||
+ | ctx.fillText("П", w - 24, title_y); | ||
+ | title_y += title_y_plus; | ||
} | } | ||
Строка 240: | Строка 179: | ||
} | } | ||
ctx.stroke(); | ctx.stroke(); | ||
+ | |||
+ | ctx.textAlign = "center"; | ||
+ | ctx.textBaseline = "top"; | ||
+ | ctx.fillStyle = "#880088"; | ||
+ | ctx.fillText("E/2", w - 24, title_y); | ||
+ | title_y += title_y_plus; | ||
} | } | ||
+ | |||
} | } | ||
} | } | ||
Строка 260: | Строка 206: | ||
en:"Full energy", | en:"Full energy", | ||
ru:"Полная энергия" | ru:"Полная энергия" | ||
− | |||
− | |||
− | |||
− | |||
}, button_start:{ | }, button_start:{ | ||
field:"value", | field:"value", | ||
en:"Start", | en:"Start", | ||
ru:"Старт" | ru:"Старт" | ||
− | |||
− | |||
− | |||
− | |||
}, span_progress_txt:{ | }, span_progress_txt:{ | ||
field:"innerHTML", | field:"innerHTML", | ||
Строка 280: | Строка 218: | ||
en:"The calculation of this speed includes the time for processing interface and drawing the intermediate states of the system", | en:"The calculation of this speed includes the time for processing interface and drawing the intermediate states of the system", | ||
ru:"Расчет данной скорости включает в себя время на обработку интерфейса и прорисовку промежуточных состояний системы" | ru:"Расчет данной скорости включает в себя время на обработку интерфейса и прорисовку промежуточных состояний системы" | ||
− | }, | + | }, span_txt_nubmer_of_particles:{ |
field:"innerHTML", | field:"innerHTML", | ||
− | en:" | + | en:"Number of particles", |
− | + | ru:"Количество частиц" | |
− | |||
− | |||
− | |||
− | ru:"частиц | ||
− | |||
− | |||
− | |||
− | |||
}, span_txt_calc_time:{ | }, span_txt_calc_time:{ | ||
field:"innerHTML", | field:"innerHTML", | ||
− | en:"Calculation time | + | en:"Calculation time", |
− | ru:"Время расчета | + | ru:"Время расчета" |
}, span_txt_calc_speed:{ | }, span_txt_calc_speed:{ | ||
field:"innerHTML", | field:"innerHTML", | ||
− | en:"Calculation speed | + | en:"Calculation speed", |
− | ru:"Скорость расчета | + | ru:"Скорость расчета" |
}, span_txt_ns_particle_step:{ | }, span_txt_ns_particle_step:{ | ||
field:"innerHTML", | field:"innerHTML", | ||
en:"ns/(particle⋅step)", | en:"ns/(particle⋅step)", | ||
ru:"нс/(частица⋅шаг)" | ru:"нс/(частица⋅шаг)" | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
}; | }; | ||
Строка 331: | Строка 253: | ||
<script src="Bessel_fluctuations.js"></script> | <script src="Bessel_fluctuations.js"></script> | ||
<script src="Lang/Lang.js"></script> | <script src="Lang/Lang.js"></script> | ||
− | |||
<style> | <style> | ||
table.outer td, table.outer tr {border: 1px solid #ddd; padding-right: 10px; padding-left: 5px} | table.outer td, table.outer tr {border: 1px solid #ddd; padding-right: 10px; padding-left: 5px} | ||
Строка 338: | Строка 259: | ||
</head> | </head> | ||
<body> | <body> | ||
− | + | <canvas id="BF_canvas" width="1000" height="500" style="border:1px solid #000000;"></canvas><br> | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | <table class="outer" style="border-collapse: collapse; width:1002px"> | |
− | + | <tr> | |
− | + | <td style="width: 300px"> | |
− | </ | + | <input type="checkbox" id="checkbox_K" checked/><font color="#ff0000" size="5"><B>—</B></font> <span id="span_kin_energy"></span> <br> |
+ | <input type="checkbox" id="checkbox_P" checked/><font color="#0000ff" size="5"><B>—</B></font> <span id="span_pot_energy"></span> <br> | ||
+ | <input type="checkbox" id="checkbox_E" checked/><font color="#880088" size="5"><B>—</B></font> <span id="span_full_energy"></span> <br> | ||
+ | </td><td> | ||
+ | <input type="button" id="button_start" style="background:#fb4;border-radius: 5px;color:#000; font-weight: bold;"/><br> | ||
+ | <input type="image" src="Lang/RU.png" onclick="set_lang('ru')"/> | ||
+ | <input type="image" src="Lang/GB.png" onclick="set_lang('en')"/><br> | ||
+ | <div id="div_container_progress" style="display: none;"> | ||
+ | <span id="span_progress_txt"></span><span id="span_progress"></span> | ||
+ | <div id="container_bar" style="width:200px; height:20px; border:1px solid black;"> | ||
+ | <div id="progress_bar" style="width:10%;background-color: orange; height:20px;"></div> | ||
</div> | </div> | ||
+ | </div> | ||
− | < | + | <div id="div_calc_speed" style="display: none"> |
− | < | + | <abbr id="abbr_speed" style="border-bottom: 1px dotted black;" title="Данная скорость включает в себя время на обработку интерфейса и прорисовку промежуточных состояний системы"> |
− | + | <span id="span_txt_calc_speed"></span> <span id="span_time_calc"></span> <span id="span_txt_ns_particle_step"></span> | |
− | + | </abbr> | |
− | + | </div> | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | </ | ||
− | </ | ||
− | |||
− | |||
− | |||
− | |||
+ | </td><td style="width: 300px"> | ||
+ | <table class="inner"> | ||
+ | <tr> | ||
+ | <td><span id="span_txt_nubmer_of_particles"></span></td> | ||
+ | <td><input type="number" id="N_number" step="1" style="width: 70px;"/></td> | ||
+ | </tr> | ||
+ | <tr> | ||
+ | <td><span id="span_txt_calc_time"></span></td> | ||
+ | <td><input type="number" id="T_number" step="1" style="width: 70px;"/> t0</td> | ||
+ | </tr> | ||
+ | </table> | ||
+ | </td> | ||
+ | </tr> | ||
+ | </table> | ||
<script>set_lang("ru")</script> | <script>set_lang("ru")</script> | ||
</body> | </body> | ||
Строка 409: | Строка 304: | ||
</div> | </div> | ||
</div> | </div> | ||
− | |||
− | |||
− | |||
[[Category: Виртуальная лаборатория]] | [[Category: Виртуальная лаборатория]] | ||
[[Category: Программирование]] | [[Category: Программирование]] | ||
− |