Колебания с двумя степенями свободы

Материал из Department of Theoretical and Applied Mechanics
Перейти к: навигация, поиск
Виртуальная лаборатория>Колебания с двумя степенями свободы

Маятник с двумя степенями свободы

Тяжелая материальная точка массы [math]m[/math] подвешена на невесомой пружине жесткости [math]c[/math] . Длина пружины в ненапряженном состоянии равна [math]l_0[/math] .


Линеаризованные уравнения движения системы будут выглядеть так:

[math] \ddot{x} + \frac{g}{L} x = 0 \\ \ddot{y} + \frac{c}{m} y = 0 \\ [/math]

, где [math]L = l_0 + \frac{m g}{c}[/math]


Скачать New1.rar.

Текст программы на языке JavaScript (разработчик Погодина Валерия, код основан на программе Цветков Денис):

Файл "Balls_v1_release.js"

  1 function MainBalls(canvasBalls, canvasBalls1, canvasBalls2) {
  2  
  3     // Предварительные установки
  4  
  5     var context = canvasBalls.getContext("2d");  // на context происходит рисование
  6 	var context1 = canvasBalls1.getContext("2d");  // на context1 происходит рисование
  7 	var context2 = canvasBalls2.getContext("2d");  // на context2 происходит рисование
  8 	var Pi = 3.1415926;                   // число "пи"
  9     var a0 = 1;                           // масштаб расстояния (диаметр шара)
 10 	var T0 = 1;                           // масштаб времени (период колебаний исходной системы)
 11 	var m0 = 1;                           // масштаб массы
 12 	var g0 = a0 / T0 / T0;                // масштаб ускорения (ускорение, при котором за T0 будет пройдено расстояние a0)
 13 	var k0 = 2 * Pi / T0;                 // масштаб частоты
 14 	var C0 = m0 * k0 * k0;                // масштаб жесткости
 15 	
 16  
 17     // *** Задание физических параметров ***
 18  
 19 	var Ny = 5;                           // число шаров, помещающихся по вертикали в окно (задает размер шара относительно размера окна)
 20     var r = 0.5 * a0;                     // радиус частицы в расчетных координатах
 21 	var m = 1 * m0;                       // масса
 22 	var g = 0.25 * g0;               // ускорение свободного падения
 23 	var c = 1 * C0;                  // жесткость пружины
 24 	var l = 3 * a0;                   // длина пружины
 25 	var time = 0;
 26 
 27 
 28 	Text_c.value  = c;
 29 	Text_m.value  = m;
 30 	Text_l.value = l;
 31 	
 32     Slider_c.min = 1;                          
 33     Slider_c.max = 100;
 34     Slider_c.step = 0.5;
 35     Slider_c.value = Text_c.value;  
 36 	
 37 	Slider_m.min = 1;                          
 38     Slider_m.max = 100;
 39     Slider_m.step = 0.5;
 40     Slider_m.value = Text_m.value; 
 41 	  
 42 	Slider_l.min = 1;                          
 43     Slider_l.max = 5;
 44     Slider_l.step = 0.5;
 45     Slider_l.value = Text_l.value;
 46 	
 47 	var L ;             // длина пружины под воздействием силы тяжести
 48 	// *** Задание вычислительных параметров ***
 49  
 50     var fps = 100;                         // frames per second - число кадров в секунду (качечтво отображения)
 51     var spf = 100;                        // steps per frame   - число шагов интегрирования между кадрами (скорость расчета)
 52     var dt  = 0.045 * T0 / fps;           // шаг интегрирования (качество расчета)
 53 
 54     // Выполнение программы
 55  
 56     var scale = canvasBalls.height / Ny / a0;  // масштабный коэффициент для перехода от расчетных к экранным координатам
 57     var w = canvasBalls.width / scale;           // ширина окна в расчетных координатах
 58     var h = canvasBalls.height / scale;          // высота окна в расчетных координатах
 59  
 60     // Добавление шара
 61  
 62     var b = [];
 63     b.x = w / 2;            b.y = l;    // расчетные координаты шара
 64 	b.vx = 0.5;            b.vy = 0.5;    // начальная скорость
 65 	
 66 
 67 	setInterval(control1, 1000 / fps);
 68 	
 69 	function control1() {
 70 		physics1();
 71         draw();
 72     }
 73 	
 74 	function physics1() {                    // то, что происходит каждый шаг времени
 75         L  = l + m * g / c;
 76 		//document.getElementById('text').innerHTML = '<b>'+l/scale+'</b>';
 77 		for (var s = 1; s <= spf; s++) {
 78             b.vx += -g / L * (b.x - w/2) * dt;          b.vy += -c / m * (b.y - l) * dt; 
 79             b.x += b.vx * dt;                           b.y += b.vy * dt;
 80         }
 81     }
 82 		
 83     this.set_m = function(input)
 84         {
 85 			m = Number(input);   
 86                 time = 0;
 87 				b.x = w / 2;            b.y = l;    
 88 	            b.vx = 0.5;             b.vy = 0.5;
 89                 context.clearRect(0, 0, w * scale, h * scale);      
 90                 context1.clearRect(0, 0, w * scale, h * scale);      
 91                 context2.clearRect(0, 0, w * scale, h * scale);
 92         }
 93  
 94         this.set_c = function(input)
 95         {
 96 
 97                 c = Number(input);   
 98                 time = 0;
 99                 b.x = w / 2;            b.y = l;    
100 	            b.vx = 0.5;             b.vy = 0.5; 
101 				context.clearRect(0, 0, w * scale, h* scale);      
102                 context1.clearRect(0, 0, w * scale, h * scale);      
103                 context2.clearRect(0, 0, w * scale, h * scale);   
104         }
105 		
106 		     this.set_l = function(input)
107         {
108 			l = Number(input);   
109                 time = 0;
110 				b.x = w / 2;            b.y = l;    
111 	            b.vx = 0.5;             b.vy = 0.5;
112                 context.clearRect(0, 0, w * scale, h * scale);      
113                 context1.clearRect(0, 0, w * scale, h * scale);      
114                 context2.clearRect(0, 0, w * scale, h * scale);
115         }
116 
117 		function draw() {
118 		context.fillStyle = "#ff0000"; 	
119         context.clearRect(0, 0, w * scale, h * scale);      // очистить экран
120 		draw_spring(w / 2, b.x, 0, b.y,0.25, 12);
121 		 context.beginPath();
122         context.arc(b.x * scale, b.y * scale, r * scale / 3, 0, 2 * Math.PI, false);                  //рисуем шар
123         context.fill();
124         context.closePath();
125 		
126 		
127 		context1.strokeStyle = "red";                                                             //рисуем график 1
128         context1.beginPath();
129         context1.moveTo(time * Math.sqrt(g / L) * 5 * scale, (b.x -   h / 6) * scale);
130         context1.lineTo((time + dt) * Math.sqrt(g / L) * 5 * scale, (b.x - h / 6) * scale);
131         context1.stroke();
132 		
133 		context1.strokeStyle="#000000";                                                             //рисуем систему координат на 1 графике
134 		context1.beginPath();
135         context1.moveTo(0, h / 2 * scale);
136         context1.lineTo(w * scale, h / 2 * scale);
137         context1.stroke();
138 		context1.strokeStyle="#000000";
139 		context1.beginPath();
140         context1.moveTo(w / 2 * scale , 0);
141         context1.lineTo(w / 2 * scale, h * scale);
142         context1.stroke();
143 		
144 		context2.strokeStyle = "#3070d0";                                                            //рисуем график 2
145 		context2.beginPath();
146         context2.moveTo(time * Math.sqrt(c / m) * 5 * scale, (l - b.y + h / 2) * scale);
147         context2.lineTo((time + dt) * Math.sqrt(c / m) * 5 *scale, (l - b.y + h / 2) * scale);
148         context2.stroke();
149 		
150 		context2.strokeStyle="#000000";                                                            //рисуем систему координат на графике 2
151 		context2.beginPath();
152         context2.moveTo(0, h / 2 * scale);
153         context2.lineTo(w * scale, h / 2 * scale);
154         context2.stroke();
155 		context2.strokeStyle="#000000";
156 		context2.beginPath();
157         context2.moveTo(w / 2 * scale , 0);
158         context2.lineTo(w / 2 * scale, h * scale);
159         context2.stroke();
160 		
161 		time += dt;  
162 	}
163 		function draw_spring(x_start, x_end, y_start, y_end, h, n) {
164 		var L_x = x_end-x_start;
165 		var L_y = y_end-y_start;
166 		for (var i = 0; i < n; i++) {
167 			var x_st = x_start + L_x / n * i;
168 			var x_end = x_start + L_x / n * (i + 1);
169 			var y_st = y_start + L_y / n * i;
170 			var y_end = y_start + L_y / n * (i + 1);
171 			var l_x = x_end - x_st;
172 			var l_y = y_end - y_st;
173 			context.beginPath();
174 			context.bezierCurveTo(x_st * scale, y_st * scale, (x_st + l_x / 4 + h) * scale, (y_st + l_y / 4) * scale, (x_st + l_x / 2) * scale, (y_st + l_y /2) * scale);
175 			context.bezierCurveTo((x_st + l_x / 2) * scale, (y_st + l_y / 2) * scale, (x_st + 3 * l_x / 4 - h) * scale, (y_st + 3 * l_y / 4) * scale, (x_st + l_x) * scale, (y_st + l_y)* scale) ;
176 			context.stroke();
177 		}
178 	}
179 	    
180 }

Файл "new1.html"

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <meta charset="UTF-8"/>
 5     <title> Balls </title>
 6     <script src="Balls_v1_release.js"></script>
 7 </head>
 8 <body>
 9     <canvas id="canvasBalls" width="800" height="600" style="border:1px solid #000000;"></canvas>
10          <div>
11 		         <!-- Масса-->
12         <div>
13             m =
14         <input id="Text_m" style="width: 4.2ex;" required pattern="[-+]?([0-9]*\.[0-9]+|[0-9]+)" oninput="
15            if (!this.checkValidity()) return;
16            app.set_m(this.value);
17            document.getElementById('Slider_m').value = this.value;
18        ">
19                 <input type = "range"  id="Slider_m" style="width: 100px;" oninput="app.set_m(this.value); document.getElementById('Text_m').value = this.value;">
20         </I></font>
21     </div>
22 			         <!-- Длина пружины-->
23         <div>
24             l0=
25         <input id="Text_l" style="width: 4.2ex;" required pattern="[-+]?([0-9]*\.[0-9]+|[0-9]+)" oninput="
26            if (!this.checkValidity()) return;
27            app.set_l(this.value);
28            document.getElementById('Slider_l').value = this.value;
29        ">
30                 <input type = "range"  id="Slider_l" style="width: 100px;" oninput="app.set_l(this.value); document.getElementById('Text_l').value = this.value;">
31         </I></font>
32     </div>
33 	<div id="text"></div>
34 	       <!-- Жесткость-->
35         <div>
36             c =
37         <input id="Text_c" style="width: 4.2ex;" required pattern="[-+]?([0-9]*\.[0-9]+|[0-9]+)" oninput="
38            if (!this.checkValidity()) return;
39            app.set_c(this.value);
40            document.getElementById('Slider_c').value = this.value;
41        ">
42                 <input type = "range"  id="Slider_c" style="width: 100px;" oninput="app.set_c(this.value); document.getElementById('Text_c').value = this.value;">
43         </I></font>
44     </div>
45         <b>Зависимость координаты х от k1*t:</b>
46     </div>    
47         <canvas id="canvasBalls1" width="800" height="600" style="border:1px solid #000000;"></canvas>  
48         <div>
49          <b>Зависимость координаты y от k2*t:</b>
50     </div>    
51         <canvas id="canvasBalls2" width="800" height="600" style="border:1px solid #000000;"></canvas> 
52         <script type="text/javascript"> app = new MainBalls(document.getElementById('canvasBalls'),document.getElementById('canvasBalls1'),document.getElementById('canvasBalls2'));</script>     
53 </body>
54 </html>