Пример: баллистическое движение — различия между версиями
(Новая страница: «А.М. Кривцов > [[Теоретическая механика: физико-механический факультет|Теоретическая мех...») |
Денис (обсуждение | вклад) |
||
(не показано 17 промежуточных версий 3 участников) | |||
Строка 1: | Строка 1: | ||
+ | [[Виртуальная лаборатория]] > '''Баллистическое движение''' | ||
[[А.М. Кривцов]] > [[Теоретическая механика: физико-механический факультет|Теоретическая механика]] > [[А.М. Кривцов. Рабочие материалы по курсу "Теоретическая механика"#Глава 5. Динамика материальной точки|Рабочие материалы]] > [[Пример: баллистическое движение]] <HR> | [[А.М. Кривцов]] > [[Теоретическая механика: физико-механический факультет|Теоретическая механика]] > [[А.М. Кривцов. Рабочие материалы по курсу "Теоретическая механика"#Глава 5. Динамика материальной точки|Рабочие материалы]] > [[Пример: баллистическое движение]] <HR> | ||
− | Рассмотрим движение материальной точки, брошенной под углом горизонту в поле силы тяжести. Будем считать, что на тело действует сила сопротивления, пропорциональная его скорости. Реальный закон сопротивления сложнее, однако здесь мы ограничимся указанной упрощенной постановкой. Запишем уравнение движения рассматриваемой системы и соответствующие начальные условия: | + | == Уравнение движения == |
+ | |||
+ | Рассмотрим движение материальной точки, брошенной под углом к горизонту в поле силы тяжести. Будем считать, что на тело действует сила сопротивления, пропорциональная его скорости. Реальный закон сопротивления сложнее, однако здесь мы ограничимся указанной упрощенной постановкой. Запишем уравнение движения рассматриваемой системы и соответствующие начальные условия: | ||
:<math> | :<math> | ||
m\ddot{\bf r} = m{\bf g} - b\dot{\bf r};\qquad | m\ddot{\bf r} = m{\bf g} - b\dot{\bf r};\qquad | ||
Строка 10: | Строка 13: | ||
где | где | ||
− | <math>m</math> и <math>{\bf r}</math> — масса и радиус-вектор материальной точки, <math>m{\bf g}</math> — сила тяжести, <math>b\vphantom{b_0}</math> — коэффициент сопротивления, <math>{\bf v}_0</math> — начальная скорость, <math>t</math> — время, производная по времени | + | <math>m</math> и <math>{\bf r}</math> — масса и радиус-вектор материальной точки, <math>m{\bf g}</math> — сила тяжести, <math>b\vphantom{b_0}</math> — коэффициент сопротивления, <math>{\bf v}_0</math> — начальная скорость, <math>t</math> — время, точкой обозначена производная по времени, векторы выделены жирным шрифтом. |
Обозначим | Обозначим | ||
Строка 17: | Строка 20: | ||
:<math>\dot{\bf v} + \beta{\bf v} = {\bf g}.</math> | :<math>\dot{\bf v} + \beta{\bf v} = {\bf g}.</math> | ||
− | Ищем решение полученного линейного дифференциального уравнения в виде | + | == Точное решение == |
+ | |||
+ | Ищем решение полученного линейного дифференциального уравнения в виде выражения | ||
:<math>{\bf v} = {\bf C}_1e^{\lambda t} + {\bf C}_2,</math> | :<math>{\bf v} = {\bf C}_1e^{\lambda t} + {\bf C}_2,</math> | ||
− | + | которое, после подстановки в уравнение движения с учетом начальных условий, дает следующую формулу для скорости | |
:<math>{\bf v} = \left({\bf v}_0 - \frac{\bf g}{\beta}\right)e^{-\beta t} + \frac{\bf g}{\beta}.</math> | :<math>{\bf v} = \left({\bf v}_0 - \frac{\bf g}{\beta}\right)e^{-\beta t} + \frac{\bf g}{\beta}.</math> | ||
Строка 29: | Строка 34: | ||
:<math>{\bf r} = \frac1\beta\left({\bf v}_0 - \frac{\bf g}{\beta}\right)\left(1-e^{-\beta t}\right) + \frac{\bf g}{\beta}\,t.</math> | :<math>{\bf r} = \frac1\beta\left({\bf v}_0 - \frac{\bf g}{\beta}\right)\left(1-e^{-\beta t}\right) + \frac{\bf g}{\beta}\,t.</math> | ||
− | + | Баллистическая кривая, соответствующая полученному выше решению, представлена на интерактивном графике ниже. Перемещение слайдера позволяет иследовать влияние угла броска и коэффициента сопротивления на форму траектории (при постоянной скорости броска). | |
+ | |||
+ | |||
+ | <htmlet nocache="yes">Krivtsov/mgb_TM</htmlet> | ||
+ | <div class="mw-collapsible mw-collapsed" style="width:100%" > | ||
+ | '''Текст программы построения графиков на языке JavaScript:''' <div class="mw-collapsible-content"> | ||
+ | Файл '''"mgb.js"''' | ||
+ | <syntaxhighlight lang="javascript" line start="1" enclose="div"> | ||
+ | // Баллистическая кривая (линейное сопротивление) | ||
+ | // Разработчик А.М. Кривцов | ||
+ | // 01-02.06.2014 | ||
+ | // 06.11.2014 коррекция - удаление const (Цветков) | ||
+ | // Интернет: tm.spbstu.ru/mgb | ||
+ | |||
+ | function MainMGB(canvas) { | ||
+ | |||
+ | // Предварительные установки | ||
+ | |||
+ | var deg = Math.PI / 180; // Угловой градус (degree) | ||
+ | |||
+ | var X_max = canvas.width; | ||
+ | var Y_max = canvas.height; | ||
+ | |||
+ | // Размерные параметры | ||
+ | |||
+ | var g = 1.; // ускорение свободного падения | ||
+ | var v0 = 1.; // начальная скорость | ||
+ | |||
+ | // Расчет констант | ||
+ | |||
+ | var h = v0 * v0 / 2 / g; | ||
+ | |||
+ | // Задание начальных значений параметров | ||
+ | |||
+ | var al; | ||
+ | var x, y; | ||
+ | var v0x, v0y; | ||
+ | |||
+ | var beta = .2 * g / v0; | ||
+ | |||
+ | set_al(60); | ||
+ | |||
+ | // Область построения графика | ||
+ | var x_min = 0; | ||
+ | var x_max = 2 * h; | ||
+ | var y_min = 0; | ||
+ | var y_max = h; | ||
+ | |||
+ | var N = X_max; // число точек по оси x | ||
+ | var dx = x_max / N; // шаг по оси x | ||
+ | var 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; | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | Файл '''"mgb.html"''' | ||
+ | <syntaxhighlight lang="html5" line start="1" enclose="div"> | ||
+ | <!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> | ||
+ | </syntaxhighlight> | ||
+ | </div> | ||
+ | </div> | ||
+ | |||
+ | |||
+ | == Случай малого сопротивления == | ||
+ | |||
+ | Полученное выше решение | ||
+ | |||
+ | :<math>{\bf r} = \frac1\beta\left({\bf v}_0 - \frac{\bf g}{\beta}\right)\left(1-e^{-\beta t}\right) + \frac{\bf g}{\beta}\,t.</math> | ||
+ | |||
+ | дает точную формулу для траектории. Однако не может не вызывать удивление отличие полученной формулы от классической формулы | ||
+ | |||
+ | :<math>{\bf r} = {\bf v}_0\, t + {\bf g}\,\frac{t^2}2,</math> | ||
+ | |||
+ | описывающей [[Траектория тела, брошенного под углом к горизонту|движение тела, брошенного под углом к горизонту]] без учета сопротивления. Чтобы показать связь этих решений, рассмотрим случай малого сопротивления: <math>\beta t \ll 1</math>. Используем разложение | ||
:<math>e^{-\beta t} \approx 1 - \beta t + \frac12\,\beta^2 t^2. </math> | :<math>e^{-\beta t} \approx 1 - \beta t + \frac12\,\beta^2 t^2. </math> | ||
− | Подстановка данного разложения в | + | Подстановка данного разложения в формулу точного решения дает |
:<math>{\bf r} = {\bf v}_0 t + \frac12\,\tilde{\bf g} t^2,\qquad | :<math>{\bf r} = {\bf v}_0 t + \frac12\,\tilde{\bf g} t^2,\qquad | ||
Строка 39: | Строка 295: | ||
</math> | </math> | ||
− | '' | + | ''Следовательно, движение при малом сопротивлении близко к движению без сопротивления, но с измененной по величине и направлению силой тяжести, а траектория материальной точки приближенно представляет собой наклоненную параболу.'' |
+ | |||
+ | Данный вывод очень нагляден, однако, строго говоря, он справедлив только для очень малых времен. Соответствующую кривую можно увидеть на интерактивном графике выше, если установить флажок, соответствующий квадратичному приближению. Из графиков видно, что приближенное решение дает оценку для точного решения, однако погрешность относительно высока. Из использованного разложения можно было бы ожидать, что приближенное решение будет асимптотически близко к точному при <math>\beta\to0</math>. Действительно, для справедливости использованного разложения должно выполняться условие <math>\beta t \ll 1</math>. То есть решение справедливо для не слишком больших времен. В частности, при броске с большой высоты тело может перейти в режим парашютирования, который не описывается данным приближенным решением. | ||
+ | |||
+ | Однако, на самом деле, ограничение еще более жесткое. Это можно увидеть, если удержать следующее слагаемое в разложении экспоненты: | ||
+ | |||
+ | :<math>e^{-\beta t} \approx 1 - \beta t + \frac12\,\beta^2 t^2 - \frac16\,\beta^3 t^3, </math> | ||
+ | |||
+ | что приводит к выражению | ||
+ | |||
+ | :<math>{\bf r} = {\bf v}_0 t + \frac12\left({\bf g} - \beta {\bf v}_0\right) t^2 - \frac16\,\beta{\bf g}t^3. | ||
+ | </math> | ||
+ | |||
+ | Данное выражение отличается наличием последнего слагаемого, которое дает хоть и меньший, но сравнимый вклад. В выражении имеется два слагаемых, линейных по <math>\beta</math>. Хоть они и имеют разный порядок малости по <math>t</math>, однако для времен порядка <math>v_{0}/g</math> (такой порядок имеет полное время полета) они, очевидно, дают сравнимый вклад. Соответствующую кривую можно увидеть на интерактивном графике выше, если установить флажок, соответствующий кубическому приближению. | ||
+ | |||
+ | Таким образом, квадратичное приближение имеет асимптотическую точность только при малых временах <math>t \ll v_{0}/g</math>. Однако, как видно из графиков, оно все же неплохо приближает точное решение, как при малых <math>\beta</math>, так и при больших, для которых форма кривой оказывается даже более адекватной, чем для кубического приближения. Следовательно, наглядная интерпретация в виде наклоненной параболы вполне допустима для качественного описания баллистического движения. | ||
+ | |||
+ | == См. также == | ||
+ | |||
+ | * [[Траектория тела, брошенного под углом к горизонту]] | ||
− | + | [[Category: Виртуальная лаборатория|Баллистическое движение]] |
Текущая версия на 09:17, 11 марта 2015
Виртуальная лаборатория > Баллистическое движение
А.М. Кривцов > Теоретическая механика > Рабочие материалы > Пример: баллистическое движение
Уравнение движения[править]
Рассмотрим движение материальной точки, брошенной под углом к горизонту в поле силы тяжести. Будем считать, что на тело действует сила сопротивления, пропорциональная его скорости. Реальный закон сопротивления сложнее, однако здесь мы ограничимся указанной упрощенной постановкой. Запишем уравнение движения рассматриваемой системы и соответствующие начальные условия:
где
и — масса и радиус-вектор материальной точки, — сила тяжести, — коэффициент сопротивления, — начальная скорость, — время, точкой обозначена производная по времени, векторы выделены жирным шрифтом.Обозначим
. Тогда уравнение движения может быть записано в видеТочное решение[править]
Ищем решение полученного линейного дифференциального уравнения в виде выражения
которое, после подстановки в уравнение движения с учетом начальных условий, дает следующую формулу для скорости
Легко видеть, что при
скорость стремится к постоянному значению , представляющему собой скорость парашютирования. Интегрирование по времени полученного выражения скорости с учетом начальных условий приводит к следующему уравнению для радиус-вектора материальной точкиБаллистическая кривая, соответствующая полученному выше решению, представлена на интерактивном графике ниже. Перемещение слайдера позволяет иследовать влияние угла броска и коэффициента сопротивления на форму траектории (при постоянной скорости броска).
Файл "mgb.js"
1 // Баллистическая кривая (линейное сопротивление)
2 // Разработчик А.М. Кривцов
3 // 01-02.06.2014
4 // 06.11.2014 коррекция - удаление const (Цветков)
5 // Интернет: tm.spbstu.ru/mgb
6
7 function MainMGB(canvas) {
8
9 // Предварительные установки
10
11 var deg = Math.PI / 180; // Угловой градус (degree)
12
13 var X_max = canvas.width;
14 var Y_max = canvas.height;
15
16 // Размерные параметры
17
18 var g = 1.; // ускорение свободного падения
19 var v0 = 1.; // начальная скорость
20
21 // Расчет констант
22
23 var h = v0 * v0 / 2 / g;
24
25 // Задание начальных значений параметров
26
27 var al;
28 var x, y;
29 var v0x, v0y;
30
31 var beta = .2 * g / v0;
32
33 set_al(60);
34
35 // Область построения графика
36 var x_min = 0;
37 var x_max = 2 * h;
38 var y_min = 0;
39 var y_max = h;
40
41 var N = X_max; // число точек по оси x
42 var dx = x_max / N; // шаг по оси x
43 var sx = X_max / x_max; // масштаб по оси x
44
45 var sy; // масштаб по оси y
46 var Y0; // положение 0 оси y в экранных координатах
47 var context; // на context происходит рисование
48
49 // настройка слайдеров и текстовых полей
50
51 Text_01.value = Math.round(al / deg);
52 Slider_01.min = 5;
53 Slider_01.max = 89;
54 Slider_01.step = 1;
55 Slider_01.value = Text_01.value;
56
57 Text_02.value = Math.round(beta / g * v0 * 100) / 100;
58 Slider_02.min = 0;
59 Slider_02.max = 1;
60 Slider_02.step = 0.01;
61 Slider_02.value = Text_02.value;
62
63 draw();
64
65 // функция, запускающаяся при перемещении слайдера
66 this.set_01 = function(input) { set_al(input); draw(); }
67 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(); }
68
69 // Функции, запускающиеся при изменении элементов управления
70 this.setCheckbox_01 = function(bool) { draw(); }
71 this.setCheckbox_02 = function(bool) { draw(); }
72 this.setCheckbox_03 = function(bool) { draw(); }
73 this.setCheckbox_04 = function(bool) { draw(); }
74
75 function set_al(value)
76 {
77 al = value * deg;
78 v0x = v0 * Math.cos(al);
79 v0y = v0 * Math.sin(al);
80 }
81
82 // Отображение
83
84 function draw()
85 {
86 // Расчет параметров графики
87
88 sy = Y_max / (y_max - y_min); // масштаб по оси y
89 Y0 = Y_max + y_min * sy; // положение 0 оси y в экранных координатах
90
91 context = canvas.getContext("2d"); // на context происходит рисование
92 context.clearRect(0, 0, X_max, Y_max); // очистить экран
93
94 // Графики
95
96 // Graph(F0, checkbox_02.checked, 'lightgrey');
97 Graph(F1, checkbox_02.checked, 'grey');
98 Graph(F2, checkbox_01.checked, 'red');
99 Graph(F3, checkbox_03.checked, 'blue');
100 Graph(F4, checkbox_04.checked, 'magenta');
101
102 // Надписи
103 context.fillStyle = 'black';
104 context.font = "italic 20px Times";
105 context.fillText("x", x_max * sx - 15, Y0 - 7);
106 context.fillText("y", 5, 15);
107 context.fillText("0", 10, Y0 - 3);
108 }
109
110 // Построение графика функции
111
112 function Graph(F, flag, color)
113 {
114 if (!flag) return;
115
116 context.strokeStyle = color;
117 context.beginPath();
118 var dt = dx / v0x;
119 var t_max = x_max / v0x;
120 y = 0;
121 for (var t = 0; t < t_max; t += dt)
122 {
123 F(t);
124 var X = x * sx;
125 var Y = Y0 - y * sy;
126 context.lineTo(X, Y);
127 }
128 context.stroke();
129 }
130
131 // Траектории
132
133 // al = 45 * deg;
134 function F0(t)
135 {
136 x = v0x * t;
137 y = x - g / (v0 * v0) * x * x;
138 }
139
140 // Произвольное al
141 function F1(t)
142 {
143 x = v0x * t;
144 y = v0y * t - g * t * t / 2;
145 }
146
147 // Сопротивление, точное решение
148 function F2(t)
149 {
150 if (Math.abs(beta) < 1e-6) { F1(t); return; }
151 var t1 = (1 - Math.exp(-beta * t)) / beta;
152 x = v0x * t1;
153 y = (v0y + g / beta) * t1 - g / beta * t;
154 }
155
156 // Сопротивление, квадратичное приближение
157 function F3(t)
158 {
159 x = v0x * t - beta * v0x * t * t / 2;
160 y = v0y * t - (g + beta * v0y) * t * t / 2;
161 }
162
163 // Сопротивление, кубическое приближение
164 function F4(t)
165 {
166 x = v0x * t - beta * v0x * t * t / 2;
167 y = v0y * t - (g + beta * v0y) * t * t / 2 + beta * g * t * t * t / 6;
168 }
169 }
Файл "mgb.html"
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <meta charset="UTF-8" />
5 <title>mgb</title>
6 <script src="mgb.js"></script>
7 </head>
8 <body>
9 <canvas id="canvasGraph" width="800" height="400" style="border:1px solid #000000;"></canvas>
10
11 <!--Выбор графика (чекбоксы)-->
12 <div>
13 Траектория:
14 <font color="#FF0000" size="5"><B>—</B></font>
15 <input type="checkbox" id="checkbox_01" name="" onchange="app.setCheckbox_01(this.checked);" checked/>с учетом сопротивления,
16 <font color="#AAAAAA" size="5"><B>—</B></font>
17 <input type="checkbox" id="checkbox_02" name="" onchange="app.setCheckbox_02(this.checked);" checked/>без сопротивления
18 </div>
19 <div>
20 Приближение:
21 <font color="#0000FF" size="5"><B>—</B></font>
22 <input type="checkbox" id="checkbox_03" name="" onchange="app.setCheckbox_03(this.checked);" checked/>квадратичное,
23 <font color="#FF00FF" size="5"><B>—</B></font>
24 <input type="checkbox" id="checkbox_04" name="" onchange="app.setCheckbox_04(this.checked);" checked/>кубическое
25 </div>
26
27 <!--Установка параметров взаимодействия (текстовые поля и слайдеры)-->
28 <div>
29 Угол броска:
30 <font face= "Times New Roman">
31 <I>α</I> = <input id="Text_01" style="width: 2.2ex;" required pattern="[-+]?([0-9]*\.[0-9]+|[0-9]+)" oninput="
32 // если введено не число - строка не пройдет валидацию по паттерну выше, и checkValidity() вернет false
33 if (!this.checkValidity()) return;
34 app.set_01(this.value);
35 document.getElementById('Slider_01').value = this.value;
36 ">˚
37 <input type="range" id="Slider_01" style="width: 100px;" oninput="app.set_01(this.value); document.getElementById('Text_01').value = this.value;">
38 </font>,
39 коэффициент сопротивления:
40 <font face= "Times New Roman">
41 <I>β</I> = <input id="Text_02" style="width: 4.4ex;" required pattern="[-+]?([0-9]*\.[0-9]+|[0-9]+)" oninput="
42 // если введено не число - строка не пройдет валидацию по паттерну выше, и checkValidity() вернет false
43 if (!this.checkValidity()) return;
44 app.set_02(this.value);
45 document.getElementById('Slider_02').value = this.value;
46 "><I> g/v</I><SUB>0</SUB>
47 <input type="range" id="Slider_02" style="width: 100px;" oninput="app.set_02(this.value); document.getElementById('Text_02').value = this.value;">
48 </font>
49 </div>
50
51 <script type="text/javascript">var app = new MainMGB(
52 document.getElementById('canvasGraph')
53 );</script>
54
55 </body>
56 </html>
Случай малого сопротивления[править]
Полученное выше решение
дает точную формулу для траектории. Однако не может не вызывать удивление отличие полученной формулы от классической формулы
описывающей движение тела, брошенного под углом к горизонту без учета сопротивления. Чтобы показать связь этих решений, рассмотрим случай малого сопротивления: . Используем разложение
Подстановка данного разложения в формулу точного решения дает
Следовательно, движение при малом сопротивлении близко к движению без сопротивления, но с измененной по величине и направлению силой тяжести, а траектория материальной точки приближенно представляет собой наклоненную параболу.
Данный вывод очень нагляден, однако, строго говоря, он справедлив только для очень малых времен. Соответствующую кривую можно увидеть на интерактивном графике выше, если установить флажок, соответствующий квадратичному приближению. Из графиков видно, что приближенное решение дает оценку для точного решения, однако погрешность относительно высока. Из использованного разложения можно было бы ожидать, что приближенное решение будет асимптотически близко к точному при
. Действительно, для справедливости использованного разложения должно выполняться условие . То есть решение справедливо для не слишком больших времен. В частности, при броске с большой высоты тело может перейти в режим парашютирования, который не описывается данным приближенным решением.Однако, на самом деле, ограничение еще более жесткое. Это можно увидеть, если удержать следующее слагаемое в разложении экспоненты:
что приводит к выражению
Данное выражение отличается наличием последнего слагаемого, которое дает хоть и меньший, но сравнимый вклад. В выражении имеется два слагаемых, линейных по
. Хоть они и имеют разный порядок малости по , однако для времен порядка (такой порядок имеет полное время полета) они, очевидно, дают сравнимый вклад. Соответствующую кривую можно увидеть на интерактивном графике выше, если установить флажок, соответствующий кубическому приближению.Таким образом, квадратичное приближение имеет асимптотическую точность только при малых временах
. Однако, как видно из графиков, оно все же неплохо приближает точное решение, как при малых , так и при больших, для которых форма кривой оказывается даже более адекватной, чем для кубического приближения. Следовательно, наглядная интерпретация в виде наклоненной параболы вполне допустима для качественного описания баллистического движения.