Периодические граничные условия — различия между версиями

Материал из Department of Theoretical and Applied Mechanics
Перейти к: навигация, поиск
(Результаты)
(Результаты)
Строка 44: Строка 44:
 
{{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Tenitskaya/OneBall/OneBall.html |width=1400|height=450 |border=0 }}
 
{{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Tenitskaya/OneBall/OneBall.html |width=1400|height=450 |border=0 }}
 
[[Медиа:OneBall.rar|Скачать архив]]
 
[[Медиа:OneBall.rar|Скачать архив]]
 +
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 +
'''Текст программы на языке JavaScript (разработчик [[Теницкая Татьяна]]):''' <div class="mw-collapsible-content">
 +
Файл '''"OneBall.js"'''
 +
<syntaxhighlight lang="javascript" line start="1" enclose="div">
 +
function main_particle_1() {
 +
 +
    var ctx = canvas_particle_1.getContext("2d");
 +
var w = canvas_particle_1.width; //длина
 +
    var h = canvas_particle_1.height; //высота
 +
 +
 +
var w_1 = w/3;
 +
var h_1 = h/3;
 +
 +
rx = new Array(0, w_1, 2*w_1, 0, w_1, 2*w_1, 0, w_1, 2*w_1);
 +
ry = new Array(60, 60, 60, 60 + h_1, 60 + h_1, 60 + h_1, 60 + 2*h_1, 60 + 2*h_1, 60 + 2*h_1);
 +
 +
// координаты шара
 +
    var v0 = 1;                      // скорость шара
 +
    var r = 7;                                // радиус шара
 +
    var dt = 5;
 +
var alfa = 45 / 180 * Math.PI;
 +
var steps = 0;
 +
 +
function step()
 +
{                         
 +
tick();
 +
draw();
 +
}
 +
 +
var vGraph = new TM_graph(                  // определить график
 +
"#vGraph",                              // на html-элементе #vGraph
 +
250,                                    // сколько шагов по оси "x" отображается
 +
-1, 1,0.2);                          // мин. значение оси Y, макс. значение оси Y, шаг по оси Y
 +
 +
function tick()
 +
{
 +
for (i = 0; i < rx.length; i++)
 +
{
 +
vx = v0 * Math.cos(alfa);
 +
vy = v0 * Math.sin(alfa);
 +
steps+=1;
 +
 +
rx[i] += vx*dt;
 +
ry[i] += vy*dt;
 +
 +
 +
if (rx[i] >= w)
 +
{
 +
rx[i] = rx[i] - w;
 +
}
 +
 +
if (rx[i] <= 0)
 +
{
 +
rx[i] = rx[i] + w;
 +
}
 +
 +
if (ry[i] >= h)
 +
{
 +
ry[i] = ry[i] - h;
 +
}
 +
 +
if (ry[i] <= 0)
 +
{
 +
ry[i] = ry[i] + h;
 +
}
 +
}
 +
 +
var L = (rx[8] * vy - ry[8] * vx)/240.4164;
 +
 +
console.log(L);
 +
 +
if (dt % 0.5 == 0) vGraph.graphIter(steps, L);  // подать данные на график
 +
}
 +
 +
 +
 +
 +
function draw()
 +
{
 +
ctx.clearRect(0, 0, w , h );    // очистить экран
 +
for (var i = 0; i < rx.length; i++)
 +
{
 +
var xS = rx[i];         
 +
var yS = ry[i];
 +
 +
 +
ctx.beginPath();
 +
ctx.fillStyle = "#00008B";
 +
ctx.arc(xS, yS, r , 0, 2 * Math.PI, false);
 +
ctx.closePath();
 +
ctx.fill();
 +
 +
ctx.beginPath();                                // начать рисование
 +
ctx.fillStyle="#000000";
 +
ctx.moveTo(w_1, 0);                            // переместить "карандаш" в точку
 +
ctx.lineTo(w_1, h);                          // нарисовать "карандашом" линию до точки
 +
ctx.stroke();
 +
 +
ctx.beginPath();
 +
ctx.fillStyle="#000000";
 +
ctx.moveTo(2*w_1, 0);                           
 +
ctx.lineTo(2*w_1, h);                           
 +
ctx.stroke();
 +
 +
ctx.beginPath(); 
 +
ctx.fillStyle="#000000";
 +
ctx.moveTo(0, h_1);                           
 +
ctx.lineTo(w, h_1);                           
 +
ctx.stroke();
 +
 +
ctx.beginPath();
 +
ctx.fillStyle="#000000";
 +
ctx.moveTo(0, 2*h_1);                           
 +
ctx.lineTo(w, 2*h_1);                           
 +
ctx.stroke();
 +
 +
}
 +
}
 +
 +
 +
setInterval(step, 1000/100);              // функция step будет запускаться 60 раз в секунду (60 раз / 1000 мс)
 +
 +
}
  
 
{{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Tenitskaya/TwoBalls/TwoBalls.html |width=1400|height=450 |border=0 }}
 
{{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Tenitskaya/TwoBalls/TwoBalls.html |width=1400|height=450 |border=0 }}

Версия 22:25, 4 февраля 2016

Виртуальная лаборатория>Периодические граничные условия

Курсовой проект по механике дискретных сред

Краткое описание

Метод периодических граничных условий был разработан для решения задач теории жидкостей и плотных газов. Он состоит в том,что вокруг расчетной области строятся ее «образы» с актуальным положением частиц. И частицы «реальной» области взаимодействуют с частицами в «образе», а если частица пересекает границу расчетной области, она появляется с другой стороны.
В теореме Нетер утверждается, что каждой непрерывной симметрии физической системы соответствует некоторый закон сохранения:
  • однородности времени соответствует закон сохранения энергии,
  • однородности пространства соответствует закон сохранения импульса,
  • изотропии пространства соответствует закон сохранения момента импульса,
  • калибровочной симметрии соответствует закон сохранения электрического заряда и т. д.
Но для классической системы частиц с периодическими условиями сохранение момента импульса нарушается. Этот эффект наглядно проиллюстрирован в данной курсовой работе.

Цель проекта

  • Визуализация системы частиц с периодическими граничными условиями.
  • Построение графиков зависимости кинетического момента от времени для одной частицы, двух частиц, многих частиц.

Математическая модель

Граничные условия:

если [math]x \gt w[/math], то [math]x = x - w[/math]

если [math] x \lt 0 [/math], то [math] x = x + w [/math]

если [math] y \gt h [/math], то [math] y = y - h [/math]

если [math] y \lt 0 [/math], то [math] y = y + h [/math]

Где x и у - это координаты частицы, а w и h - ширина и длина окна соответственно.

Кинетический момент вычисляется по формуле: [math]L(t) = \sum_{i\in\wedge(t)} r_i\times mV_i [/math]

Результаты


Скачать архив

Текст программы на языке JavaScript (разработчик Теницкая Татьяна):

Файл "OneBall.js" <syntaxhighlight lang="javascript" line start="1" enclose="div"> function main_particle_1() {

   var ctx = canvas_particle_1.getContext("2d");

var w = canvas_particle_1.width; //длина

   var h = canvas_particle_1.height;				//высота


var w_1 = w/3; var h_1 = h/3;

rx = new Array(0, w_1, 2*w_1, 0, w_1, 2*w_1, 0, w_1, 2*w_1); ry = new Array(60, 60, 60, 60 + h_1, 60 + h_1, 60 + h_1, 60 + 2*h_1, 60 + 2*h_1, 60 + 2*h_1);

// координаты шара

   var v0 = 1;                       							// скорость шара
   var r = 7;                                 				// радиус шара
   var dt = 5;											

var alfa = 45 / 180 * Math.PI; var steps = 0;

function step() { tick(); draw(); }

var vGraph = new TM_graph( // определить график "#vGraph", // на html-элементе #vGraph 250, // сколько шагов по оси "x" отображается -1, 1,0.2); // мин. значение оси Y, макс. значение оси Y, шаг по оси Y

function tick() { for (i = 0; i < rx.length; i++) { vx = v0 * Math.cos(alfa); vy = v0 * Math.sin(alfa); steps+=1;

rx[i] += vx*dt; ry[i] += vy*dt;


if (rx[i] >= w) { rx[i] = rx[i] - w; }

if (rx[i] <= 0) { rx[i] = rx[i] + w; }

if (ry[i] >= h) { ry[i] = ry[i] - h; }

if (ry[i] <= 0) { ry[i] = ry[i] + h; } }

var L = (rx[8] * vy - ry[8] * vx)/240.4164;

console.log(L);

if (dt % 0.5 == 0) vGraph.graphIter(steps, L); // подать данные на график }



function draw() { ctx.clearRect(0, 0, w , h ); // очистить экран for (var i = 0; i < rx.length; i++) { var xS = rx[i]; var yS = ry[i];


ctx.beginPath(); ctx.fillStyle = "#00008B"; ctx.arc(xS, yS, r , 0, 2 * Math.PI, false); ctx.closePath(); ctx.fill();

ctx.beginPath(); // начать рисование ctx.fillStyle="#000000"; ctx.moveTo(w_1, 0); // переместить "карандаш" в точку ctx.lineTo(w_1, h); // нарисовать "карандашом" линию до точки ctx.stroke();

ctx.beginPath(); ctx.fillStyle="#000000"; ctx.moveTo(2*w_1, 0); ctx.lineTo(2*w_1, h); ctx.stroke();

ctx.beginPath(); ctx.fillStyle="#000000"; ctx.moveTo(0, h_1); ctx.lineTo(w, h_1); ctx.stroke();

ctx.beginPath(); ctx.fillStyle="#000000"; ctx.moveTo(0, 2*h_1); ctx.lineTo(w, 2*h_1); ctx.stroke();

} }


setInterval(step, 1000/100); // функция step будет запускаться 60 раз в секунду (60 раз / 1000 мс)

}

Скачать архив

Скачать архив