Пример: баллистическое движение
Уравнение движения
Рассмотрим движение материальной точки, брошенной под углом к горизонту в поле силы тяжести. Будем считать, что на тело действует сила сопротивления, пропорциональная его скорости. Реальный закон сопротивления сложнее, однако здесь мы ограничимся указанной упрощенной постановкой. Запишем уравнение движения рассматриваемой системы и соответствующие начальные условия:
где
и — масса и радиус-вектор материальной точки, — сила тяжести, — коэффициент сопротивления, — начальная скорость, — время, точкой обозначена производная по времени, векторы выделены жирным шрифтом.Обозначим
. Тогда уравнение движения может быть записано в видеТочное решение
Ищем решение полученного линейного дифференциального уравнения в виде выражения
которое, после подстановки в уравнение движения с учетом начальных условий, дает следующую формулу для скорости
Легко видеть, что при
скорость стремится к постоянному значению , представляющему собой скорость парашютирования. Интегрирование по времени полученного выражения скорости с учетом начальных условий приводит к следующему уравнению для радиус-вектора материальной точкиБаллистическая кривая, соответствующая полученному выше решению, представлена на интерактивном графике ниже. Перемещение слайдера позволяет иследовать влияние угла броска и коэффициента сопротивления на форму траектории (при постоянной скорости броска).
<addscript src=mgb/>
// Баллистическая кривая (линейное сопротивление)
// Разработчик А.М. Кривцов
// 01-02.06.2014
// Интернет: tm.spbstu.ru/mgb
function MainMGB(canvas) {
// Предварительные установки
const deg = Math.PI / 180; // Угловой градус (degree)
const X_max = canvas.width;
const Y_max = canvas.height;
// Размерные параметры
const g = 1.; // ускорение свободного падения
const v0 = 1.; // начальная скорость
// Расчет констант
const h = v0 * v0 / 2 / g;
// Задание начальных значений параметров
var al;
var x, y;
var v0x, v0y;
var beta = .2 * g / v0;
set_al(60);
// Область построения графика
const x_min = 0;
const x_max = 2 * h;
const y_min = 0;
const y_max = h;
const N = X_max; // число точек по оси x
const dx = x_max / N; // шаг по оси x
const sx = X_max / x_max; // масштаб по оси x
var sy; // масштаб по оси y
var Y0; // положение 0 оси y в экранных координатах
var context; // на context происходит рисование
// настройка слайдеров и текстовых полей
Text_01.value = Math.round(al / deg);
Slider_01.min = 5;
Slider_01.max = 89;
Slider_01.step = 1;
Slider_01.value = Text_01.value;
Text_02.value = Math.round(beta / g * v0 * 100) / 100;
Slider_02.min = 0;
Slider_02.max = 1;
Slider_02.step = 0.01;
Slider_02.value = Text_02.value;
draw();
// функция, запускающаяся при перемещении слайдера
this.set_01 = function(input) { set_al(input); draw(); }
this.set_02 = function(input) { beta = Number(input) * g / v0; Text_02.value = Math.round(beta / g * v0 * 100) / 100; Slider_02.value = Text_02.value; draw(); }
// Функции, запускающиеся при изменении элементов управления
this.setCheckbox_01 = function(bool) { draw(); }
this.setCheckbox_02 = function(bool) { draw(); }
this.setCheckbox_03 = function(bool) { draw(); }
this.setCheckbox_04 = function(bool) { draw(); }
function set_al(value)
{
al = value * deg;
v0x = v0 * Math.cos(al);
v0y = v0 * Math.sin(al);
}
// Отображение
function draw()
{
// Расчет параметров графики
sy = Y_max / (y_max - y_min); // масштаб по оси y
Y0 = Y_max + y_min * sy; // положение 0 оси y в экранных координатах
context = canvas.getContext("2d"); // на context происходит рисование
context.clearRect(0, 0, X_max, Y_max); // очистить экран
// Графики
// Graph(F0, checkbox_02.checked, 'lightgrey');
Graph(F1, checkbox_02.checked, 'grey');
Graph(F2, checkbox_01.checked, 'red');
Graph(F3, checkbox_03.checked, 'blue');
Graph(F4, checkbox_04.checked, 'magenta');
// Надписи
context.fillStyle = 'black';
context.font = "italic 20px Times";
context.fillText("x", x_max * sx - 15, Y0 - 7);
context.fillText("y", 5, 15);
context.fillText("0", 10, Y0 - 3);
}
// Построение графика функции
function Graph(F, flag, color)
{
if (!flag) return;
context.strokeStyle = color;
context.beginPath();
var dt = dx / v0x;
var t_max = x_max / v0x;
y = 0;
for (var t = 0; t < t_max; t += dt)
{
F(t);
var X = x * sx;
var Y = Y0 - y * sy;
context.lineTo(X, Y);
}
context.stroke();
}
// Траектории
// al = 45 * deg;
function F0(t)
{
x = v0x * t;
y = x - g / (v0 * v0) * x * x;
}
// Произвольное al
function F1(t)
{
x = v0x * t;
y = v0y * t - g * t * t / 2;
}
// Сопротивление, точное решение
function F2(t)
{
if (Math.abs(beta) < 1e-6) { F1(t); return; }
var t1 = (1 - Math.exp(-beta * t)) / beta;
x = v0x * t1;
y = (v0y + g / beta) * t1 - g / beta * t;
}
// Сопротивление, квадратичное приближение
function F3(t)
{
x = v0x * t - beta * v0x * t * t / 2;
y = v0y * t - (g + beta * v0y) * t * t / 2;
}
// Сопротивление, кубическое приближение
function F4(t)
{
x = v0x * t - beta * v0x * t * t / 2;
y = v0y * t - (g + beta * v0y) * t * t / 2 + beta * g * t * t * t / 6;
}
}
Файл "mgb.html"
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>mgb</title>
<script src="mgb.js"></script>
</head>
<body>
<canvas id="canvasGraph" width="800" height="400" style="border:1px solid #000000;"></canvas>
<!--Выбор графика (чекбоксы)-->
<div>
Траектория:
<font color="#FF0000" size="5"><B>—</B></font>
<input type="checkbox" id="checkbox_01" name="" onchange="app.setCheckbox_01(this.checked);" checked/>с учетом сопротивления,
<font color="#AAAAAA" size="5"><B>—</B></font>
<input type="checkbox" id="checkbox_02" name="" onchange="app.setCheckbox_02(this.checked);" checked/>без сопротивления
</div>
<div>
Приближение:
<font color="#0000FF" size="5"><B>—</B></font>
<input type="checkbox" id="checkbox_03" name="" onchange="app.setCheckbox_03(this.checked);" checked/>квадратичное,
<font color="#FF00FF" size="5"><B>—</B></font>
<input type="checkbox" id="checkbox_04" name="" onchange="app.setCheckbox_04(this.checked);" checked/>кубическое
</div>
<!--Установка параметров взаимодействия (текстовые поля и слайдеры)-->
<div>
Угол броска:
<font face= "Times New Roman">
<I>α</I> = <input id="Text_01" style="width: 2.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;
">˚
<input type="range" id="Slider_01" style="width: 100px;" oninput="app.set_01(this.value); document.getElementById('Text_01').value = this.value;">
</font>,
коэффициент сопротивления:
<font face= "Times New Roman">
<I>β</I> = <input id="Text_02" style="width: 4.4ex;" required pattern="[-+]?([0-9]*\.[0-9]+|[0-9]+)" oninput="
// если введено не число - строка не пройдет валидацию по паттерну выше, и checkValidity() вернет false
if (!this.checkValidity()) return;
app.set_02(this.value);
document.getElementById('Slider_02').value = this.value;
"><I> g/v</I><SUB>0</SUB>
<input type="range" id="Slider_02" style="width: 100px;" oninput="app.set_02(this.value); document.getElementById('Text_02').value = this.value;">
</font>
</div>
<script type="text/javascript">var app = new MainMGB(
document.getElementById('canvasGraph')
);</script>
</body>
</html>
</toggledisplay>
{{#ifgroup:sysop|
Случай малого сопротивления
Данный раздел нуждается в доработке, поэтому в настоящее время скрыт для большинства пользователей.
Рассмотрим случай малого сопротивления:
. Используем разложениеПодстановка данного разложения в выражение для
даетТаким образом, движение при малом сопротивлении эквивалентно движению без сопротивления, но с измененной по величине и направлению силой тяжести, а траектория материальной точки представляет собой наклоненную параболу.
Данный вывод очень нагляден, однако, строго говоря, он справедлив только для очень малых времен, когда в разложении экспоненты можно пренебречь следующими слагаемыми. Достаточно очевидно, что время движения должно быть ограничено, так как должно выполняться условие
. Например, при броске с большой высоты тело может перейти в режим парашютирования, который не описывается данным приближенным решением. Однако, на самом деле, ограничение еще более жесткое. Даже для времен, необходимых для достижения верхней точки траектории, вообще говоря, необходимо удерживать следующее слагаемое в разложении экспоненты, так как оно дает хоть и меньший, но сравнимый вклад. Действительно, разложениеприводит к выражению
Таким образом, мы имеем два слагаемых, линейных по
. Хоть они и имеют разный порядок малости по , однако для времен порядка они, очевидно, дают сравнимый вклад ( — вертикальная компонента начальной скорости).}}