Редактирование: Периодические граничные условия
Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.
Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия | Ваш текст | ||
Строка 42: | Строка 42: | ||
===Результаты=== | ===Результаты=== | ||
<br /> | <br /> | ||
− | {{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Tenitskaya/OneBall/ | + | {{#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%" > | <div class="mw-collapsible mw-collapsed" style="width:100%" > | ||
'''Текст программы на языке JavaScript (разработчик [[Теницкая Татьяна]]):''' <div class="mw-collapsible-content"> | '''Текст программы на языке JavaScript (разработчик [[Теницкая Татьяна]]):''' <div class="mw-collapsible-content"> | ||
− | Файл '''" | + | Файл '''"OneBall.js"''' |
<syntaxhighlight lang="javascript" line start="1" enclose="div"> | <syntaxhighlight lang="javascript" line start="1" enclose="div"> | ||
function main_particle_1() { | function main_particle_1() { | ||
var ctx = canvas_particle_1.getContext("2d"); | var ctx = canvas_particle_1.getContext("2d"); | ||
− | var | + | var w = canvas_particle_1.width; //длина |
− | var | + | var h = canvas_particle_1.height; //высота |
− | |||
− | |||
− | |||
− | |||
− | |||
− | var | + | var w_1 = w/3; |
− | var | + | 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 alfa = 45 / 180 * Math.PI; | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
var steps = 0; | var steps = 0; | ||
− | + | ||
− | |||
function step() | function step() | ||
− | { | + | { |
tick(); | tick(); | ||
draw(); | draw(); | ||
} | } | ||
− | + | ||
+ | var vGraph = new TM_graph( // определить график | ||
"#vGraph", // на html-элементе #vGraph | "#vGraph", // на html-элементе #vGraph | ||
− | + | 250, // сколько шагов по оси "x" отображается | |
-1, 1,0.2); // мин. значение оси Y, макс. значение оси Y, шаг по оси Y | -1, 1,0.2); // мин. значение оси Y, макс. значение оси Y, шаг по оси Y | ||
− | |||
− | |||
− | |||
− | steps += 1; | + | 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() | function draw() | ||
{ | { | ||
− | ctx.clearRect(0, 0, | + | ctx.clearRect(0, 0, w , h ); // очистить экран |
− | + | for (var i = 0; i < rx.length; i++) | |
− | var | + | { |
− | var | + | var xS = rx[i]; |
− | + | var yS = ry[i]; | |
− | + | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
ctx.beginPath(); | ctx.beginPath(); | ||
ctx.fillStyle = "#00008B"; | ctx.fillStyle = "#00008B"; | ||
− | ctx.arc( | + | ctx.arc(xS, yS, r , 0, 2 * Math.PI, false); |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
ctx.closePath(); | ctx.closePath(); | ||
ctx.fill(); | ctx.fill(); | ||
− | + | ctx.beginPath(); // начать рисование | |
− | ctx.beginPath(); | ||
ctx.fillStyle="#000000"; | ctx.fillStyle="#000000"; | ||
− | ctx.moveTo( | + | ctx.moveTo(w_1, 0); // переместить "карандаш" в точку |
− | ctx.lineTo( | + | ctx.lineTo(w_1, h); // нарисовать "карандашом" линию до точки |
ctx.stroke(); | ctx.stroke(); | ||
ctx.beginPath(); | ctx.beginPath(); | ||
ctx.fillStyle="#000000"; | ctx.fillStyle="#000000"; | ||
− | ctx.moveTo(2 * | + | ctx.moveTo(2*w_1, 0); |
− | ctx.lineTo(2 * | + | ctx.lineTo(2*w_1, h); |
ctx.stroke(); | ctx.stroke(); | ||
ctx.beginPath(); | ctx.beginPath(); | ||
ctx.fillStyle="#000000"; | ctx.fillStyle="#000000"; | ||
− | ctx.moveTo(0, | + | ctx.moveTo(0, h_1); |
− | ctx.lineTo( | + | ctx.lineTo(w, h_1); |
ctx.stroke(); | ctx.stroke(); | ||
ctx.beginPath(); | ctx.beginPath(); | ||
ctx.fillStyle="#000000"; | ctx.fillStyle="#000000"; | ||
− | ctx.moveTo(0, 2 * | + | ctx.moveTo(0, 2*h_1); |
− | ctx.lineTo( | + | ctx.lineTo(w, 2*h_1); |
ctx.stroke(); | ctx.stroke(); | ||
+ | |||
+ | } | ||
} | } | ||
− | + | ||
− | + | ||
+ | setInterval(step, 1000/100); // функция step будет запускаться 100 раз в секунду (100 раз / 1000 мс) | ||
+ | |||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 446: | Строка 382: | ||
</div> | </div> | ||
− | {{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Tenitskaya/NBalls/ | + | {{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Tenitskaya/NBalls/NBalls.html |width=1400|height=450 |border=0 }} |
− | + | [[Медиа:NBalls.rar|Скачать архив]] | |
− | [[Медиа: | ||
<div class="mw-collapsible mw-collapsed" style="width:100%" > | <div class="mw-collapsible mw-collapsed" style="width:100%" > | ||
'''Текст программы на языке JavaScript (разработчик [[Теницкая Татьяна]]):''' <div class="mw-collapsible-content"> | '''Текст программы на языке JavaScript (разработчик [[Теницкая Татьяна]]):''' <div class="mw-collapsible-content"> | ||
− | Файл '''" | + | Файл '''"NBalls.js"''' |
<syntaxhighlight lang="javascript" line start="1" enclose="div"> | <syntaxhighlight lang="javascript" line start="1" enclose="div"> | ||
− | function main_particle_1() { | + | function main_particle_1(canvas_particle_1)//,canvas_particle_2,canvas_particle_3,canvas_particle_4,canvas_particle_5,canvas_particle_6,canvas_particle_7,canvas_particle_8,canvas_particle_9) { |
− | + | { | |
+ | |||
var ctx = canvas_particle_1.getContext("2d"); | var ctx = canvas_particle_1.getContext("2d"); | ||
− | var | + | var W = canvas_particle_1.width; |
− | var | + | var H = canvas_particle_1.height; |
− | |||
− | |||
+ | var dx = 10; | ||
+ | var w = W/3 - dx; | ||
+ | var h = H/3 - dx; | ||
var r = 7; | var r = 7; | ||
− | var N = | + | var N = 15;//количество частиц |
− | rx = new Array(); | + | |
− | ry = new Array(); | + | var a0 = w*0.1; //равновесное расстояние |
− | + | var D = 100;//удельная энергия коэффициент в формуле силы | |
− | + | rx = new Array();//Содержит координаты частиц по оси Х | |
− | vx = new Array(); | + | ry = new Array();//Содержит координаты частиц по оси У |
− | vy = new Array(); | + | vx = new Array();//Скорость по Х |
− | + | vy = new Array();//Скорость по У | |
− | |||
− | |||
L = new Array(); | L = new Array(); | ||
− | var | + | num_canv = new Array(); |
− | var | + | var mod_f = 0;//модуль силы |
− | var | + | var f = 0; |
− | var | + | var rass = 0;//расстояние между частицами |
− | var | + | var fx_i= 0;//сила по х |
− | dt = 0. | + | var fy_i = 0;//сида по у |
− | + | var dt = 0.0025;//шаг интегрирования | |
− | + | v = new Array(0,0,0); | |
− | for ( | + | //==========Заготовки для создания начальных конфигураций====== |
+ | for (j = 0;j<N;j++)//начальные скорости | ||
{ | { | ||
− | + | vx[j] = Math.random()*10;//Math.random(); | |
− | + | vy[j] = Math.random()*10;//Math.random() ; | |
− | |||
− | |||
− | |||
− | |||
} | } | ||
− | + | var kol = 0; | |
− | var kol = | ||
var prx = 0; | var prx = 0; | ||
var pry = 0; | var pry = 0; | ||
var dist = 0; | var dist = 0; | ||
var f; | var f; | ||
− | rx[0] = Math.random() * ( | + | rx[0] = Math.random() * w; //w*(0.5+(j-2)*0.15); |
− | ry[0] = Math.random() * | + | ry[0] = Math.random() * h;//h/2; |
− | while (kol < N) | + | kol = 1; |
+ | while (kol<N) | ||
{ | { | ||
− | f = 0; | + | f =0; |
− | prx = Math.random() * ( | + | prx = Math.random() * w; //w*(0.5+(j-2)*0.15); |
− | pry = Math.random() * | + | pry = Math.random() * h;//h/2; |
− | for (i = 0; i < kol; i++) | + | for (i = 0; i < kol;i++) |
{ | { | ||
− | dist = Math.pow((rx[i] - prx),2)+Math.pow((ry[i] - pry),2); | + | dist = Math.pow((rx[i]-prx),2)+Math.pow((ry[i]-pry),2); |
− | if (dist < Math.pow(2 * a0,2)) | + | if (dist<Math.pow(2*a0,2)) |
{ | { | ||
f = f+1; | f = f+1; | ||
Строка 513: | Строка 445: | ||
if (f==0) | if (f==0) | ||
{ | { | ||
− | rx[kol] = prx; | + | rx[kol] = prx; //w*(0.5+(j-2)*0.15); |
− | ry[kol] = pry; | + | ry[kol] = pry;//h/2; |
kol++; | kol++; | ||
} | } | ||
} | } | ||
− | |||
+ | //================================================ | ||
+ | var steps = 0; | ||
+ | |||
function step() | function step() | ||
{ | { | ||
Строка 528: | Строка 462: | ||
var vGraph = new TM_graph( // определить график | var vGraph = new TM_graph( // определить график | ||
"#vGraph", // на html-элементе #vGraph | "#vGraph", // на html-элементе #vGraph | ||
− | + | 500, // сколько шагов по оси "x" отображается | |
− | -1, 1,0. | + | -1,1,0.5); |
− | + | ||
function tick() | function tick() | ||
{ | { | ||
− | for (i = 0; i < N ; i++) | + | |
+ | steps += 1; | ||
+ | for (i = 0; i < N; i++) //расчет сил и скоростей | ||
+ | for (j = 0; j < N; j++) | ||
+ | { | ||
+ | if (i!=j) | ||
+ | { | ||
+ | rass = Math.sqrt(Math.pow((rx[i]-rx[j]),2)+Math.pow((ry[i]-ry[j]),2)); | ||
+ | |||
+ | var r2 = r*r; | ||
+ | var b = Math.pow(13/7,1/6)*r; | ||
+ | var b2 = b * b; | ||
+ | var rass2 = rass * rass; | ||
+ | var acut = 2 * r;//14 | ||
+ | var acut2 = acut*acut; | ||
+ | if (rass >= 0 && rass <= b) {k = 1;}//0;7.76 | ||
+ | if (rass >= acut) {k = 0;} | ||
+ | if (rass >= b && rass <= acut) | ||
+ | { | ||
+ | k = Math.pow((1- Math.pow((rass2 - b2)/(acut2-b2),2)),2); | ||
+ | } | ||
+ | |||
+ | mod_f = 5000/r2*k*((Math.pow(r/rass),8)-Math.pow((r/rass),14)); | ||
+ | if (mod_f < 0){mod_f = 4;} | ||
+ | |||
+ | fx_i = mod_f*(rx[i]-rx[j]); | ||
+ | fy_i = mod_f*(ry[i]-ry[j]); | ||
+ | vx[i]+=fx_i*dt; | ||
+ | vx[j]-=fx_i*dt; | ||
+ | vy[i]+=fy_i*dt; | ||
+ | vy[j]-=fy_i*dt; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | for (i = 0; i < N; i++) //пересчет положений | ||
{ | { | ||
− | |||
− | |||
− | |||
rx[i] += vx[i]*dt; | rx[i] += vx[i]*dt; | ||
ry[i] += vy[i]*dt; | ry[i] += vy[i]*dt; | ||
− | |||
if (rx[i] >= w) {rx[i] = rx[i] - w;} | if (rx[i] >= w) {rx[i] = rx[i] - w;} | ||
− | if (rx[i] <= 0) {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] >= h) {ry[i] = ry[i] - h;} |
− | if (ry[i] <= 0) {ry[i] = ry[i] + h;} | + | if (ry[i] <= 0) {ry[i] = ry[i] + h;} |
− | + | ||
− | + | var sumL = 0; | |
− | + | L[i] = (rx[i] * vy[i] - ry[i] * vx[i])/1100; | |
− | + | sumL += L[i]; | |
− | + | if (steps % 100 == 0) vGraph.graphIter(steps, sumL); // подать данные на график | |
− | + | //console.log(sumL); | |
− | + | } | |
− | + | } | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | function draw() | |
− | + | { | |
− | |||
− | |||
− | |||
− | |||
+ | |||
+ | ctx.clearRect(0, 0, W , H ); // очистить экран | ||
+ | ctx.beginPath(); | ||
+ | for (var i1 = 1; i1<3;i1++) | ||
+ | for (var i2 = 1;i2<3;i2++) | ||
+ | { | ||
+ | var px = i1 *(h+dx); | ||
+ | var py = i2 *(w+dx); | ||
+ | ctx.moveTo(px, 0); | ||
+ | ctx.lineTo(px, H); | ||
+ | ctx.moveTo(0, py); | ||
+ | ctx.lineTo(W,py); | ||
+ | ctx.strokeStyle = "#000000"; // цвет линии | ||
+ | ctx.stroke(); | ||
+ | } | ||
+ | for (var i = 0; i < rx.length; i++) | ||
+ | for (var ii = 0; ii<3;ii++) | ||
+ | for (var jj = 0; jj<3; jj++) | ||
+ | for (var i = 0; i < N; i++) | ||
+ | { | ||
+ | var xS_Real0 = rx[i] + ii*(h + dx); | ||
+ | var yS_Real0 = ry[i]+ jj*(w + dx); | ||
+ | ctx.beginPath(); | ||
+ | ctx.fillStyle = "#00008B"; | ||
+ | ctx.arc(xS_Real0, yS_Real0, r , 0, 2 * Math.PI, false); | ||
+ | ctx.closePath(); | ||
+ | ctx.fill(); | ||
} | } | ||
− | + | ||
− | |||
− | |||
} | } | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | setInterval(step, 1000/ | + | setInterval(step, 1000/20); // функция step будет запускаться 60 раз в секунду (60 раз / 1000 мс) |
− | } | + | } |
</syntaxhighlight> | </syntaxhighlight> | ||
</div> | </div> | ||
− | + | </div>=='''Ссылки'''== | |
− | ==Ссылки== | ||
* [[Виртуальная лаборатория]] | * [[Виртуальная лаборатория]] | ||
<br/> | <br/> |