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

Материал из Department of Theoretical and Applied Mechanics
Перейти к: навигация, поиск
(Визуализация процесса)
Строка 56: Строка 56:
  
 
{{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Palchikovskaya_NA/Generalwork2.html |width=600 |height=450}}
 
{{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Palchikovskaya_NA/Generalwork2.html |width=600 |height=450}}
 +
 +
 +
'''Текст программы на языке JavaScript:''' <div class="mw-collapsible-content">
 +
Файл '''"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;

Версия 20:38, 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:

Файл "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;