Движение материальной точки в центральном поле — различия между версиями
Материал из Department of Theoretical and Applied Mechanics
Строка 2: | Строка 2: | ||
− | + | Интерактивное приложение, представленное ниже, позволяет изучать траектории материальной точки в центральном степенном поле притяжения. Сила взаимодействия <math>F</math> является степенной функцией расстояния <math>r</math>: | |
:<math>F \sim r^n,</math> | :<math>F \sim r^n,</math> | ||
Строка 11: | Строка 11: | ||
<htmlet nocache="yes">FC_TM</htmlet> | <htmlet nocache="yes">FC_TM</htmlet> | ||
− | Текст | + | Текст приложения на языке JavaScript: <toggledisplay status=hide showtext="Показать↓" hidetext="Скрыть↑" linkstyle="font-size:default"> |
Файл '''"FC.js"''' | Файл '''"FC.js"''' | ||
<source lang="javascript" first-line="1"> | <source lang="javascript" first-line="1"> |
Версия 14:11, 18 мая 2014
Виртуальная лаборатория > Движение материальной точки в центральном поле
Интерактивное приложение, представленное ниже, позволяет изучать траектории материальной точки в центральном степенном поле притяжения. Сила взаимодействия является степенной функцией расстояния :
где
— некоторый вещественный безразмерный показатель степени. Притягивающий центр находиться в точке .<addscript src=FC/>
Не удается найти HTML-файл FC_TM.html
Текст приложения на языке JavaScript: <toggledisplay status=hide showtext="Показать↓" hidetext="Скрыть↑" linkstyle="font-size:default"> Файл "FC.js"
// Движение материальной точки в центральном поле
// Разработчик А.М. Кривцов
// 18.05.2014
// Интернет: tm.spbstu.ru/FC
function MainFC(canvas) {
// Предварительные установки
const X_max = canvas.width;
const Y_max = canvas.height;
// Размерные параметры
const m = 1.; // масса частицы
const a = 1.; // радиус круговой орбиты
const P = 1.; // сила притяжения на круговой орбите
// Расчет констант взаимодействия
const T = 2 * Math.PI * Math.sqrt(m * a / P); // период движения по круговой орбите
const v1 = Math.sqrt(P * a / m); // скорость движения по круговой орбите (1-ая космическая)
// Объявление переменных
var n, n1, dt1, zoom;
var x_min, x_max, sx, X0;
var y_min, y_max, sy, Y0;
// Задание начальных значений параметров
var v0 = 1.25 * v1; // начальная скорость
var t_max = 20 * T; // время интегрирования
var dt = T / 200; // шаг интегрирования
set_n(-2); // n - показатель степени в законе взаимодействия
set_zoom(2); // размер области отображения
var context; // на context происходит рисование
// настройка слайдеров и текстовых полей
Slider_01.min = 1;
Slider_01.max = 2;
Slider_01.step = 0.01;
Slider_01.value = v0 / v1;
Text_01.value = Slider_01.value;
Slider_02.max = 4;
Slider_02.min = -Slider_02.max;
Slider_02.step = 0.01;
Slider_02.value = n;
Text_02.value = Slider_02.value;
Slider_03.min = 0;
Slider_03.max = 6;
Slider_03.step = 0.01;
Slider_03.value = zoom;
Slider_03.value = 2;
Text_03.value = Slider_03.value;
Slider_04.min = 0;
Slider_04.max = 100;
Slider_04.step = 0.1;
Slider_04.value = t_max / T;
Text_04.value = Slider_04.value;
draw();
// функции, запускающиеся при перемещении слайдера
this.set_01 = function(input) { v0 = Number(input) * v1; draw(); }
this.set_02 = function(input) { set_n(input); draw(); }
this.set_03 = function(input) { set_zoom(input); draw(); }
this.set_04 = function(input) { t_max = Number(input) * T; draw(); }
function set_n(value)
{
n = Number(value);
n1 = (1 - n) / 2;
dt1 = -P / m * Math.pow(a, - n) * dt;
}
function set_zoom(value)
{
x_max = Number(value) * a; // размер области отображения
zoom = Number(value);
x_max = Math.pow(2, zoom) * a; // размер области отображения
// Область построения графика
y_max = x_max;
x_min = -x_max;
y_min = -y_max;
sy = Y_max / (y_max - y_min); // масштаб по оси y
Y0 = Y_max + y_min * sy; // положение 0 оси y в экранных координатах
sx = sy;
X0 = Y0;
}
// Отображение
function draw()
{
// Расчет параметров графики
context = canvas.getContext("2d"); // на context происходит рисование
context.clearRect(0, 0, X_max, Y_max); // очистить экран
// Горизонтальная ось
context.strokeStyle = 'lightgrey';
context.beginPath();
context.moveTo(0, Y0); context.lineTo(X_max, Y0);
context.moveTo(X0, 0); context.lineTo(X0, Y_max);
context.moveTo(X0 + a * sx, Y0); context.arc(X0, Y0, a * sx, 0, 2 * Math.PI);
context.stroke();
// Надписи
context.fillStyle = 'black';
context.font = "italic 20px Times";
context.fillText("0", X0 - 15, Y0 - 7);
context.strokeStyle = 'black';
context.beginPath();
var vx = v0;
var vy = 0;
var x = 0;
var y = a;
context.moveTo(X0, Y0 - a * sy);
for (var t = 0; t < t_max; t += dt)
{
var r2 = x * x + y * y;
// var r = Math.sqrt(r2); var rn = Math.pow(r, 1 - n);
var rn = Math.pow(r2, n1);
vx += x / rn * dt1;
vy += y / rn * dt1;
x += vx * dt;
y += vy * dt;
var X = X0 + x * sx;
var Y = Y0 - y * sy;
context.lineTo(X, Y);
}
context.stroke();
}
}
Файл "FC.html"
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Motion in Central Force Field</title>
<script src="FC.js"></script>
</head>
<body>
<canvas id="canvasGraph" width="600" height="600" style="border:1px solid #000000;"></canvas>
<!--Установка параметров взаимодействия (текстовые поля и слайдеры)-->
<div>
<font face= "Times New Roman"><I>
v</I><SUB>0</SUB> = <input id="Text_01" style="width: 4.2ex;" required pattern="[-+]?([0-9]*\.[0-9]+|[0-9]+)" oninput="
// если введено не число - строка не пройдет валидацию по паттерну выше, и checkValidity() вернет false
if (!this.checkValidity()) return;
app.set_01(this.value);
document.getElementById('Slider_01').value = this.value;
"><I> v</I><SUB>1</SUB>
<input type="range" id="Slider_01" style="width: 100px;" oninput="app.set_01(this.value); document.getElementById('Text_01').value = this.value;">
n = <input id="Text_02" style="width: 4.2ex;" required pattern="[-+]?([0-9]*\.[0-9]+|[0-9]+)" oninput="
if (!this.checkValidity()) return;
app.set_02(this.value);
document.getElementById('Slider_02').value = this.value;
">
<input type="range" id="Slider_02" style="width: 100px;" oninput="app.set_02(this.value); document.getElementById('Text_02').value = this.value;">
</font>
</div>
<div>
<font face= "Times New Roman">
zoom = <input id="Text_03" style="width: 4.2ex;" required pattern="[-+]?([0-9]*\.[0-9]+|[0-9]+)" oninput="
// если введено не число - строка не пройдет валидацию по паттерну выше, и checkValidity() вернет false
if (!this.checkValidity()) return;
app.set_03(this.value);
document.getElementById('Slider_03').value = this.value;
">
<input type="range" id="Slider_03" style="width: 100px;" oninput="app.set_03(this.value); document.getElementById('Text_03').value = this.value;">
<I>t</I><SUB>max</SUB> = <input id="Text_04" style="width: 4.2ex;" required pattern="[-+]?([0-9]*\.[0-9]+|[0-9]+)" oninput="
if (!this.checkValidity()) return;
app.set_04(this.value);
document.getElementById('Slider_04').value = this.value;
"><I> T</I>
<input type="range" id="Slider_04" style="width: 100px;" oninput="app.set_04(this.value); document.getElementById('Text_04').value = this.value;">
</font>
</div>
<script type="text/javascript">var app = new MainFC (
document.getElementById('canvasGraph')
);</script>
</body>
</html>
</toggledisplay>
Приложение позволяет интерактивно задавать следующие параметры:
- — начальная скорость точки. Начальная скорость направлена тангенциально (перпендикулярно радиальному направлению). Скорость измеряется по отношению к — скорости кругового движения на начальном удалении от центра (1-ая космическая скорость).
- — показатель степени в законе взаимодействия ( соответствует гравитационному взаимодействию, — линейной пружине).
- zoom — логарифмический масштаб отображения графика (используется логарифм по основанию 2).
- — время интегрирования, выраженное в периодах кругового движения на начальном удалении от центра.