Редактирование: Моделирование падения закрепленной цепочки

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

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

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 6: Строка 6:
  
 
'''Семестр:''' осень 2022
 
'''Семестр:''' осень 2022
 
 
==Постановка задачи==
 
Данная работа посвящена визуализации статического провисания и падения цепочки.
 
Цепочка состоит из частиц, соединенных упругими связями. Необходимо показать, как цепочка придет в положение равновесия под воздействем силы тяжести, и смоделировать движение цепочки при отпускании одного края, а также исследовать зависимость ускорения отпущенной крайней частицы от времени.
 
 
==Математическая модель==
 
 
<math>
 
  m\underline{\ddot{r}}_i(t)=\underline{F}_{R_1}+\underline{F}_{R_2} + \underline{F}_{g}\\
 
  \underline{r}_i(0)=\underline{r}_i^0,~\underline{v}_i(0)=0~~~i=1,\ldots,n
 
</math>
 
 
 
где
 
<math>
 
  \underline{F}_{R_1}, \underline{F}_{R_2}\\
 
</math> - силы упругости действующие на <math>i</math>-ую частицу со стороны <math>i-1</math> и <math>i+1</math> соответственно;
 
 
<math>
 
  \underline{F}_{g} = -mg\underline{k} \\
 
</math> - сила тяжести;
 
 
Сила упругости, возникающая в пружине соединяющей частицу 1 и 2, вычисляется по следующей формуле:
 
 
<math>
 
  \underline{F}_{R}= c(||\underline{r}_2-\underline{r}_1|| - l_0)\frac{(\underline{r}_2-\underline{r}_1)}{||\underline{r}_2-\underline{r}_1||}
 
</math>,  где <math>c</math> - коэффициент жесткости пружины.
 
 
Обезразмеренное уравнение будет иметь вид:
 
 
<math>
 
  \underline{\ddot{r}}_i(t)= \frac{cl_0}{mg}(||\underline{r}_{i+1}-\underline{r}_i|| - 1)\frac{(\underline{r}_{i+1}-\underline{r}_i)}{||\underline{r}_{i+1}-\underline{r}_i||} + \frac{cl_0}{mg}(||\underline{r}_{i-1}-\underline{r}_i|| - 1)\frac{(\underline{r}_{i-1}-\underline{r}_i)}{||\underline{r}_{i-1}-\underline{r}_i||} - \underline{k}\\
 
 
 
</math>
 
 
Интегрирование по времени производится явной схемой интегрирования методом Верле.
 
 
== Визуализация ==
 
На рис.1 представлен интерфейс программы.
 
*[[Медиа: интерфейс.png]]
 
На рис.2 представлена программа в процессе работы.
 
*[[Медиа: inwork.png]]
 
 
==Код программы==
 
Код программы:
 
<div class="mw-collapsible mw-collapsed">
 
'''JS:''' <div class="mw-collapsible-content">
 
<syntaxhighlight lang="javascript" line start="1" enclose="div">
 
<br />
 
window.addEventListener('load',main,false)
 
function main(){
 
 
Num = document.getElementById("num").value;
 
    my = document.getElementById("my");
 
    my.innerHTML =Num + " numbers";
 
var animation = 0;
 
var za = 0;
 
var padenie = 0;
 
var ctx2 = canvasex2.getContext('2d');
 
var cplot = canvasex1.getContext('2d');
 
var width = canvasex1.width;
 
    var height = canvasex1.height;
 
 
var t_max = 0;
 
var q = 0;
 
var W=[]; // массив
 
    var V = []; // массив скоростей
 
var c=0;
 
una.onclick= function una(){animation = 0; }
 
 
 
start.onclick= function start(){
 
 
// Изменяемые параметры
 
    var b = document.getElementById("b").value;  // вязкость
 
var C = document.getElementById("D").value;  // жесткость пружины
 
var N = document.getElementById("num").value;  // количество элементов в цепочке
 
var m= document.getElementById("mass").value;  // масса цепочки
 
 
animation=1;
 
za = za + 1;
 
// Неизменяемые параметры
 
//var N=41; var Mass = 50; var C = 50000; b=0.3;
 
var L0 = 10; //равновесное растояние
 
var Lenght = (N-1)*L0;
 
    //var m = Mass/N;
 
var g = 9.81;
 
var rad = 5;
 
var eps = 0.9; 
 
var voln = 0.1;
 
var dt=voln/Math.pow(C/m, 1/2);
 
 
 
function Particle(x,y,vx,vy,wx,wy,vxpred,vypred){
 
var that=this;
 
this.x=x;
 
this.y=y;
 
this.vx=vx;
 
this.vy=vy;
 
this.wx=wx;
 
this.wy=wy;
 
this.vxpred=vxpred;
 
this.vypred=vypred;
 
 
this.info = function (){
 
console.log('Position: ('+that.x+','+that.y+')\nVelocity: ('+that.vx+','+that.vy+')\nAcceleration_y: ('+that.wy+')')
 
}
 
 
this.move=function(){
 
 
}
 
 
this.draw = function(){
 
ctx2.beginPath();
 
ctx2.arc(that.x,that.y,rad,0,2*Math.PI);
 
ctx2.fillStyle = '#9999FF';
 
ctx2.fill();
 
}
 
}
 
 
 
if (za==1){ // создание частиц
 
var particles = [];
 
 
 
  if (N%2==0){
 
for(var i=0;i<N;i++){
 
var fi= Math.PI/3;
 
var dy=0;
 
if (i<N/2)
 
dy = i*(L0-1)*Math.sin(fi);
 
else
 
dy = (N-i-1)*(L0-1)*Math.sin(fi);
 
particles.push(
 
  new Particle( 400+i*(L0-1)*Math.cos(fi), 50+ dy,  0,  0,  0,  0,  0,  0)
 
);
 
particles[i].draw();
 
}
 
  }
 
 
if (N%2!=0){
 
for(var i=0;i<N;i++){
 
var fi= Math.PI/4;
 
if (i<(N+1)/2)
 
var dy = i*(L0-1)*Math.sin(fi);
 
else
 
dy = (N-i-1)*(L0-1)*Math.sin(fi);
 
particles.push(
 
  new Particle( 400+i*(L0-1)*Math.cos(fi), 50+ dy,  0,  0,  0,  0,  0,  0)
 
);
 
    particles[i].draw();
 
   
 
}
 
  }
 
 
}
 
 
function phys(){
 
t_max+=dt;
 
var Vmax=0;
 
for(var i=0;i<N;i++){
 
//particles[i].move();
 
 
if (i!=0 && i!=N-1){
 
 
var rxl = particles[i].x-particles[i-1].x;
 
var ryl = particles[i].y-particles[i-1].y;
 
var rl = Math.sqrt(Math.pow(rxl,2)+Math.pow(ryl,2));
 
 
 
var rxr = particles[i].x-particles[i+1].x;
 
var ryr = particles[i].y-particles[i+1].y;
 
var rr = Math.sqrt(Math.pow(rxr,2)+Math.pow(ryr,2));
 
 
var Fx = -C*(rl-L0)*rxl/rl/L0 - C*(rr-L0)*rxr/rr/L0;
 
var Fy = -C*(rl-L0)*ryl/rl/L0 - C*(rr-L0)*ryr/rr/L0;
 
 
particles[i].wx = Fx/m - b* particles[i].vx/m;
 
particles[i].wy = Fy/m + g - b* particles[i].vy/m;
 
}
 
 
else if(i==N-1){
 
if (padenie == 0) W.push (0);
 
if (padenie == 1){
 
var rxl = particles[i].x-particles[i-1].x;
 
var ryl = particles[i].y-particles[i-1].y;
 
var rl = Math.sqrt(Math.pow(rxl,2)+Math.pow(ryl,2));
 
 
var Fx = -C*(rl-L0)*rxl/rl/L0 ;
 
var Fy = -C*(rl-L0)*ryl/rl/L0 ;
 
 
particles[i].wx = Fx/m- b* particles[i].vx/m;
 
particles[i].wy = Fy/m + g- b* particles[i].vy/m;
 
 
W.push (Math.sqrt(Math.pow(particles[N-1].wx,2)+Math.pow(particles[N-1].wy,2)));
 
console.log(Math.sqrt(Math.pow(particles[N-1].wx,2)+Math.pow(particles[N-1].wy,2)))
 
}
 
}
 
}
 
    // явная схема интегрирования, Верле
 
for (var i=0;i<N;i++){
 
particles[i].vx = particles[i].vx + particles[i].wx*dt;
 
particles[i].vy = particles[i].vy + particles[i].wy*dt;
 
particles[i].x = particles[i].x + particles[i].vx*dt;
 
particles[i].y = particles[i].y + particles[i].vy*dt;
 
var v = Math.sqrt(Math.pow(particles[i].vx,2)+Math.pow(particles[i].vy,2));
 
if (v>Vmax) Vmax=v;
 
}
 
if (Vmax < eps){ padenie = 1; b=0.01}
 
//console.log(Vmax)
 
}
 
 
 
function draw(){
 
ctx2.clearRect(0,0,800,800);
 
for(var i=0;i<N;i++){
 
particles[i].draw();
 
}
 
 
 
cplot.clearRect(0,0,width,height);
 
 
 
var W_scale =height/250;
 
var t_scale= width/t_max;
 
 
cplot.beginPath();
 
for (var i =0; i<W.length-1; i++){
 
cplot.moveTo(i*t_scale,height-W[i]*(W_scale)-50);
 
cplot.lineTo((i+1)*t_scale, height-W[i+1]*(W_scale)-50);
 
 
}
 
cplot.stroke();
 
}
 
 
function control(){
 
if (animation!=0){
 
phys();
 
draw();
 
}
 
}
 
setInterval(control,1000*dt);
 
}
 
 
}
 
 
</syntaxhighlight>
 
</div>
 
<div class="mw-collapsible mw-collapsed">
 
'''HTML:''' <div class="mw-collapsible-content">
 
<syntaxhighlight lang="javascript" line start="1" enclose="div">
 
<!DOCTYPE html>
 
<html>
 
  <head>
 
  <title>Class</title>
 
  <script src='cepochka.js'></script>
 
  <style>
 
  input{
 
  width:100px;
 
  height:30px;
 
  }
 
  button{
 
  width:100px;
 
  height:30px;
 
}
 
  div table{
 
  margin-left:auto;
 
  margin-right:auto;}
 
table td{
 
  text-align:center;
 
  width:180px;
 
  height:30px;
 
  }
 
  </style>
 
  </head>
 
  <body>
 
  <center>
 
  <canvas id='canvasex2' width=800 height=800 background-color=#FF99CC style='border: 1px dashed #000000' ></canvas>
 
    <canvas id='canvasex1' width=800 height=300 background-color=#FF99CC style='border: 1px dashed #000000' ></canvas>
 
 
 
  <table>
 
  <tr>
 
  <td><input type="button" id="start"  value="start" > </td>
 
<td>  <input type="button" id="una"  value="stop" width=40 height=20></td>
 
<td>  <button onclick='window.location.reload(true)' style ='width=100 height=20'>clear</button></td>
 
  <table>
 
  <tr><th>
 
  <input type="range" min="11" max="41" id="num"
 
    oninput="main()" value="0"></th>
 
<th><div id="my">0</div></th></tr>
 
<tr><th>
 
<input type="number" id="b" name="b" value="0.1"
 
      min="0" max="0.1" step="0.01" style='border: 1px dashed #000000'></th>
 
  <th> <div> <h3><i> viscosity</i></div></th></tr>
 
  <tr><th>
 
<input type="number" id="D" name="D" value="50000"
 
      min="1000" max="50000" step="5000" style='border: 1px dashed #000000'></th>
 
  <th> <div> <h3><i> spring rate</i></div></th></tr>
 
  <tr><th>
 
<input type="number" id="mass" name="mass" value="1"
 
      min="0" max="2" step="0.5" style='border: 1px dashed #000000'></th>
 
  <th> <div> <h3><i> mass</i></div></th></tr>
 
  </center>
 
  </body>
 
</html>
 
</syntaxhighlight>
 
</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:

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