Редактирование: Статистические распределения в двумерном кристалле с треугольной решеткой

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

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

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 1: Строка 1:
[[ТМ|Кафедра ТМ]] > [[Проект "Термокристалл"]] > [[Статистические распределения в двумерном кристалле с треугольной решеткой]] <HR>
+
[[Виртуальная лаборатория]] > [[Статистические распределения в двумерном кристалле с треугольной решеткой]]
[[Виртуальная лаборатория]] > [[Статистические распределения в двумерном кристалле с треугольной решеткой]] <HR>
 
  
 
Рассматривается система частиц моделируемых материальными точками с линейным законом взаимодействия
 
Рассматривается система частиц моделируемых материальными точками с линейным законом взаимодействия
Строка 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=2050 |border=0 }}
+
{{#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;
 
    var ctx_V = canvas_nubes_V.getContext("2d");    // для рисования облака
 
    var width_V = canvas_nubes_V.width;
 
    var height_V = canvas_nubes_V.height;
 
 
    var ctx_U = canvas_nubes_U.getContext("2d");    // для рисования облака
 
    var width_U = canvas_nubes_U.width;
 
    var height_U = canvas_nubes_U.height;
 
  
 
     // частица содержит перемещения и скорости
 
     // частица содержит перемещения и скорости
Строка 57: Строка 48:
 
     var _Vx;
 
     var _Vx;
 
     var _Vy;
 
     var _Vy;
     var Vx2_sum;         // сумма квадратов координат скорости Vx (с весом s)
+
     var Vx2_sum; // сумма квадратов координат скорости Vx (с весом s)
     var Vxy_sum;         // сумма произведений координат скорости VxVy (с весом s)
+
     var Vxy_sum; // сумма произведений координат скорости VxVy (с весом s)
     var Vy2_sum;         // сумма квадратов координат скорости Vy (с весом s)
+
     var Vy2_sum; // сумма квадратов координат скорости Vy (с весом s)
     var Vx4_sum;         // сумма (координат скорости Vx)^4 (с весом s)
+
     var Vx4_sum; // сумма (координат скорости Vx)^4 (с весом s)
     var Vy4_sum;         // сумма (координат скорости Vy)^4 (с весом s)
+
     var Vy4_sum; // сумма (координат скорости Vy)^4 (с весом s)
 
     var U1x_sum, U1y_sum;
 
     var U1x_sum, U1y_sum;
     var Vx2_av;         // средний Vx^2 c эксп. весом (для графиков)
+
     var Vx2_av; // средний Vx^2 c эксп. весом (для графиков)
     var Vy2_av;         // средний Vy^2 c эксп. весом
+
     var Vy2_av; // средний Vy^2 c эксп. весом
  
     var suspended = 0;   // вычисление приостановлено == 1
+
     var suspended = 0; // вычисление приостановлено == 1
  
 
     // массив частиц
 
     // массив частиц
Строка 72: Строка 63:
 
     var Arr_prt = [];
 
     var Arr_prt = [];
  
     var n1 = 30;         // число рядов 1
+
     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;       // начальные координаты скорости имеют нормальное распределение == 1
+
     var norm = 0; // начальные координаты скорости имеют нормальное распределение == 1
     var Par = [];       // возвращаемое значение функции RandomNorm()
+
     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)
+
         if (!suspended)
         //{
+
         {
        Calculate();        // шаг интегрирования по времени
+
            Calculate();        // шаг интегрирования по времени
        ExCalculate(k_sen);  // подготовка для вывода графиков
+
            ExCalculate(k_sen);  // подготовка для вывода графиков
  
        s++;
+
            s++;
        Paint();            // рисование графиков
+
            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;
       
 
        DrawNubes(ctx_V, width_V, height_V, 0/*n_can*/);
 
        DrawNubes(ctx_U, width_U, height_U, 1/*n_can*/);
 
 
     }
 
     }
  
Строка 456: Строка 445:
 
         if (sV_axis)
 
         if (sV_axis)
 
         {
 
         {
            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);
+
        /*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;
 
            ctx.strokeStyle = "#006000";
 
            ctx.beginPath();
 
  
 
             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();
 
             }
 
             }
 
            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();
    }
 
 
    function DrawNubes(ctx, width, height, n_can)  // рисования облака
 
    {
 
        ctx.strokeStyle="#000000";
 
        ctx.lineWidth=1;                        // ширина линии
 
        ctx.clearRect(0, 0, width, height);    // очистить экран
 
        ctx.beginPath();
 
 
        if (n_can == 0)
 
        {
 
            for (var k = 0; k < n; k++)
 
            {
 
                i = k%n1;
 
                j = Math.floor(k/n1);
 
 
                var x = Math.floor((Arr_prt[j][i].Vx/V_max+1)*width/2);
 
                var y = Math.floor((Arr_prt[j][i].Vy/V_max+1)*height/2);
 
                ctx.moveTo(x-1, y);
 
                ctx.lineTo(x+1, y);
 
            }
 
 
            ctx.stroke();
 
        }
 
        else
 
        {
 
            for (var k = 0; k < n; k++)
 
            {
 
                i = k%n1;
 
                j = Math.floor(k/n1);
 
 
                var x = Math.floor((Arr_prt[j][i].Ux/V_max+1)*width/2);
 
                var y = Math.floor((Arr_prt[j][i].Uy/V_max+1)*height/2);
 
                ctx.moveTo(x-1, y);
 
                ctx.lineTo(x+1, y);
 
            }
 
 
            ctx.stroke();
 
        }
 
 
     }
 
     }
  
Строка 690: Строка 649:
 
         Restart();
 
         Restart();
 
     };
 
     };
   
 
    var StepIntID;
 
 
     suspend_calc.onclick = function()
 
     suspend_calc.onclick = function()
 
     {
 
     {
 
         suspended = !suspended;
 
         suspended = !suspended;
       
 
        if (suspended) clearInterval(StepIntID);
 
        else          StepIntID=setInterval(Step, 1000 / 30);
 
 
 
         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;
 
        str = suspend_calc1.value;
 
        suspend_calc1.value = suspend_calc1.name;
 
        suspend_calc1.name = str;
 
 
     };
 
     };
    reset_calc1.onclick = reset_calc.onclick;
 
    suspend_calc1.onclick = suspend_calc.onclick;
 
 
     number_input_n1.oninput = function()
 
     number_input_n1.oninput = function()
 
     {
 
     {
Строка 757: Строка 704:
  
 
     Restart();
 
     Restart();
     StepIntID=setInterval(Step, 1000 / 30);              // функция step будет запускаться 30 раз в секунду (в 1000 мс)
+
     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();" style="font-family: Arial; font-size: 13.5px;
+
<body onload="MainTriLatticeTemper();">
border-top:solid 1.5pt; border-bottom:solid 1.5pt;">
 
 
     <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-->
+
     <!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>
 
    <table>
 
        <tr>
 
            <td></td><td style="text-align: center"><B>Скорости частиц</B></td>
 
            <td></td><td style="text-align: center"><B>Перемещения частиц</B></td>
 
        </tr>
 
        <tr><td><I><B>V<SUB>y</SUB></B></I></td>
 
            <td><canvas id="canvas_nubes_V" width="400" height="400" style="border:
 
                1px solid #000000"></canvas></td>
 
            <td  width=100 style="text-align: right"><I><B>U<SUB>y</SUB></B></I></td>
 
            <td><canvas id="canvas_nubes_U" width="400" height="400" style="border:
 
                1px solid #000000"></canvas></td>
 
        </tr>
 
        <tr><td></td><td style="text-align: center"><I><B>V<SUB>x</SUB></B></I></td>
 
            <td></td><td style="text-align: center"><I><B>U<SUB>x</SUB></B></I></td>
 
        </tr>
 
    </table>
 
    <br>
 
    <input type="button" id="reset_calc1" value="Старт">
 
    <input type="button" id="suspend_calc1" value="Приостановить" name = "Возобновить">
 
    <br>
 
    <br>
 
 
</body>
 
</body>
 
</html>
 
</html>
Строка 915: Строка 839:
 
[[Category: Виртуальная лаборатория]]
 
[[Category: Виртуальная лаборатория]]
 
[[Category: Программирование]]
 
[[Category: Программирование]]
[[Category: Проект "Термокристалл"]]
 
 
[[Category: JavaScript]]
 
[[Category: JavaScript]]
Вам запрещено изменять защиту статьи. 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:

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