Редактирование: Эллиптический маятник

Перейти к: навигация, поиск

Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 1: Строка 1:
 
'''''Задача:''''' С помощью языка программирования JavaScript смоделировать эллиптический маятник.
 
'''''Задача:''''' С помощью языка программирования JavaScript смоделировать эллиптический маятник.
 
'''Исполнитель:''' [[Булдаков Павел]] 
 
 
'''Группа:''' [[Группа 09|09]] (23604)
 
 
'''Семестр:''' весна 2015
 
 
 
[[Файл:maytnic.png|thumb|]]
 
[[Файл:maytnic.png|thumb|]]
  
 
== Решение ==
 
== Решение ==
 
{{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/buldakov/4.html |width=1200 |height=600}}
 
 
 
Программа: [[Медиа: Maytnic.rar|скачать]]
 
 
<div class="mw-collapsible mw-collapsed">
 
'''Текст программы на языке JavaScript:''' <div class="mw-collapsible-content">
 
 
<syntaxhighlight lang="javascript" line start="1" enclose="div">
 
function main()
 
{
 
//определяем сцену
 
 
var scene = new THREE.Scene();
 
var camera = new THREE.PerspectiveCamera(45, window.innerWidth/window.innerHeight, 0.1, 1000);
 
var render = new THREE.WebGLRenderer();
 
render.setClearColor(0xEEEEEE, 1);
 
render.setSize(window.innerWidth, window.innerHeight);
 
 
//ставим оси
 
 
var axes = new THREE.AxisHelper(20);
 
scene.add(axes);
 
var planeGeometry = new THREE.PlaneGeometry(80,10,1,1);
 
var planeMaterial = new THREE.MeshLambertMaterial({color:0xCCCCCC});
 
var plane = new THREE.Mesh(planeGeometry, planeMaterial);
 
plane.rotation.x = -0.5*Math.PI;
 
plane.position.x=0;
 
plane.position.y=0;
 
plane.position.z=0;
 
scene.add(plane);
 
 
//создаем ползун
 
 
var cubeGeometry = new THREE.CubeGeometry(20,10,10);
 
var cubeMesh = new THREE.MeshLambertMaterial({color:0xff0000, wireframe:false});
 
var cube = new THREE.Mesh(cubeGeometry, cubeMesh);
 
cube.position.x=-30;
 
cube.position.y=5;
 
cube.position.z=0;
 
scene.add(cube);
 
 
// создаем соединяющую
 
 
var cube1Geometry = new THREE.CubeGeometry(1,15,0.5);
 
var cube1Mesh = new THREE.MeshLambertMaterial({color:777777, wireframe:false});
 
var cube1 = new THREE.Mesh(cube1Geometry, cube1Mesh);
 
cube1.position.x=-20;
 
cube1.position.y=-5;
 
cube1.position.z=5;
 
scene.add(cube1);
 
 
// создаем шшар
 
 
var trajectoryGeometry = new THREE.SphereGeometry(0.3,20,20);
 
var trajectoryMaterial = new THREE.MeshBasicMaterial({color:0x7777ff, wireframe:true});
 
var sphereGeometry = new THREE.SphereGeometry(4,20,20);
 
var sphereMaterial = new THREE.MeshLambertMaterial({color:0x7777ff, wireframe:false});
 
var sphere = new THREE.Mesh(sphereGeometry, sphereMaterial)
 
sphere.position.x=-30;
 
sphere.position.y=-15;
 
sphere.position.z=5;
 
scene.add(sphere);
 
 
// устанавливаем источник света
 
 
var  spotLight = new THREE.SpotLight(0xffffff);
 
spotLight.position.set(-40,60,100);
 
scene.add(spotLight);
 
 
//задаем тени
 
 
render.shadowMapEnabled = true;
 
plane.receiveShadow = true;
 
cube.castShadow = true;
 
sphere.castShadow = true;
 
spotLight.castShadow = true;
 
 
 
//задаем положение камеры
 
 
camera.position.x= 1.5;
 
camera.position.y= 13.7;
 
camera.position.z= 80;
 
camera.lookAt(scene.position);
 
$("#webGL").append(render.domElement);
 
 
//добавляем ползунки для изменения скорости , массы, длины  и g
 
 
 
var controls = new function() {
 
this.m1 = 7.4;
 
this.m2 = 2.9;
 
this.l = 1;
 
this.g = 9.83
 
this.bouncingSpeed = 0.03;
 
}
 
var gui = new dat.GUI();
 
 
gui.add(controls, 'bouncingSpeed',0,0.5);
 
gui.add(controls, 'm1',1,10);
 
gui.add(controls, 'm2',1,10);
 
gui.add(controls, 'l',0.5,5);
 
gui.add(controls, 'g',0.5,20);
 
 
 
 
var stats = initStats();
 
var step = 0;
 
 
contra = new THREE.OrbitControls(camera);
 
contra.dumping = 0.2;
 
 
 
window.addEventListener('resize',onWindowResize,false);
 
 
function onWindowResize(){
 
camera.aspect = window.innerWidth/window.innerHeight;
 
camera.updateProjectionMatrix();
 
render.setSize(window.innerWidth,window.innerHeight);
 
renderer();
 
}
 
 
renderer();
 
 
// функция, в которой задаются законы, по которым работает эллиптический маятник
 
 
function renderer()
 
{
 
 
 
stats.update();
 
 
step+=controls.bouncingSpeed;
 
cube1.scale.set(1,controls.l,0.5);
 
t = 15*controls.l;
 
 
k =Math.sqrt(controls.g/t*controls.m1/(controls.m1+controls.m2));
 
a = t*controls.m1/(controls.m1+controls.m2)*controls.m2/controls.m1*controls.g;
 
cube.position.x=-a*Math.sin(k*step);
 
sphere.position.x = t*(Math.sin(Math.sin(k*step))) - a*Math.sin(k*step);
 
sphere.position.y =-t*(Math.cos(Math.sin(k*step)));
 
cube1.position.x=(cube.position.x + sphere.position.x)/2;
 
cube1.position.y=-t*(Math.cos(Math.sin(k*step)))/2;
 
u = (-cube.position.x + sphere.position.x)/2;
 
v = sphere.position.y/2;
 
cube1.rotation.z=Math.asin(u/Math.sqrt(v*v + u*u));
 
 
 
 
requestAnimationFrame(renderer);
 
contra.update();
 
render.render(scene,camera);
 
 
var trajectory = new THREE.Mesh(trajectoryGeometry,trajectoryMaterial);
 
trajectory.position.x = sphere.position.x;
 
trajectory.position.y = sphere.position.y;
 
trajectory.position.z = 5;
 
scene.add(trajectory);
 
document.getElementById("td1").innerHTML = camera.position.x;
 
document.getElementById("td2").innerHTML = camera.position.y;
 
document.getElementById("td3").innerHTML = camera.position.z;
 
 
}
 
 
 
}
 
function initStats()
 
{
 
var stats = new Stats();
 
stats.setMode(0);
 
stats.domElement.style.position='absolute';
 
stats.domElement.style.left = '0px';
 
stats.domElement.style.top = '0px';
 
$("#Stats").append(stats.domElement);
 
return stats;
 
}
 
 
</syntaxhighlight>
 
</div>
 
  
 
== Используемые библиотеки ==
 
== Используемые библиотеки ==
Строка 204: Строка 16:
  
 
* задание скорости раскачивания маятника
 
* задание скорости раскачивания маятника
* изменение масс шара и ползуна
 
* изменения силы тяжести
 
 
* детальное рассмотрение работы с удобного ракурса
 
* детальное рассмотрение работы с удобного ракурса
 
* получение рисунка траектории маятника
 
* получение рисунка траектории маятника
Строка 221: Строка 31:
 
где <math>L</math> - функция Лагранжа
 
где <math>L</math> - функция Лагранжа
  
<math>L = T-\Pi </math>
+
<math>L = T-П </math>
  
<math>T</math> - кинетическая энергия системы, <math>\Pi</math> - потенциальная энергия системы <math>q_1 = y</math> , <math>q_2 = \varphi </math>
+
<math>T</math> - кинетическая энергия системы, <math>П</math> - потенциальная энергия системы <math>q_1 = y</math> , <math>q_2 = phy</math>
  
 
<math>T = T_1 + T_2</math>, где <math> T_1</math> - кинетическая энергия ползуна, <math>T_1</math> - кинетическая энергия шара
 
<math>T = T_1 + T_2</math>, где <math> T_1</math> - кинетическая энергия ползуна, <math>T_1</math> - кинетическая энергия шара
  
<math>T_1 = \frac{1}{2}\ m_1\dot y^{2}</math>
+
<math>T_1 = \frac{1}{2}\ m_1\dot y</math>
 
 
<math>T_2 = \frac{1}{2}\ m_2\ V_2 ^{2}</math>
 
 
 
<math>V_2 = V_e + V_r</math> , <math>V_e = \dot \varphi \ l</math> , <math>V_r = \dot y\</math>
 
 
 
<math>V_2 ^{2} = \dot y^{2}\ + \dot \varphi ^{2}\ l^{2} + 2\ l\dot y\dot \varphi \cos(\varphi )\</math>
 
 
 
<math>T = \frac{1}{2} \ (m_1 + m_2) \dot y^{2} + \frac{1}{2} \ m_2 \ l ^{2} \dot \varphi^{2} + m_2 \ l\dot y\dot \varphi \cos(\varphi )\</math>
 
 
 
<math>\Pi = - m_2 \ l\ g \cos(\varphi )\ </math>
 
 
 
<math>L = \frac{1}{2} \ (m_1 + m_2) \dot y^{2} + \frac{1}{2} \ m_2 \ l ^{2} \dot \varphi^{2} + m_2 \ l\ (\dot y\dot \varphi + g) \cos(\varphi )\</math>
 
 
 
<math>\frac{\partial L}{\partial\dot y} = (m_1 + m_2) \dot y + m_2 \ l\dot \varphi \cos(\varphi )\</math>   
 
 
 
<math>\frac{\partial L}{\partial y} = 0  </math>
 
 
 
<math>\frac{\partial L}{\partial\dot \varphi } = m_2 \ l ^{2} \dot \varphi + m_2 \ l\dot y \cos(\varphi )\</math>
 
 
 
<math>\frac{\partial L}{\partial\varphi} = - m_2 \ l\ (\dot y\dot \varphi + g) \sin(\varphi )\</math>
 
 
 
В результате получаем уравнения , описывающие движение рассматриваемой системы :
 
 
 
<math> (m_1 + m_2) \ddot y + m_2 \ l\ddot \varphi \cos(\varphi ) - m_2 \ l\dot \varphi \sin(\varphi ) = 0</math>
 
 
 
<math> l \ddot \varphi + \ddot y \cos(\varphi ) + g \sin(\varphi) = 0 </math>
 
  
 
== См. также ==
 
== См. также ==
Вам запрещено изменять защиту статьи. Edit Создать редактором

Обратите внимание, что все добавления и изменения текста статьи рассматриваются как выпущенные на условиях лицензии Public Domain (см. Department of Theoretical and Applied Mechanics:Авторские права). Если вы не хотите, чтобы ваши тексты свободно распространялись и редактировались любым желающим, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого.
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ МАТЕРИАЛЫ, ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ!

To protect the wiki against automated edit spam, we kindly ask you to solve the following CAPTCHA:

Отменить | Справка по редактированию  (в новом окне)