Маятник с растяжимой нитью — различия между версиями
(→Визуализация процесса) |
(→Решение) |
||
(не показано 6 промежуточных версий 3 участников) | |||
Строка 31: | Строка 31: | ||
<math>T = \frac{1}{2}\ m\ (\dot l\ ^{2}+l^{2}\dot\varphi^{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>\Pi = - m \ g\ l \cos(\varphi )\ </math> |
Дифференцируя полученные выражения энергий и подставляя в уравнение Лагранжа результаты дифференцирования, получаем уравнение движения рассматриваемой системы: | Дифференцируя полученные выражения энергий и подставляя в уравнение Лагранжа результаты дифференцирования, получаем уравнение движения рассматриваемой системы: | ||
Строка 47: | Строка 47: | ||
*stats.js | *stats.js | ||
− | *OrbitControls. | + | *OrbitControls.js |
Положим, что длина нити l увеличивается линейно с коэффициентом удлинения с. Это предположение используется при построении модели, то есть рассматриваем частный случай со следующим законом изменения длины нити: | Положим, что длина нити l увеличивается линейно с коэффициентом удлинения с. Это предположение используется при построении модели, то есть рассматриваем частный случай со следующим законом изменения длины нити: | ||
*l(t)=l(0)+ct | *l(t)=l(0)+ct | ||
+ | |||
+ | ==Демонстрация модели== | ||
{{#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}} | ||
+ | |||
+ | <div class="mw-collapsible mw-collapsed"> | ||
+ | '''Текст программы на языке JavaScript:''' <div class="mw-collapsible-content"> | ||
+ | Файл '''"Generalwork2.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(0xABB1E0,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:0x0ffd5}); | ||
+ | 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)); | ||
+ | |||
+ | OrbitControls= new THREE.OrbitControls(camera); | ||
+ | OrbitControls.autoRotate = true; | ||
+ | var clock = new THREE.Clock(); | ||
+ | |||
+ | 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; | ||
+ | |||
+ | var delta = clock.getDelta(); | ||
+ | orbitControls.update(delta); | ||
+ | |||
+ | 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; | ||
+ | </syntaxhighlight> | ||
+ | </div> |
Текущая версия на 12:04, 18 января 2021
Формулировка задачи[править]
Задача 48.13 Составить уравнение движения маятника, состоящего из материальной точки массы m, подвешенной на нити, длина которой изменяется по закону l=l(t)
Решение[править]
Для решения поставленной задачи воспользуемся уравнением Лагранжа 2-го рода
, где
T - кинетическая энергия системы П - потенциальная энергия системы q - независимые обобщенные координаты
В данной задаче в качестве обобщенной координаты возьмем угол отклонения нити от вертикали
.
Выразим кинетическую и потенциальную энергии через обобщенную координату.
Дифференцируя полученные выражения энергий и подставляя в уравнение Лагранжа результаты дифференцирования, получаем уравнение движения рассматриваемой системы:
Визуализация процесса[править]
Для моделирования колебаний данного маятника используется язык программирования JavaScript и следующие библиотеки:
- three.js
- dat.gui.js
- stats.js
- OrbitControls.js
Положим, что длина нити 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(0xABB1E0,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:0x0ffd5});
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 OrbitControls= new THREE.OrbitControls(camera);
23 OrbitControls.autoRotate = true;
24 var clock = new THREE.Clock();
25
26 var ambientLight=new THREE.AmbientLight(0x0c0c0c);
27 scene.add(ambientLight);
28 var spotLight=new THREE.SpotLight(0xffffff);
29 spotLight.castShadow = true;
30 spotLight.position.set(-40,60,-10);
31 scene.add(spotLight);
32
33 document.getElementById("WebGL-output").appendChild(renderer.domElement);
34
35 group=new THREE.Object3D();
36 function draw()
37 {
38 scene.remove(group)
39 L0=20;
40 c=controls.c;
41 L=L0+c*time;
42 group=new THREE.Object3D();
43 var cylinderGeometry=new THREE.CylinderGeometry(0.15,0.15,L);
44 var cylinderMaterial=new THREE.MeshLambertMaterial({color: 0x7777ff});
45 var cylinder=new THREE.Mesh(cylinderGeometry,cylinderMaterial);
46 var sphereGeometry=new THREE.SphereGeometry(1,20,20);
47 var sphereMaterial=new THREE.MeshLambertMaterial({color: 0x7777ff});
48 var sphere=new THREE.Mesh(sphereGeometry,sphereMaterial);
49 sphere.castShadow=true;
50 cylinder.position.set(0,-L/2,0);
51 sphere.position.set(0,-L,0);
52 group.add(cylinder);
53 group.add(sphere);
54 group.position.set(0,0,0);
55 scene.add(group);
56 }
57
58 var omega,phi,c,time,dt;
59 var controls = new function ()
60 {
61 this.c=0.1;
62 this.redraw=function()
63 {
64 dt=0.005;
65 time=0;
66 omega=0;
67 phi=Math.PI/3;
68 c=controls.c;
69 group.rotation.z=phi;
70 }
71 this.L=20+this.c*time;
72
73 }
74
75 var controls1=new function()
76 {
77 this.L='0';
78 }
79
80
81 var gui = new dat.GUI();
82 gui.add(controls,'c',0.01,0.2);
83 gui.add(controls1,'L').listen();
84 gui.add(controls,'redraw');
85
86
87 controls.redraw();
88 render();
89 function render()
90 {
91 stats.update();
92 time+=dt;
93 draw();
94
95 omega=omega-((9.8*Math.sin(phi)+2*c*omega)/(L0+c*time))*dt;
96 phi+=omega;
97 controls1.L=L0+c*time;
98 group.rotation.z=phi;
99
100 var delta = clock.getDelta();
101 orbitControls.update(delta);
102
103 renderer.render(scene,camera);
104 requestAnimationFrame(render);
105
106 }
107 function initStats()
108 {
109 var stats = new Stats();
110 stats.setMode(0);
111 stats.domElement.style.position = 'absolute';
112 stats.domElement.style.left = '0px';
113 stats.domElement.style.top = '0px';
114 document.getElementById("Stats-output").appendChild(stats.domElement);
115 return stats;
116 }
117 }
118 window.onload = init;