Моделирование падения закрепленной цепочки
Курсовой проект по Введению в механику дискретных сред
Исполнитель: Литвинова Ярослава Игоревна
Группа: 5030103/90101
Семестр: осень 2022
Постановка задачи
Данная работа посвящена визуализации статического провисания и падения цепочки. Цепочка состоит из частиц, соединенных упругими связями. Необходимо показать, как цепочка придет в положение равновесия под воздействем силы тяжести, и смоделировать движение цепочки при отпускании одного края, а также исследовать зависимость ускорения отпущенной крайней частицы от времени.
Математическая модель
где
- силы упругости действующие на -ую частицу со стороны и соответственно;
- сила тяжести;
Сила упругости, возникающая в пружине соединяющей частицу 1 и 2, вычисляется по следующей формуле:
, где - коэффициент жесткости пружины.
Обезразмеренное уравнение будет иметь вид:
Интегрирование по времени производится явной схемой интегрирования методом Верле.
Визуализация
На рис.1 представлен интерфейс программы.
На рис.2 представлена программа в процессе работы.
Код программы
Код программы:
1 <br />
2 window.addEventListener('load',main,false)
3 function main(){
4
5 Num = document.getElementById("num").value;
6 my = document.getElementById("my");
7 my.innerHTML =Num + " numbers";
8 var animation = 0;
9 var za = 0;
10 var padenie = 0;
11 var ctx2 = canvasex2.getContext('2d');
12 var cplot = canvasex1.getContext('2d');
13 var width = canvasex1.width;
14 var height = canvasex1.height;
15
16 var t_max = 0;
17 var q = 0;
18 var W=[]; // массив
19 var V = []; // массив скоростей
20 var c=0;
21 una.onclick= function una(){animation = 0; }
22
23 start.onclick= function start(){
24
25 // Изменяемые параметры
26 var b = document.getElementById("b").value; // вязкость
27 var C = document.getElementById("D").value; // жесткость пружины
28 var N = document.getElementById("num").value; // количество элементов в цепочке
29 var m= document.getElementById("mass").value; // масса цепочки
30
31 animation=1;
32 za = za + 1;
33 // Неизменяемые параметры
34 //var N=41; var Mass = 50; var C = 50000; b=0.3;
35 var L0 = 10; //равновесное растояние
36 var Lenght = (N-1)*L0;
37 //var m = Mass/N;
38 var g = 9.81;
39 var rad = 5;
40 var eps = 0.9;
41 var voln = 0.1;
42 var dt=voln/Math.pow(C/m, 1/2);
43
44
45 function Particle(x,y,vx,vy,wx,wy,vxpred,vypred){
46 var that=this;
47 this.x=x;
48 this.y=y;
49 this.vx=vx;
50 this.vy=vy;
51 this.wx=wx;
52 this.wy=wy;
53 this.vxpred=vxpred;
54 this.vypred=vypred;
55
56 this.info = function (){
57 console.log('Position: ('+that.x+','+that.y+')\nVelocity: ('+that.vx+','+that.vy+')\nAcceleration_y: ('+that.wy+')')
58 }
59
60 this.move=function(){
61
62 }
63
64 this.draw = function(){
65 ctx2.beginPath();
66 ctx2.arc(that.x,that.y,rad,0,2*Math.PI);
67 ctx2.fillStyle = '#9999FF';
68 ctx2.fill();
69 }
70 }
71
72
73 if (za==1){ // создание частиц
74 var particles = [];
75
76 if (N%2==0){
77 for(var i=0;i<N;i++){
78 var fi= Math.PI/3;
79 var dy=0;
80 if (i<N/2)
81 dy = i*(L0-1)*Math.sin(fi);
82 else
83 dy = (N-i-1)*(L0-1)*Math.sin(fi);
84 particles.push(
85 new Particle( 400+i*(L0-1)*Math.cos(fi), 50+ dy, 0, 0, 0, 0, 0, 0)
86 );
87 particles[i].draw();
88 }
89 }
90
91 if (N%2!=0){
92 for(var i=0;i<N;i++){
93 var fi= Math.PI/4;
94 if (i<(N+1)/2)
95 var dy = i*(L0-1)*Math.sin(fi);
96 else
97 dy = (N-i-1)*(L0-1)*Math.sin(fi);
98 particles.push(
99 new Particle( 400+i*(L0-1)*Math.cos(fi), 50+ dy, 0, 0, 0, 0, 0, 0)
100 );
101 particles[i].draw();
102
103 }
104 }
105
106 }
107
108 function phys(){
109 t_max+=dt;
110 var Vmax=0;
111 for(var i=0;i<N;i++){
112 //particles[i].move();
113
114 if (i!=0 && i!=N-1){
115
116 var rxl = particles[i].x-particles[i-1].x;
117 var ryl = particles[i].y-particles[i-1].y;
118 var rl = Math.sqrt(Math.pow(rxl,2)+Math.pow(ryl,2));
119
120
121 var rxr = particles[i].x-particles[i+1].x;
122 var ryr = particles[i].y-particles[i+1].y;
123 var rr = Math.sqrt(Math.pow(rxr,2)+Math.pow(ryr,2));
124
125 var Fx = -C*(rl-L0)*rxl/rl/L0 - C*(rr-L0)*rxr/rr/L0;
126 var Fy = -C*(rl-L0)*ryl/rl/L0 - C*(rr-L0)*ryr/rr/L0;
127
128 particles[i].wx = Fx/m - b* particles[i].vx/m;
129 particles[i].wy = Fy/m + g - b* particles[i].vy/m;
130 }
131
132 else if(i==N-1){
133 if (padenie == 0) W.push (0);
134 if (padenie == 1){
135 var rxl = particles[i].x-particles[i-1].x;
136 var ryl = particles[i].y-particles[i-1].y;
137 var rl = Math.sqrt(Math.pow(rxl,2)+Math.pow(ryl,2));
138
139 var Fx = -C*(rl-L0)*rxl/rl/L0 ;
140 var Fy = -C*(rl-L0)*ryl/rl/L0 ;
141
142 particles[i].wx = Fx/m- b* particles[i].vx/m;
143 particles[i].wy = Fy/m + g- b* particles[i].vy/m;
144
145 W.push (Math.sqrt(Math.pow(particles[N-1].wx,2)+Math.pow(particles[N-1].wy,2)));
146 console.log(Math.sqrt(Math.pow(particles[N-1].wx,2)+Math.pow(particles[N-1].wy,2)))
147 }
148 }
149 }
150 // явная схема интегрирования, Верле
151 for (var i=0;i<N;i++){
152 particles[i].vx = particles[i].vx + particles[i].wx*dt;
153 particles[i].vy = particles[i].vy + particles[i].wy*dt;
154 particles[i].x = particles[i].x + particles[i].vx*dt;
155 particles[i].y = particles[i].y + particles[i].vy*dt;
156 var v = Math.sqrt(Math.pow(particles[i].vx,2)+Math.pow(particles[i].vy,2));
157 if (v>Vmax) Vmax=v;
158 }
159 if (Vmax < eps){ padenie = 1; b=0.01}
160 //console.log(Vmax)
161 }
162
163
164 function draw(){
165 ctx2.clearRect(0,0,800,800);
166 for(var i=0;i<N;i++){
167 particles[i].draw();
168 }
169
170
171 cplot.clearRect(0,0,width,height);
172
173 var W_scale =height/250;
174 var t_scale= width/t_max;
175
176 cplot.beginPath();
177 for (var i =0; i<W.length-1; i++){
178 cplot.moveTo(i*t_scale,height-W[i]*(W_scale)-50);
179 cplot.lineTo((i+1)*t_scale, height-W[i+1]*(W_scale)-50);
180
181 }
182 cplot.stroke();
183 }
184
185 function control(){
186 if (animation!=0){
187 phys();
188 draw();
189 }
190 }
191 setInterval(control,1000*dt);
192 }
193
194 }
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <title>Class</title>
5 <script src='cepochka.js'></script>
6 <style>
7 input{
8 width:100px;
9 height:30px;
10 }
11 button{
12 width:100px;
13 height:30px;
14 }
15 div table{
16 margin-left:auto;
17 margin-right:auto;}
18 table td{
19 text-align:center;
20 width:180px;
21 height:30px;
22 }
23 </style>
24 </head>
25 <body>
26 <center>
27 <canvas id='canvasex2' width=800 height=800 background-color=#FF99CC style='border: 1px dashed #000000' ></canvas>
28 <canvas id='canvasex1' width=800 height=300 background-color=#FF99CC style='border: 1px dashed #000000' ></canvas>
29
30 <table>
31 <tr>
32 <td><input type="button" id="start" value="start" > </td>
33 <td> <input type="button" id="una" value="stop" width=40 height=20></td>
34 <td> <button onclick='window.location.reload(true)' style ='width=100 height=20'>clear</button></td>
35 <table>
36 <tr><th>
37 <input type="range" min="11" max="41" id="num"
38 oninput="main()" value="0"></th>
39 <th><div id="my">0</div></th></tr>
40 <tr><th>
41 <input type="number" id="b" name="b" value="0.1"
42 min="0" max="0.1" step="0.01" style='border: 1px dashed #000000'></th>
43 <th> <div> <h3><i> viscosity</i></div></th></tr>
44 <tr><th>
45 <input type="number" id="D" name="D" value="50000"
46 min="1000" max="50000" step="5000" style='border: 1px dashed #000000'></th>
47 <th> <div> <h3><i> spring rate</i></div></th></tr>
48 <tr><th>
49 <input type="number" id="mass" name="mass" value="1"
50 min="0" max="2" step="0.5" style='border: 1px dashed #000000'></th>
51 <th> <div> <h3><i> mass</i></div></th></tr>
52 </center>
53 </body>
54 </html>