Маятник с растяжимой нитью — различия между версиями

Материал из Department of Theoretical and Applied Mechanics
Перейти к: навигация, поиск
(Демонстрация модели)
Строка 59: Строка 59:
 
<div class="mw-collapsible mw-collapsed">
 
<div class="mw-collapsible mw-collapsed">
 
'''Текст программы на языке JavaScript:''' <div class="mw-collapsible-content">
 
'''Текст программы на языке JavaScript:''' <div class="mw-collapsible-content">
Файл '''"graphicMech.js"'''
+
Файл '''"Generalwork2.js"'''
 
<syntaxhighlight lang="javascript" line start="1" enclose="div">
 
<syntaxhighlight lang="javascript" line start="1" enclose="div">
  
Строка 172: Строка 172:
 
}
 
}
 
window.onload = init;
 
window.onload = init;
 +
</syntaxhighlight>
 +
</div>

Версия 20:44, 16 декабря 2017

Формулировка задачи

Задача 48.13 Составить уравнение движения маятника, состоящего из материальной точки массы m, подвешенной на нити, длина которой изменяется по закону l=l(t)

Решение

Для решения поставленной задачи воспользуемся уравнением Лагранжа 2-го рода


[math]\frac{d}{dt}\left(\frac{\partial T}{\partial\dot q_i}\right) - \frac{\partial T}{\partial q_i} = - \frac{\partial \Pi}{\partial q_i} [/math] , где

T - кинетическая энергия системы
П - потенциальная энергия системы
q - независимые обобщенные координаты
В данной задаче в качестве обобщенной координаты возьмем угол отклонения нити от вертикали [math]q = \varphi [/math].

Выразим кинетическую и потенциальную энергии через обобщенную координату.

[math]x=l\sin(\varphi )[/math]

[math]y=l\cos(\varphi )[/math]

[math]\dot x= \dot l\sin(\varphi ) + l\cos(\varphi )\dot\varphi [/math]

[math]\dot y= \dot l\cos(\varphi ) - l\sin(\varphi )\dot\varphi [/math]

[math]V^{2}=\dot x^{2}+ \dot y^{2}[/math]

[math]T= \frac{1}{2}\ m\ V ^{2}[/math]

[math]T = \frac{1}{2}\ m\ (\dot l\ ^{2}+l^{2}\dot\varphi^{2})[/math]

[math]\Pi = m \ g\ l \cos(\varphi )\ [/math]

Дифференцируя полученные выражения энергий и подставляя в уравнение Лагранжа результаты дифференцирования, получаем уравнение движения рассматриваемой системы:

[math]\ddot\varphi + 2\frac{\dot l}{l}\dot\varphi + \frac{g}{l} \sin(\varphi) = 0 [/math]

Визуализация процесса

Для моделирования колебаний данного маятника используется язык программирования JavaScript и следующие библиотеки:

  • three.js
  • dat.gui.js
  • stats.js
  • OrbitControls.ru

Положим, что длина нити l увеличивается линейно с коэффициентом удлинения с. Это предположение используется при построении модели, то есть рассматриваем частный случай со следующим законом изменения длины нити:

  • l(t)=l(0)+ct

Демонстрация модели

Текст программы на языке JavaScript:

Файл "Generalwork2.js"

  1 function init() 
  2 {
  3 	var stats=initStats();
  4 	var scene=new THREE.Scene();
  5 	var camera=new THREE.PerspectiveCamera(45,window.innerWidth/window.innerHeight,0.1,1000);
  6 	var renderer=new THREE.WebGLRenderer();
  7 	renderer.setClearColor(new THREE.Color(0xADD8E6,1.0));
  8 	renderer.setSize(window.innerWidth, window.innerHeight);
  9 	renderer.shadowMapEnabled=true;
 10 
 11 	var planeGeometry=new THREE.PlaneGeometry(60,20,1,1);
 12 	var planeMaterial=new THREE.MeshLambertMaterial({color:0x0ffd4});
 13 	var plane=new THREE.Mesh(planeGeometry,planeMaterial);
 14 	plane.receiveShadow=true;
 15 	plane.rotation.x=-Math.PI/2;
 16 	plane.position.set(0,0,0);
 17 	scene.add(plane);
 18 
 19 	camera.position.set(0,5,50);
 20 	camera.lookAt(new THREE.Vector3(0,-10,0));
 21 
 22 	var ambientLight=new THREE.AmbientLight(0x0c0c0c);
 23 	scene.add(ambientLight);
 24 	var spotLight=new THREE.SpotLight(0xffffff);
 25 	spotLight.castShadow = true;
 26 	spotLight.position.set(-40,60,-10);
 27 	scene.add(spotLight);
 28 
 29 	document.getElementById("WebGL-output").appendChild(renderer.domElement);
 30 	
 31 	group=new THREE.Object3D();
 32 	function draw()
 33 	{
 34 		scene.remove(group)
 35 		L0=20;
 36 		c=controls.c;
 37 		L=L0+c*time;
 38 		group=new THREE.Object3D();
 39 		var cylinderGeometry=new THREE.CylinderGeometry(0.15,0.15,L);
 40 		var cylinderMaterial=new THREE.MeshLambertMaterial({color: 0x7777ff});
 41 		var cylinder=new THREE.Mesh(cylinderGeometry,cylinderMaterial);
 42 		var sphereGeometry=new THREE.SphereGeometry(1,20,20);
 43 		var sphereMaterial=new THREE.MeshLambertMaterial({color: 0x7777ff});
 44 		var sphere=new THREE.Mesh(sphereGeometry,sphereMaterial);
 45 		sphere.castShadow=true;
 46 		cylinder.position.set(0,-L/2,0);
 47 		sphere.position.set(0,-L,0);
 48 		group.add(cylinder);
 49 		group.add(sphere);
 50 		group.position.set(0,0,0);
 51 		scene.add(group);
 52 	}
 53 
 54 	var omega,phi,c,time,dt;
 55 	var controls = new function () 
 56 	{
 57 		this.c=0.1;
 58 		this.redraw=function()
 59 		{
 60 			dt=0.005;
 61 			time=0;
 62 			omega=0;
 63 			phi=Math.PI/3;
 64 			c=controls.c;
 65 			group.rotation.z=phi;
 66 		}
 67 		this.L=20+this.c*time;
 68 		
 69 	}
 70 	
 71 	var controls1=new function() 
 72 	{
 73 	this.L='0';
 74 	}
 75 	
 76 
 77 	var gui = new dat.GUI();
 78 	gui.add(controls,'c',0.01,0.2);
 79 	gui.add(controls1,'L').listen();
 80 	gui.add(controls,'redraw');
 81 
 82 	
 83 	controls.redraw();
 84 	render();
 85 	function render() 
 86 	{
 87 		stats.update();
 88 		time+=dt;
 89 		draw();
 90 		
 91 		omega=omega-((9.8*Math.sin(phi)+2*c*omega)/(L0+c*time))*dt;
 92 		phi+=omega;
 93 		controls1.L=L0+c*time;
 94 		group.rotation.z=phi;
 95 		renderer.render(scene,camera);
 96 		requestAnimationFrame(render);
 97 	}
 98 	function initStats() 
 99 	{
100 		var stats = new Stats();
101 		stats.setMode(0);
102 		stats.domElement.style.position = 'absolute';
103 		stats.domElement.style.left = '0px';
104 		stats.domElement.style.top = '0px';
105 		document.getElementById("Stats-output").appendChild(stats.domElement);
106 		return stats;
107 	}
108 }
109 window.onload = init;