Маятник с растяжимой нитью
Формулировка задачи
Задача 48.13 Составить уравнение движения маятника, состоящего из материальной точки массы m, подвешенной на нити, длина которой изменяется по закону l=l(t)
Решение
Для решения поставленной задачи воспользуемся уравнением Лагранжа 2-го рода
, где
T - кинетическая энергия системы П - потенциальная энергия системы q - независимые обобщенные координаты
В данной задаче в качестве обобщенной координаты возьмем угол отклонения нити от вертикали
.
Выразим кинетическую и потенциальную энергии через обобщенную координату.
Дифференцируя полученные выражения энергий и подставляя в уравнение Лагранжа результаты дифференцирования, получаем уравнение движения рассматриваемой системы:
Визуализация процесса
Для моделирования колебаний данного маятника используется язык программирования JavaScript и следующие библиотеки:
- three.js
- dat.gui.js
- stats.js
- OrbitControls.ru
Положим, что длина нити l увеличивается линейно с коэффициентом удлинения с. Это предположение используется при построении модели, то есть рассматриваем частный случай со следующим законом изменения длины нити:
- l(t)=l(0)+ct
Демонстрация модели
Файл "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;