Редактирование: Колебания энергий в одномерном кристалле

Перейти к: навигация, поиск

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

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 1: Строка 1:
 
[[en:Energy fluctuations in one-dimensional crystal]]
 
[[en:Energy fluctuations in one-dimensional crystal]]
[[ТМ|Кафедра ТМ]] > [[Проект "Термокристалл"]] > [[Колебания энергий в одномерном кристалле]] <HR>
 
 
[[Виртуальная лаборатория]] > [[Колебания энергий в одномерном кристалле]] <HR>
 
[[Виртуальная лаборатория]] > [[Колебания энергий в одномерном кристалле]] <HR>
[[Д.В. Цветков]] (программирование), [[А.М. Кривцов]] (аналитическое решение) <HR>
 
  
 
Данная программа демонстрирует колебания кинетической, потенциальной и полной энергий в одномерном кристалле.
 
Данная программа демонстрирует колебания кинетической, потенциальной и полной энергий в одномерном кристалле.
Колебания кинетической энергии описываются следующим уравнением:
+
{{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Tcvetkov/Bessel_fluctuations/Bessel_fluctuations_v2.5_no_realiz/Bessel_fluctuations.html |width=1055 |height=650 |border=0 }}
  
:<math>
+
Скачать программу: [[Медиа:Bessel_fluctuations_v2.5_no_realiz.zip|Bessel_fluctuations_v2.5_no_realiz.zip]]
    K_J(t) = \frac{E}{2}  \left(1 + J_0(4 \omega_0 )\right)
 
    ,\qquad \omega_0 = \sqrt{C/m},
 
</math>
 
где
 
<math>J_0</math> — Функция Бесселя первого рода в точке 0,
 
<math>C</math> — жесткость связи между частицами,
 
<math>m</math> — масса частицы.
 
 
 
{{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Tcvetkov/Bessel_fluctuations/Bessel_fluctuations_v3.0/Bessel_fluctuations.html |width=1055 |height=675 |border=0 }}
 
 
 
Скачать программу: [[Медиа:Bessel_fluctuations_v3.0.zip|Bessel_fluctuations_v3.0.zip]]
 
 
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 
<div class="mw-collapsible mw-collapsed" style="width:100%" >
'''Текст программы на языке JavaScript (использована библиотека [https://github.com/SheetJS/bessel bessel.js]):''' <div class="mw-collapsible-content">
+
'''Текст программы на языке 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 R = 10;                              // количество реализаций
+
     var N = 100000;                         // количество частиц в каждой реализации
     var N = 10000;                         // количество частиц в каждой реализации
 
 
     var periods = 10;                      // время расчета в периодах колебаний энергий
 
     var periods = 10;                      // время расчета в периодах колебаний энергий
  
Строка 63: Строка 49:
 
         set_periods(parseFloat(periods_number.value));
 
         set_periods(parseFloat(periods_number.value));
 
     };
 
     };
    R_number.value = R;
 
    R_number.oninput = function() {R = parseInt(R_number.value);};
 
 
     button_start.onclick = calculate_new_system;
 
     button_start.onclick = calculate_new_system;
    button_stop.onclick = function() {
 
        working = false;
 
    };
 
    checkbox_Bessel.onchange = function() {
 
        draw();
 
        if (checkbox_Bessel.checked) div_txt_J0.style.display = "block";
 
        else div_txt_J0.style.display = "none"
 
    };
 
 
     checkbox_K.onchange = function() {
 
     checkbox_K.onchange = function() {
 
         draw();
 
         draw();
Строка 98: Строка 74:
 
     var t, n;
 
     var t, n;
 
     var t_start;
 
     var t_start;
    var working;
 
    var step;
 
 
     function calculate_new_system() {
 
     function calculate_new_system() {
 
         t = 0;
 
         t = 0;
 
         n = N + 2;                          // количество узлов по оси x + 2 для ГУ
 
         n = N + 2;                          // количество узлов по оси x + 2 для ГУ
        working = true;
 
        step = 0;
 
 
 
         span_time_calc.innerHTML = "";
 
         span_time_calc.innerHTML = "";
 
         div_calc_speed.style.display = "none";
 
         div_calc_speed.style.display = "none";
        button_start.style.display = "none";
 
        button_stop.style.display = "inline";
 
  
 
         // задание начальных условий
 
         // задание начальных условий
         var all_P = [];
+
         var P = [];
         for (var r = 0; r < R; r++) {
+
         for (var i = 1; i < n - 1; i++) {
            var P = [];
+
            P[i] = {};
            for (var i = 1; i < n - 1; i++) {
+
            P[i].u = 0;
                P[i] = {};
+
            P[i].v = (2 * Math.random() - 1) * 0.25;
                P[i].u = 0;
 
                P[i].v = (2 * Math.random() - 1) * 0.25;
 
            }
 
            // периодические граничные условия
 
            P[0] = P[n - 2];
 
            P[n - 1] = P[1];
 
            all_P.push(P);
 
 
         }
 
         }
 +
        // периодические граничные условия
 +
        P[0] = P[n - 2];
 +
        P[n - 1] = P[1];
  
 
         data_K = []; data_P = []; data_E = [];
 
         data_K = []; data_P = []; data_E = [];
Строка 130: Строка 95:
 
         // основной расчет
 
         // основной расчет
 
         t_start = performance.now();
 
         t_start = performance.now();
         calculate(all_P);
+
         calculate(P);
 
     }
 
     }
 
     calculate_new_system();
 
     calculate_new_system();
  
     function calculate(all_P) {
+
     function calculate(P) {
 
         var t1 = performance.now();
 
         var t1 = performance.now();
 
         while (t < T) {
 
         while (t < T) {
Строка 140: Строка 105:
 
             var Kin = 0;
 
             var Kin = 0;
 
             var Pot = 0;
 
             var Pot = 0;
             for (var p = 0; p < all_P.length; p++) {
+
             for (var j = 1; j < n - 1; j++) {Kin += P[j].v * P[j].v;}
                var P = all_P[p];
+
            for (var j = 1; j < n - 1; j++) {Pot += Math.pow(P[j].u - P[j - 1].u, 2);}
                for (var j = 1; j < n - 1; j++) {Kin += P[j].v * P[j].v;}
+
             Kin = Kin * m;
                for (var j = 1; j < n - 1; j++) {Pot += Math.pow(P[j].u - P[j - 1].u, 2);}
+
             Pot = Pot * C;
            }
 
             Kin = Kin * m / all_P.length;
 
             Pot = Pot * C / all_P.length;
 
 
             data_K.push(Kin);
 
             data_K.push(Kin);
 
             data_P.push(Pot);
 
             data_P.push(Pot);
Строка 152: Строка 114:
  
 
             // расчет состояния системы на следующем шаге
 
             // расчет состояния системы на следующем шаге
             for (var p = 0; p < all_P.length; p++) {
+
             for (var i = 1; i < n - 1; i++) {
                var P = all_P[p];
+
                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].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;
                for (var i = 1; i < n - 1; i++) {
 
                    P[i].u += P[i].v * dt;
 
                }
 
 
             }
 
             }
 
             t += dt;
 
             t += dt;
            step++;
 
  
 
             // промежуточная прорисовка результатов, работа прогресс-бара
 
             // промежуточная прорисовка результатов, работа прогресс-бара
 
             if ((performance.now() - t1) > 200) {
 
             if ((performance.now() - t1) > 200) {
                 if (working) {
+
                 draw();
                    draw();
+
                setTimeout( function(){calculate(P); }, 10);
                    setTimeout( function(){calculate(all_P); }, 10);
+
                div_container_progress.style.display = "block";
                    div_container_progress.style.display = "block";
+
                button_start.style.display = "none";
                    progress_bar.style.width = Math.round(t / T * 100) + "%";
+
                progress_bar.style.width = Math.round(t / T * 100) + "%";
                    span_progress.innerHTML = (t / T * 100).toFixed(0) + "%";
+
                span_progress.innerHTML = (t / T * 100).toFixed(0) + "%";
                } else {
 
                    stop();
 
                }
 
 
                 return;
 
                 return;
 
             }
 
             }
 
         }
 
         }
        stop();
 
    }
 
    function stop() {
 
 
         // окончательная прорисовка результатов, удаление прогресс-бара, вывод скорости расчета
 
         // окончательная прорисовка результатов, удаление прогресс-бара, вывод скорости расчета
 
         draw();
 
         draw();
 
         div_container_progress.style.display = "none";
 
         div_container_progress.style.display = "none";
 
         button_start.style.display = "inline";
 
         button_start.style.display = "inline";
        button_stop.style.display = "none";
 
 
         div_calc_speed.style.display = "block";
 
         div_calc_speed.style.display = "block";
         span_time_calc.innerHTML = parseFloat(((performance.now() - t_start) * 1000 * 1000 / N / R / step).toPrecision(2));
+
         span_time_calc.innerHTML = parseFloat(((performance.now() - t_start) * 1000 * 1000 / N / Math.ceil(T/dt)).toPrecision(2));
 
         return true;
 
         return true;
 
     }
 
     }
Строка 193: Строка 144:
 
     function draw() {
 
     function draw() {
 
         ctx.clearRect(0, 0, w, h);              // очистка экрана
 
         ctx.clearRect(0, 0, w, h);              // очистка экрана
 
        if (checkbox_Bessel.checked) {
 
            // Функция Бесселя первого рода в точке 0
 
            ctx.strokeStyle = "#00dd00";
 
            ctx.lineWidth = 2;
 
            ctx.beginPath();
 
            ctx.moveTo(0, h - data_E[data_E.length - 1] * besselj(4 * Math.sqrt(C / m) * 0, 0) / data_K[0] * h / 2 - h / 2);
 
            for (var i = 0.001; i < t; i += 0.001) {
 
                ctx.lineTo(i / t * w, h - data_E[data_E.length - 1] * besselj(4 * Math.sqrt(C / m) * i, 0) / data_K[0] * h / 2 - h / 2);
 
            }
 
            ctx.stroke();
 
        }
 
  
 
         if (checkbox_K.checked) {
 
         if (checkbox_K.checked) {
Строка 260: Строка 199:
 
         en:"Full energy",
 
         en:"Full energy",
 
         ru:"Полная энергия"
 
         ru:"Полная энергия"
    }, span_txt_Bessel:{
 
        field:"innerHTML",
 
        en:"Analytical sol. for the kinetic energy",
 
        ru:"Аналит. решение для кин. энергии"
 
 
     }, button_start:{
 
     }, button_start:{
 
         field:"value",
 
         field:"value",
 
         en:"Start",
 
         en:"Start",
 
         ru:"Старт"
 
         ru:"Старт"
    }, button_stop:{
 
        field:"value",
 
        en:"Stop",
 
        ru:"Стоп"
 
 
     }, span_progress_txt:{
 
     }, span_progress_txt:{
 
         field:"innerHTML",
 
         field:"innerHTML",
Строка 280: Строка 211:
 
         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_molecular_dynamics:{
+
     }, span_txt_nubmer_of_particles:{
 
         field:"innerHTML",
 
         field:"innerHTML",
         en:"Molecular_dynamics:",
+
         en:"Number of particles:",
        ru:"Молекулярная динамика:"
+
         ru:"Количество частиц:"
    }, span_txt_particles:{
 
        field:"innerHTML",
 
        en:"particles",
 
         ru:"частиц"
 
    }, span_txt_realizations:{
 
        field:"innerHTML",
 
        en:"realizations",
 
        ru:"реализаций"
 
 
     }, span_txt_calc_time:{
 
     }, span_txt_calc_time:{
 
         field:"innerHTML",
 
         field:"innerHTML",
Строка 331: Строка 254:
 
     <script src="Bessel_fluctuations.js"></script>
 
     <script src="Bessel_fluctuations.js"></script>
 
     <script src="Lang/Lang.js"></script>
 
     <script src="Lang/Lang.js"></script>
    <script src="Libs/bessel.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}
Строка 340: Строка 262:
 
     <table style="border-collapse:collapse;">
 
     <table style="border-collapse:collapse;">
 
         <tr><td style="text-align: center; vertical-align: top; width: 25px;">
 
         <tr><td style="text-align: center; vertical-align: top; width: 25px;">
            <div id="div_txt_J0" style="color: #00dd00; font-style:italic;">K<sub>J</sub></div>
 
 
             <div id="div_txt_K" style="color: #ff0000; font-style:italic;">K</div>
 
             <div id="div_txt_K" style="color: #ff0000; font-style:italic;">K</div>
 
             <div id="div_txt_P" style="color: #0000ff; font-style:italic;"></div>
 
             <div id="div_txt_P" style="color: #0000ff; font-style:italic;"></div>
Строка 353: Строка 274:
 
             <tr>
 
             <tr>
 
                 <td style="width: 270px">
 
                 <td style="width: 270px">
                    <input type="checkbox" id="checkbox_Bessel" checked/><font color="#00dd00" size="5"><B>—</B></font> <span id="span_txt_Bessel"></span> <br>
 
 
                     <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_K" checked/><font color="#ff0000" size="5"><B>—</B></font> <span id="span_kin_energy"></span> <br>
                     <input type="checkbox" id="checkbox_P"/><font color="#0000ff" size="5"><B>—</B></font> <span id="span_pot_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"/><font color="#880088" size="5"><B>—</B></font> <span id="span_full_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>
 
                 </td><td>
                     <input type="button" id="button_start" style="background:#fb4;border-radius: 5px;color:#000; font-weight: bold;"/>
+
                     <input type="button" id="button_start" style="background:#fb4;border-radius: 5px;color:#000; font-weight: bold;"/><br>
                    <input type="button" id="button_stop" style="background:#fb4;border-radius: 5px;color:#000; font-weight: bold; display:none"/><br>
 
 
                     <input type="image" src="Lang/RU.png" onclick="set_lang('ru')"/>
 
                     <input type="image" src="Lang/RU.png" onclick="set_lang('ru')"/>
 
                     <input type="image" src="Lang/GB.png" onclick="set_lang('en')"/><br>
 
                     <input type="image" src="Lang/GB.png" onclick="set_lang('en')"/><br>
Строка 378: Строка 297:
 
                     <table class="inner">
 
                     <table class="inner">
 
                         <tr>
 
                         <tr>
                             <td>
+
                             <td><span id="span_txt_nubmer_of_particles"></span></td>
                                <span id="span_txt_molecular_dynamics"></span>
+
                             <td><input type="number" id="N_number" step="1" min="2" style="width: 70px;"/></td>
                            </td>
+
                         </tr>
                        </tr><tr>
+
                        <tr>
                             <td>
+
                             <td><span id="span_txt_calc_time"></span></td>
                                <input type="number" id="N_number" step="1" min="2" style="width: 70px;"/> <span id="span_txt_particles"></span>,
+
                             <td><input type="number" id="periods_number" step="0.1" min="0" style="width: 70px;"/> <span id="span_txt_periods"></span></td>
                                <input type="number" id="R_number" step="1" min="1" style="width: 70px;"/> <span id="span_txt_realizations"></span><br><br>
 
                            </td>
 
                         </tr><tr>
 
                             <td>
 
                                <span id="span_txt_calc_time"></span>
 
                            </td>
 
                        </tr><tr>
 
                             <td>
 
                                <input type="number" id="periods_number" step="0.1" min="0" style="width: 70px;"/> <span id="span_txt_periods"></span>
 
                            </td>
 
 
                         </tr>
 
                         </tr>
 
 
                     </table>
 
                     </table>
 
                 </td>
 
                 </td>
Строка 409: Строка 317:
 
</div>
 
</div>
 
</div>
 
</div>
 
== Старые версии программы ==
 
* [[Колебания энергий в одномерном кристалле v2.5]]
 
  
 
[[Category: Виртуальная лаборатория]]
 
[[Category: Виртуальная лаборатория]]
 
[[Category: Программирование]]
 
[[Category: Программирование]]
[[Category: Проект "Термокристалл"]]
 
Вам запрещено изменять защиту статьи. Edit Создать редактором

Обратите внимание, что все добавления и изменения текста статьи рассматриваются как выпущенные на условиях лицензии Public Domain (см. Department of Theoretical and Applied Mechanics:Авторские права). Если вы не хотите, чтобы ваши тексты свободно распространялись и редактировались любым желающим, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого.
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ МАТЕРИАЛЫ, ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ!

To protect the wiki against automated edit spam, we kindly ask you to solve the following CAPTCHA:

Отменить | Справка по редактированию  (в новом окне)