Маятник с растяжимой нитью
Формулировка задачи
Задача 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
Демонстрация модели
Файл "graphicMech.js" <syntaxhighlight lang="javascript" line start="1" enclose="div">
function init()
{
var stats=initStats();
var scene=new THREE.Scene();
var camera=new THREE.PerspectiveCamera(45,window.innerWidth/window.innerHeight,0.1,1000);
var renderer=new THREE.WebGLRenderer();
renderer.setClearColor(new THREE.Color(0xADD8E6,1.0));
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.shadowMapEnabled=true;
var planeGeometry=new THREE.PlaneGeometry(60,20,1,1); var planeMaterial=new THREE.MeshLambertMaterial({color:0x0ffd4}); var plane=new THREE.Mesh(planeGeometry,planeMaterial); plane.receiveShadow=true; plane.rotation.x=-Math.PI/2; plane.position.set(0,0,0); scene.add(plane);
camera.position.set(0,5,50); camera.lookAt(new THREE.Vector3(0,-10,0));
var ambientLight=new THREE.AmbientLight(0x0c0c0c); scene.add(ambientLight); var spotLight=new THREE.SpotLight(0xffffff); spotLight.castShadow = true; spotLight.position.set(-40,60,-10); scene.add(spotLight);
document.getElementById("WebGL-output").appendChild(renderer.domElement);
group=new THREE.Object3D(); function draw() { scene.remove(group) L0=20; c=controls.c; L=L0+c*time; group=new THREE.Object3D(); var cylinderGeometry=new THREE.CylinderGeometry(0.15,0.15,L); var cylinderMaterial=new THREE.MeshLambertMaterial({color: 0x7777ff}); var cylinder=new THREE.Mesh(cylinderGeometry,cylinderMaterial); var sphereGeometry=new THREE.SphereGeometry(1,20,20); var sphereMaterial=new THREE.MeshLambertMaterial({color: 0x7777ff}); var sphere=new THREE.Mesh(sphereGeometry,sphereMaterial); sphere.castShadow=true; cylinder.position.set(0,-L/2,0); sphere.position.set(0,-L,0); group.add(cylinder); group.add(sphere); group.position.set(0,0,0); scene.add(group); }
var omega,phi,c,time,dt; var controls = new function () { this.c=0.1; this.redraw=function() { dt=0.005; time=0; omega=0; phi=Math.PI/3; c=controls.c; group.rotation.z=phi; } this.L=20+this.c*time;
}
var controls1=new function() { this.L='0'; }
var gui = new dat.GUI();
gui.add(controls,'c',0.01,0.2);
gui.add(controls1,'L').listen();
gui.add(controls,'redraw');
controls.redraw();
render();
function render()
{
stats.update();
time+=dt;
draw();
omega=omega-((9.8*Math.sin(phi)+2*c*omega)/(L0+c*time))*dt; phi+=omega; controls1.L=L0+c*time; group.rotation.z=phi; renderer.render(scene,camera); requestAnimationFrame(render); } function initStats() { var stats = new Stats(); stats.setMode(0); stats.domElement.style.position = 'absolute'; stats.domElement.style.left = '0px'; stats.domElement.style.top = '0px'; document.getElementById("Stats-output").appendChild(stats.domElement); return stats; } }
window.onload = init;