Редактирование: Периодические граничные условия

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

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

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 455: Строка 455:
 
function main_particle_1() {
 
function main_particle_1() {
 
   
 
   
    var ctx = canvas_particle_1.getContext("2d");
+
  var ctx = canvas_particle_1.getContext("2d");
var w_1 = canvas_particle_1.width;
+
  var w_1 = canvas_particle_1.width;      
    var h_1 = canvas_particle_1.height;
+
  var h_1 = canvas_particle_1.height;      
var w = w_1/3;
+
  var w = w_1/3;
var h = h_1/3;
+
  var h = h_1/3;
+
 
var r = 7;
+
  var r = 7;
var N = 10;
+
  var N = 10;
rx = new Array(); //Содержит координаты частиц по оси Х
+
  rx = new Array();               //Содержит координаты частиц по оси Х
ry = new Array(); //Содержит координаты частиц по оси У
+
  ry = new Array();               //Содержит координаты частиц по оси У
rxI0 = new Array();rxI1 = new Array();rxI2 = new Array();rxI3 = new Array();rxI4 = new Array();rxI5 = new Array();rxI6 = new Array();rxI7 = new Array();
+
  rxI0 = new Array();rxI1 = new Array();rxI2 = new Array();rxI3 = new Array();rxI4 = new Array();rxI5 = new Array();rxI6 = new Array();rxI7 = new Array();                        
ryI0 = new Array();ryI1= new Array();ryI2= new Array();ryI3= new Array();ryI4= new Array();ryI5= new Array();ryI6= new Array();ryI7= new Array();
+
  ryI0 = new Array();ryI1= new Array();ryI2= new Array();ryI3= new Array();ryI4= new Array();ryI5= new Array();ryI6= new Array();ryI7= new Array();                
vx = new Array(); //Скорость по Х
+
 
vy = new Array(); //Скорость по У
+
  L = new Array();
vx_p = new Array();vx_m = new Array();vy_p = new Array();vy_m = new Array();
+
  Array.prototype.sum = function()
var distR0,distR2,distR3,distR;
+
  {
+
  for (var i=0, sum=0; i < this.length; sum += this[i++]);
L = new Array();
+
  return sum;
var D = 5;
+
  }
var a0 = w * 0.1;  
+
 
var c = 72 * D/r;
+
 
var W = Math.sqrt(c);
+
  var distR0,distR2,distR3,distR;
var T = 2 * Math.PI/W;
+
 
dt = 0.03;
+
  var D = 5;
//0.04380741654852822
+
  var a;
+
  var a0 = w * 0.1;  
for (i = 0; i < N/2; ++i)
+
 
{
+
  vx = new Array();                //Скорость по Х
vx_p[i] = Math.random()*15;
+
  vy = new Array();               //Скорость по У
vy_p[i] = Math.random()*15;
+
  dt = 0.01;
vx_m[i] = -vx_p[i];
+
 
vy_m[i] = -vy_p[i];
+
 
vx = vx_p.concat(vx_m);
+
 
vy = vy_p.concat(vy_m);
+
  for (i = 0; i < N; ++i)  
}
+
  {
+
    vx[i] = Math.random()*55;
var kol = 1;
+
    vy[i] = Math.random()*55;
var prx = 0;
+
  }
var pry = 0;
+
  var kol = 1;
var dist = 0;
+
  var prx = 0;
var f;
+
  var pry = 0;
rx[0] = Math.random() * (w - 10);  
+
  var dist = 0;
ry[0] = Math.random() * (h - 10);
+
  var f;
while (kol < N)
+
  rx[0] = Math.random() * (w - 10);  
{
+
  ry[0] = Math.random() * (h - 10);
f = 0;
+
  while (kol < N)
prx = Math.random() * (w - 10);  
+
  {
pry = Math.random() * (h - 10);
+
    f = 0;
for (i = 0; i < kol; i++)
+
    prx = Math.random() * (w - 10);  
{
+
    pry = Math.random() * (h - 10);
dist = Math.pow((rx[i] - prx),2)+Math.pow((ry[i] - pry),2);
+
    for (i = 0; i < kol; i++)
if (dist < Math.pow(2 * a0,2))
+
    {
{
+
      dist = Math.pow((rx[i] - prx),2)+Math.pow((ry[i] - pry),2);
f = f+1;
+
      if (dist < Math.pow(2 * a0,2))
}
+
      {
}
+
        f = f+1;
if (f==0)
+
      }
{
+
    }
rx[kol] = prx;
+
    if (f==0)
ry[kol] = pry;
+
    {
kol++;
+
      rx[kol] = prx;
}
+
      ry[kol] = pry;
}
+
      kol++;
var steps = 0;
+
    }
+
  }
+
  var steps = 0;
function step()
+
 
{
+
 
tick();
+
  function step()
draw();
+
  {
}
+
    tick();
var vGraph = new TM_graph(                 // определить график
+
    draw();
"#vGraph",                             // на html-элементе #vGraph
+
  }
1000,                                   // сколько шагов по оси "x" отображается
+
 
-1, 1,0.2);                           // мин. значение оси Y, макс. значение оси Y, шаг по оси Y
+
  var vGraph = new TM_graph(                       // определить график
+
          "#vGraph",                               // на html-элементе #vGraph
function tick()
+
          250,                                     // сколько шагов по оси "x" отображается
{
+
          -1, 1,0.2);                               // мин. значение оси Y, макс. значение оси Y, шаг по оси Y
for (i = 0; i < N ; i++)
+
     
{
+
  function tick()
+
  {
steps += 1;
+
    for (i = 0; i < N ; i++)
+
    {
rx[i] += vx[i]*dt;
+
     
ry[i] += vy[i]*dt;
+
      steps += 1;
+
     
if (rx[i] >= w) {rx[i] = rx[i] - w;}
+
      rx[i] += vx[i]*dt;
if (rx[i] <= 0) {rx[i] = rx[i] + w;}
+
      ry[i] += vy[i]*dt;
if (ry[i] >= h) {ry[i] = ry[i] - h;}
+
       
if (ry[i] <= 0) {ry[i] = ry[i] + h;}
+
      if (rx[i] >= w) {rx[i] = rx[i] - w;}
+
      if (rx[i] <= 0) {rx[i] = rx[i] + w;}
rxI0[i] = rx[i] + w;
+
      if (ry[i] >= h) {ry[i] = ry[i] - h;}
ryI0[i] = ry[i];
+
      if (ry[i] <= 0) {ry[i] = ry[i] + h;}
 +
     
 +
        rxI0[i] = rx[i] + w;
 +
        ryI0[i] = ry[i];
  
rxI3[i] = rx[i] + w;
+
        rxI3[i] = rx[i] + w;
ryI3[i] = ry[i] + h;
+
        ryI3[i] = ry[i] + h;
+
       
rxI6[i] = rx[i] + w;
+
        rxI6[i] = rx[i] + w;
ryI6[i] = ry[i] + 2*h;
+
        ryI6[i] = ry[i] + 2*h;
+
       
rxI1[i] = rx[i] + 2*w;
+
        rxI1[i] = rx[i] + 2*w;
ryI1[i] = ry[i];
+
        ryI1[i] = ry[i];
+
       
rxI4[i] = rx[i] + 2*w;
+
        rxI4[i] = rx[i] + 2*w;
ryI4[i] = ry[i] + h;
+
        ryI4[i] = ry[i] + h;
+
       
rxI7[i] = rx[i] + 2*w;
+
        rxI7[i] = rx[i] + 2*w;
ryI7[i] = ry[i] + 2*h;
+
        ryI7[i] = ry[i] + 2*h;
+
       
rxI2[i] = rx[i];
+
        rxI2[i] = rx[i];
ryI2[i] = ry[i] + h;
+
        ryI2[i] = ry[i] + h;
+
       
rxI5[i] = rx[i];
+
        rxI5[i] = rx[i];
ryI5[i] = ry[i] + 2*h;
+
        ryI5[i] = ry[i] + 2*h;
+
       
+
        //расчет расстояний
+
       
//раcсчет расстояний
+
        for (j = 0; j < N ; j++)
+
        {
for (j = 0; j < N ; j++)
+
          if (i != j)
{
+
          {
if (i != j)
+
            distR0 = Math.sqrt(Math.pow((rx[i]-rxI0[j]),2)+Math.pow((ry[i]-ryI0[j]),2));
{
+
            distR2 = Math.sqrt(Math.pow((rx[i]-rxI2[j]),2)+Math.pow((ry[i]-ryI2[j]),2));
distR0 = Math.sqrt(Math.pow((rx[i]-rxI0[j]),2)+Math.pow((ry[i]-ryI0[j]),2));
+
            distR3 = Math.sqrt(Math.pow((rx[i]-rxI3[j]),2)+Math.pow((ry[i]-ryI3[j]),2));
distR2 = Math.sqrt(Math.pow((rx[i]-rxI2[j]),2)+Math.pow((ry[i]-ryI2[j]),2));
+
            distR = Math.sqrt(Math.pow((rx[i]-rx[j]),2)+Math.pow((ry[i]-ry[j]),2));
distR3 = Math.sqrt(Math.pow((rx[i]-rxI3[j]),2)+Math.pow((ry[i]-ryI3[j]),2));
+
           
distR = Math.sqrt(Math.pow((rx[i]-rx[j]),2)+Math.pow((ry[i]-ry[j]),2));
+
            //расчет сил
+
            a = 4 * r;
//раcсчет сил
+
            if (distR0 < 2*r)
a = 4 * r;
+
            {
if (distR0 < 2*r)
+
              var mod_fR0,fxR0,fyR0;
{
 
var mod_fR0,fxR0,fyR0;
 
  
mod_fR0 = 12*D*((Math.pow(r/distR0),13)-Math.pow((r/distR0),7))/a;
+
              mod_fR0 = 12*D*((Math.pow(r/distR0),13)-Math.pow((r/distR0),7))/a;
//console.log(mod_fR0);
+
              //console.log(mod_fR0);
if (mod_fR0 >=0)
+
              if (mod_fR0 >=0)
{
+
              {
fxR0 = mod_fR0*(rx[i]-rxI0[j]);
+
                fxR0 = mod_fR0*(rx[i]-rxI0[j]);
fyR0 = mod_fR0*(ry[i]-ryI0[j]);
+
                fyR0 = mod_fR0*(ry[i]-ryI0[j]);
vx[i]+=fxR0*dt;
+
                vx[i]+=fxR0*dt;
vx[j]-=fxR0*dt;
+
                vx[j]-=fxR0*dt;
vy[i]+=fyR0*dt;
+
                vy[i]+=fyR0*dt;
vy[j]-=fyR0*dt;
+
                vy[j]-=fyR0*dt;
}
+
              }
}
+
            }
if (distR2 < 2*r)
+
            if (distR2 < 2*r)
{
+
            {
var mod_fR2,fxR2,fyR2;
+
              var mod_fR2,fxR2,fyR2;
  
mod_fR2 = 12*D*((Math.pow(r/distR2),13)-Math.pow((r/distR2),7))/a;
+
              mod_fR2 = 12*D*((Math.pow(r/distR2),13)-Math.pow((r/distR2),7))/a;
+
           
if (mod_fR2 >=0)
+
              if (mod_fR2 >=0)
{
+
              {
fxR2 = mod_fR2*(rx[i]-rxI2[j]);
+
                fxR2 = mod_fR2*(rx[i]-rxI2[j]);
fyR2 = mod_fR2*(ry[i]-ryI2[j]);
+
                fyR2 = mod_fR2*(ry[i]-ryI2[j]);
vx[i]+=fxR2*dt;
+
                vx[i]+=fxR2*dt;
vx[j]-=fxR2*dt;
+
                vx[j]-=fxR2*dt;
vy[i]+=fyR2*dt;
+
                vy[i]+=fyR2*dt;
vy[j]-=fyR2*dt;
+
                vy[j]-=fyR2*dt;
}
+
              }
}
+
            }
if (distR3 < 2*r)
+
            if (distR3 < 2*r)
{
+
            {
var mod_fR3,fxR3,fyR3;
+
              var mod_fR3,fxR3,fyR3;
  
mod_fR3 = 12*D*((Math.pow(r/distR3),13)-Math.pow((r/distR3),7))/a;
+
              mod_fR3 = 12*D*((Math.pow(r/distR3),13)-Math.pow((r/distR3),7))/a;
+
             
if (mod_fR3 >=0)
+
              if (mod_fR3 >=0)
{
+
              {
fxR3 = mod_fR3*(rx[i]-rxI3[j]);
+
                fxR3 = mod_fR3*(rx[i]-rxI3[j]);
fyR3 = mod_fR3*(ry[i]-ryI3[j]);
+
                fyR3 = mod_fR3*(ry[i]-ryI3[j]);
vx[i]+=fxR3*dt;
+
                vx[i]+=fxR3*dt;
vx[j]-=fxR3*dt;
+
                vx[j]-=fxR3*dt;
vy[i]+=fyR3*dt;
+
                vy[i]+=fyR3*dt;
vy[j]-=fyR3*dt;
+
                vy[j]-=fyR3*dt;
}
+
              }
}
+
            }
+
           
if (distR < 2*r)
+
            if (distR < 2*r)
{
+
            {
var mod_fR,fxR,fyR;
+
              var mod_fR,fxR,fyR;
mod_fR = 12*D*((Math.pow(r/distR),13)-Math.pow((r/distR),7))/a;
+
              mod_fR = 12*D*((Math.pow(r/distR),13)-Math.pow((r/distR),7))/a;
if (mod_fR >=0)
+
              if (mod_fR >=0)
{
+
              {
fxR = mod_fR*(rx[i]-rx[j]);
+
                fxR = mod_fR*(rx[i]-rx[j]);
fyR = mod_fR*(ry[i]-ry[j]);
+
                fyR = mod_fR*(ry[i]-ry[j]);
vx[i]+=fxR*dt;
+
                vx[i]+=fxR*dt;
vx[j]-=fxR*dt;
+
                vx[j]-=fxR*dt;
vy[i]+=fyR*dt;
+
                vy[i]+=fyR*dt;
vy[j]-=fyR*dt;
+
                vy[j]-=fyR*dt;
}
+
              }
}
+
            }
+
           
Array.prototype.sum = function()
+
            L[i] = (rx[i] * vy[i] - ry[i] * vx[i])/35000;
{
+
            var sumL = L.sum();
for (var i=0, sum=0; i < this.length; sum += this[i++]);
+
            if (steps % 100 == 0) vGraph.graphIter(steps, sumL); // подать данные на график
return sum;
+
            //console.log(sumL);
}
 
 
 
L[i] = (rx[i] * vy[i] - ry[i] * vx[i])/5000;
 
var sumL = L.sum();
 
//график
 
if (steps % 50 == 0) vGraph.graphIter(steps, sumL); // подать данные на график
 
//console.log(sumL);
 
  
}
+
          }
+
         
}
+
        }    
}
+
    }
}
+
  }
+
       
 +
 
 +
  function draw()
 +
  {
 +
    ctx.clearRect(0, 0, w_1 , h_1);              // очистить экран
 +
    for (var i = 0; i < N; i++)
 +
     
 +
    {
 +
      var x = rx[i];         
 +
      var y = ry[i];
 +
      ctx.beginPath();
 +
      ctx.fillStyle = "#00008B";
 +
      ctx.arc(x, y, r , 0, 2 * Math.PI, false);
 +
      ctx.closePath();
 +
      ctx.fill();
 +
     
 +
      var xI0 = rxI0[i];         
 +
      var yI0 = ryI0[i];
 +
      ctx.beginPath();
 +
      ctx.fillStyle = "#00008B";
 +
      ctx.arc(xI0, yI0, r , 0, 2 * Math.PI, false);
 +
      ctx.closePath();
 +
      ctx.fill();
 +
      var xI1 = rxI1[i];         
 +
      var yI1 = ryI1[i];
 +
      ctx.beginPath();
 +
      ctx.fillStyle = "#00008B";
 +
      ctx.arc(xI1, yI1, r , 0, 2 * Math.PI, false);
 +
      ctx.closePath();
 +
      ctx.fill();
 +
      var xI2 = rxI2[i];         
 +
      var yI2 = ryI2[i];
 +
      ctx.beginPath();
 +
      ctx.fillStyle = "#00008B";
 +
      ctx.arc(xI2, yI2, r , 0, 2 * Math.PI, false);
 +
      ctx.closePath();
 +
      ctx.fill();
 +
      var xI3 = rxI3[i];         
 +
      var yI3 = ryI3[i];
 +
      ctx.beginPath();
 +
      ctx.fillStyle = "#00008B";
 +
      ctx.arc(xI3, yI3, r , 0, 2 * Math.PI, false);
 +
      ctx.closePath();
 +
      ctx.fill();
 +
      var xI4 = rxI4[i];         
 +
      var yI4 = ryI4[i];
 +
      ctx.beginPath();
 +
      ctx.fillStyle = "#00008B";
 +
      ctx.arc(xI4, yI4, r , 0, 2 * Math.PI, false);
 +
      ctx.closePath();
 +
      ctx.fill();
 +
      var xI5 = rxI5[i];         
 +
      var yI5 = ryI5[i];
 +
      ctx.beginPath();
 +
      ctx.fillStyle = "#00008B";
 +
      ctx.arc(xI5, yI5, r , 0, 2 * Math.PI, false);
 +
      ctx.closePath();
 +
      ctx.fill();
 +
      var xI6 = rxI6[i];         
 +
      var yI6 = ryI6[i];
 +
      ctx.beginPath();
 +
      ctx.fillStyle = "#00008B";
 +
      ctx.arc(xI6, yI6, r , 0, 2 * Math.PI, false);
 +
      ctx.closePath();
 +
      ctx.fill();
 +
      var xI7 = rxI7[i];         
 +
      var yI7 = ryI7[i];
 +
      ctx.beginPath();
 +
      ctx.fillStyle = "#00008B";
 +
      ctx.arc(xI7, yI7, r , 0, 2 * Math.PI, false);
 +
      ctx.closePath();
 +
      ctx.fill();
 +
     
 +
    }   
 +
      ctx.beginPath();                            // начать рисование
 +
      ctx.fillStyle="#000000";
 +
      ctx.moveTo(w, 0);                            // переместить "карандаш" в точку
 +
      ctx.lineTo(w, h_1);                          // нарисовать "карандашом" линию до точки
 +
      ctx.stroke();
 +
     
 +
      ctx.beginPath();
 +
      ctx.fillStyle="#000000";   
 +
      ctx.moveTo(2 * w, 0);                           
 +
      ctx.lineTo(2 * w, h_1);                           
 +
      ctx.stroke();
 +
     
 +
      ctx.beginPath(); 
 +
      ctx.fillStyle="#000000";
 +
      ctx.moveTo(0, h);                           
 +
      ctx.lineTo(w_1, h);                           
 +
      ctx.stroke();
 +
     
 +
      ctx.beginPath();
 +
      ctx.fillStyle="#000000";   
 +
      ctx.moveTo(0, 2 * h);                           
 +
      ctx.lineTo(w_1, 2 * h);                           
 +
      ctx.stroke();
 +
  }
 +
 +
  setInterval(step, 1000/60);                      // функция step будет запускаться 60 раз в секунду (60 раз / 1000 мс)
 +
   
 +
}   
 
 
function draw()
 
{
 
ctx.clearRect(0, 0, w_1 , h_1);    // очистить экран
 
for (var i = 0; i < N; i++)
 
 
{
 
var x = rx[i];         
 
var y = ry[i];
 
ctx.beginPath();
 
ctx.fillStyle = "#00008B";
 
ctx.arc(x, y, r , 0, 2 * Math.PI, false);
 
ctx.closePath();
 
ctx.fill();
 
 
var xI0 = rxI0[i];         
 
var yI0 = ryI0[i];
 
ctx.beginPath();
 
ctx.fillStyle = "#00008B";
 
ctx.arc(xI0, yI0, r , 0, 2 * Math.PI, false);
 
ctx.closePath();
 
ctx.fill();
 
var xI1 = rxI1[i];         
 
var yI1 = ryI1[i];
 
ctx.beginPath();
 
ctx.fillStyle = "#00008B";
 
ctx.arc(xI1, yI1, r , 0, 2 * Math.PI, false);
 
ctx.closePath();
 
ctx.fill();
 
var xI2 = rxI2[i];         
 
var yI2 = ryI2[i];
 
ctx.beginPath();
 
ctx.fillStyle = "#00008B";
 
ctx.arc(xI2, yI2, r , 0, 2 * Math.PI, false);
 
ctx.closePath();
 
ctx.fill();
 
var xI3 = rxI3[i];         
 
var yI3 = ryI3[i];
 
ctx.beginPath();
 
ctx.fillStyle = "#00008B";
 
ctx.arc(xI3, yI3, r , 0, 2 * Math.PI, false);
 
ctx.closePath();
 
ctx.fill();
 
var xI4 = rxI4[i];         
 
var yI4 = ryI4[i];
 
ctx.beginPath();
 
ctx.fillStyle = "#00008B";
 
ctx.arc(xI4, yI4, r , 0, 2 * Math.PI, false);
 
ctx.closePath();
 
ctx.fill();
 
var xI5 = rxI5[i];         
 
var yI5 = ryI5[i];
 
ctx.beginPath();
 
ctx.fillStyle = "#00008B";
 
ctx.arc(xI5, yI5, r , 0, 2 * Math.PI, false);
 
ctx.closePath();
 
ctx.fill();
 
var xI6 = rxI6[i];         
 
var yI6 = ryI6[i];
 
ctx.beginPath();
 
ctx.fillStyle = "#00008B";
 
ctx.arc(xI6, yI6, r , 0, 2 * Math.PI, false);
 
ctx.closePath();
 
ctx.fill();
 
var xI7 = rxI7[i];         
 
var yI7 = ryI7[i];
 
ctx.beginPath();
 
ctx.fillStyle = "#00008B";
 
ctx.arc(xI7, yI7, r , 0, 2 * Math.PI, false);
 
ctx.closePath();
 
ctx.fill();
 
 
}
 
ctx.beginPath();                            // начать рисование
 
ctx.fillStyle="#000000";
 
ctx.moveTo(w, 0);                          // переместить "карандаш" в точку
 
ctx.lineTo(w, h_1);                          // нарисовать "карандашом" линию до точки
 
ctx.stroke();
 
 
ctx.beginPath();
 
ctx.fillStyle="#000000";
 
ctx.moveTo(2 * w, 0);                           
 
ctx.lineTo(2 * w, h_1);                           
 
ctx.stroke();
 
 
ctx.beginPath(); 
 
ctx.fillStyle="#000000";
 
ctx.moveTo(0, h);                           
 
ctx.lineTo(w_1, h);                           
 
ctx.stroke();
 
 
ctx.beginPath();
 
ctx.fillStyle="#000000";
 
ctx.moveTo(0, 2 * h);                           
 
ctx.lineTo(w_1, 2 * h);                           
 
ctx.stroke();
 
}
 
 
setInterval(step, 1000/120);              // функция step будет запускаться 60 раз в секунду (60 раз / 1000 мс)
 
 
}
 
 
</syntaxhighlight>
 
</syntaxhighlight>
 
</div>
 
</div>
Вам запрещено изменять защиту статьи. 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:

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