Редактирование: Колебания материальной точки в поле силы тяжести

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

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

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 1: Строка 1:
 
[[Виртуальная лаборатория]] > [[Колебания материальной точки в поле силы тяжести]] <HR>
 
[[Виртуальная лаборатория]] > [[Колебания материальной точки в поле силы тяжести]] <HR>
== Краткое описание системы ==
 
Рассмотрим механическую систему с двумя степенями свободы: материальная точка массы <math>m</math> связана пружинами с двумя опорами, вся система находится в поле силы тяжести. Расстояние между опорами <math>2b</math>, длина пружин в недеформированном состоянии <math>a</math>, жесткость пружин <math>c</math>.
 
[[File:Scheme l.png|400px|left|Схема]]
 
Обозначим:
 
::<math>
 
S^{+} = \sqrt{y^{2}+(a+x)^{2}}\\
 
S^{-} = \sqrt{y^{2}+(a-x)^{2}}\\
 
</math>
 
Уравнения движения системы будут выглядеть так:
 
::<math>
 
\left\{
 
\begin{array}{ll}
 
m \ddot{x}  = \frac {c(a+x)}{S^{+}}(a-S^{+})-\frac {c(a-x)}{S^{+}}(a-S^{-})\\
 
\displaystyle m \ddot{y}  = -\frac {cy}{S^{+}}(a-S^{+})-\frac {cy}{S^{+}}(a-S^{-})+mg\\
 
\end{array}
 
\right.
 
</math>
 
 
==Реализация==
 
{{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Lobas/yiiis.html |width=1250 |height=1650 |border=0 }}
 
<br />
 
 
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 
'''Текст программы на языке JavaScript:''' <div class="mw-collapsible-content">
 
function MainBall(canvas, canvasX, canvasY) {
 
 
 
    var context = canvas.getContext("2d");        //основная картинка
 
var contextX = canvasX.getContext("2d");      //график отклонения по Х
 
var contextY = canvasY.getContext("2d");      //график отклонения по У
 
   
 
    var Pi = 3.1415926;                          //число пи
 
 
    var m0 = 1;                                  //масштаб массы
 
    var T0 = 1;                                  //масштаб времени
 
    var a0 = 1;                                  //масштаб расстояния
 
 
    var k0 = 2 * Pi / T0;                        //масштаб частоты 
 
    var C0 = m0 * k0 * k0;                        //масштаб жесткости
 
 
    var m = 1 * m0;                              //масса
 
var r = 5 * a0;                              //визуальный радиус шарика
 
    var C = 0.3 * C0;                            //жесткость пружин
 
var l = 100 * a0;                            //длина пружин
 
var g = 9.80665 * a0 / T0 / T0;              //ускорение свободного падения
 
var t = 0 * T0;                              //начальное время
 
 
    var fps = 50;                                //кадры в секунду
 
    var spf = 5;                                  //кол-во шагов интегрирования на один кадр
 
    var dt  = 0.4 * T0 / fps;                    //шаг интегрирования
 
 
 
var h = canvas.height;                        //высота картинки
 
    var w = canvas.width;                        //ширина картинки
 
    var hScale = canvas.height / l;              //коэффициент пересчета по высоте
 
    var wScale = canvas.width / l;                //коэффициент пересчета по ширине
 
 
    var ball = {'x':0, 'y':0, 'vx':0, 'vy':0, 'ax':0, 'ay':0}; //НУ
 
var sqp = 0;                                  //корень со знаком +
 
var sqm = 0;                                  //корень со знаком -
 
var n1 = 0;                                  //переменные для считывания команд пользователя
 
var n2 = 0;
 
var n3 = 0;
 
var n4 = 0;
 
var ab = 1;
 
var gr = 0;
 
    MainBall.prototype.setXo = function(n1){ball.x = n1;};              //считывание координаты Х
 
    MainBall.prototype.setYo = function(n2){ball.y = n2;};              //считывание координаты У
 
MainBall.prototype.setVXo = function(n3){ball.vx = ball.vx * n3;};  //обнуление скорости по Х
 
MainBall.prototype.setVYo = function(n4){ball.vy = ball.vy * n4;};  //обнуление скорости по У
 
MainBall.prototype.setAB = function(n5){ab = n5;};                  //считывание отношения а/b
 
 
    number_ab.oninput = function() {MainBall.prototype.setAB(Number(number_ab.value));}
 
 
restart.onclick = function(){
 
ball.x = 0;
 
ball.y = 0;
 
ball.vx = input_vx.value * 50;
 
ball.vy = input_vy.value * 50;
 
}
 
 
    function control() {
 
        physics();
 
        draw();
 
    }
 
//вычисления
 
    function physics(){
 
        for (var s=1; s<=spf; s++) {
 
sqm = Math.sqrt(ball.y * ball.y + (l - ball.x) * (l - ball.x));  //вычисление корня со знаком -
 
sqp = Math.sqrt(ball.y * ball.y + (l + ball.x) * (l + ball.x));  //вычисление корня со знаком +
 
            ball.ax = (C * (ball.x + l) * (l * ab - sqp) / sqp - C * (l - ball.x) * (l - sqm) / sqm) / m;  //вычисление ускорения по Х
 
ball.ay = (- C * ball.y * (sqp - l * ab) / sqp + C * ball.y * (l - sqm) / sqm + m * g) / m;    //вычисление ускорения по У
 
ball.vx += ball.ax * dt;  //вычисление скорости по Х
 
ball.vy += ball.ay * dt;  //вычисление скорости по У
 
ball.x += ball.vx * dt;  //вычисление координаты Х
 
ball.y += ball.vy * dt;  //вычисление координаты У
 
t += dt;                  //приращение времени
 
/*alert(ball.x + " " + ball.y + " " + ball.vx + " " + ball.vy + " " + ball.ax + " " + ball.ay);*/
 
 
}
 
    }
 
//рисование вспомогательных элементов графиков
 
contextX.beginPath();
 
contextX.strokeStyle = "#bbbbbb";
 
contextX.moveTo(0, h/4);
 
contextX.lineTo(1200, h/4);
 
contextX.closePath();
 
contextX.stroke();
 
 
contextY.beginPath();
 
contextY.strokeStyle = "#bbbbbb";
 
contextY.moveTo(0, h/4);
 
contextY.lineTo(1200, h/4);
 
contextY.closePath();
 
contextY.stroke();
 
//рисование шарика и пружин
 
    function draw(){
 
context.fillStyle = "#00ff00"; //рисование пружин
 
        context.beginPath();
 
context.clearRect(0, 0, w, h);
 
        context.moveTo(0, h / 2);
 
context.lineTo(ball.x * wScale + w / 2, ball.y * hScale + h / 2);
 
context.lineTo(w, h / 2);
 
context.stroke();
 
        context.closePath();
 
 
context.fillStyle = "#0000ff"; //рисование шарика
 
        context.beginPath();
 
        context.arc(ball.x * wScale + w / 2, ball.y * hScale + h / 2, r * wScale, 0, 2 * Pi, false);
 
        context.fill();
 
        context.closePath();
 
 
context.fillStyle = "#ff0000"; //рисование опор
 
        context.beginPath();
 
        context.arc(0, h / 2, a0 * wScale, 0, 2 * Pi, false);
 
context.arc(w, h / 2, a0 * wScale, 0, 2 * Pi, false);
 
        context.fill();
 
        context.closePath();
 
 
contextX.beginPath();          //рисование графика Х
 
contextX.strokeStyle = 'black';
 
contextX.moveTo(t*20 - dt * 10 - gr * 1200, ((ball.x - ball.vx * dt * 5) * 5 + h/2) / 2);
 
contextX.lineTo(t*20 - gr * 1200, (ball.x * 5 + h/2) / 2);
 
contextX.closePath();
 
contextX.stroke();
 
 
contextY.beginPath();          //рисование графика У
 
contextY.strokeStyle = 'black';
 
contextY.moveTo(t*20 - dt * 10 - gr * 1200, ((ball.y - ball.vy * dt * 5) * 5 + h/2) / 2);
 
contextY.lineTo(t*20 - gr * 1200, (ball.y * 5 + h/2) / 2);
 
contextY.closePath();
 
contextY.stroke();
 
 
if (t * 20 > (gr + 1) * 1200) {
 
contextX.clearRect(0, 0, 1200, h);
 
contextY.clearRect(0, 0, 1200, h);
 
 
contextX.beginPath();
 
contextX.strokeStyle = "#bbbbbb";
 
contextX.moveTo(0, h/4);
 
contextX.lineTo(1200, h/4);
 
contextX.closePath();
 
contextX.stroke();
 
 
contextY.beginPath();
 
contextY.strokeStyle = "#bbbbbb";
 
contextY.moveTo(0, h/4);
 
contextY.lineTo(1200, h/4);
 
contextY.closePath();
 
contextY.stroke();
 
gr++;
 
};
 
}
 
 
    setInterval(control, 1000/fps);
 
}
 
</div>
 
 
==Ссылки==
 
*Разработчик : [[Лобас Анна]]
 
* [[Виртуальная лаборатория]]
 
*[http://tm.spbstu.ru/htmlets/Lobas/YIIS.rar Скачать программу]
 
Вам запрещено изменять защиту статьи. 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:

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