Периодические граничные условия — различия между версиями
(→Результаты) |
(→Результаты) |
||
Строка 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
Виртуальная лаборатория>Периодические граничные условияСодержание
Курсовой проект по механике дискретных сред
- разработчик Теницкая Татьяна
- руководитель Кузькин Виталий
Краткое описание
- Метод периодических граничных условий был разработан для решения задач теории жидкостей и плотных газов. Он состоит в том,что вокруг расчетной области строятся ее «образы» с актуальным положением частиц. И частицы «реальной» области взаимодействуют с частицами в «образе», а если частица пересекает границу расчетной области, она появляется с другой стороны.
- В теореме Нетер утверждается, что каждой непрерывной симметрии физической системы соответствует некоторый закон сохранения:
- однородности времени соответствует закон сохранения энергии,
- однородности пространства соответствует закон сохранения импульса,
- изотропии пространства соответствует закон сохранения момента импульса,
- калибровочной симметрии соответствует закон сохранения электрического заряда и т. д.
- Но для классической системы частиц с периодическими условиями сохранение момента импульса нарушается. Этот эффект наглядно проиллюстрирован в данной курсовой работе.
Цель проекта
- Визуализация системы частиц с периодическими граничными условиями.
- Построение графиков зависимости кинетического момента от времени для одной частицы, двух частиц, многих частиц.
Математическая модель
Граничные условия:
если
, тоесли
, тоесли
, тоесли
, тоГде x и у - это координаты частицы, а w и h - ширина и длина окна соответственно.
Кинетический момент вычисляется по формуле:
Результаты
Файл "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 мс)
}
Скачать архив