Редактирование: Движение материальной точки в центральном поле

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

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

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 1: Строка 1:
[[en:Dynamics of a particle in a central field]]
 
 
[[Виртуальная лаборатория]] > [[Движение материальной точки в центральном поле]] <HR>
 
[[Виртуальная лаборатория]] > [[Движение материальной точки в центральном поле]] <HR>
Разработчик: [[А.М. Кривцов]]<HR>
 
  
  
Интерактивное приложение, представленное ниже, позволяет изучать траектории материальной точки в центральном степенном поле притяжения. Сила взаимодействия <math>F</math> является степенной функцией расстояния <math>r</math>:
+
Интерактивный график ниже позволяет изучать траектории материальной точки в центральном поле притяжения, для которого сила взаимодействия <math>F</math> является степенной функцией расстояния <math>r</math>:
  
 
:<math>F \sim r^n,</math>
 
:<math>F \sim r^n,</math>
  
где <math>n</math> — некоторый вещественный безразмерный показатель степени. Притягивающий центр находится в точке <math>0</math>.  
+
где <math>n</math> — некоторый вещественный безразмерный показатель степени. Притягивающий центр находиться в точке <math>0</math>.
  
 +
<addscript src=FC/>
 +
<htmlet nocache="yes">FC_TM</htmlet>
  
<htmlet nocache="yes">Krivtsov/FC_TM</htmlet>
+
Текст программы построения графиков на языке JavaScript: <toggledisplay status=hide showtext="Показать↓" hidetext="Скрыть↑" linkstyle="font-size:default">  
 
 
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 
'''Текст приложения на языке JavaScript:''' <div class="mw-collapsible-content">  
 
 
Файл '''"FC.js"'''
 
Файл '''"FC.js"'''
<syntaxhighlight lang="javascript" line start="1" enclose="div">
+
<source lang="javascript" first-line="1">
 
// Движение материальной точки в центральном поле
 
// Движение материальной точки в центральном поле
 
// Разработчик А.М. Кривцов  
 
// Разработчик А.М. Кривцов  
// 18-21.05.2014  
+
// 18.05.2014  
 
// Интернет: tm.spbstu.ru/FC
 
// Интернет: tm.spbstu.ru/FC
  
 
function MainFC(canvas) {
 
function MainFC(canvas) {
  
     // Основные размерные параметры
+
     // Предварительные установки
 +
 
 +
const X_max = canvas.width;
 +
const Y_max = canvas.height;
 +
 +
    // Размерные параметры
 
      
 
      
 
     const m = 1.;  // масса частицы
 
     const m = 1.;  // масса частицы
Строка 30: Строка 32:
 
     const P = 1.; // сила притяжения на круговой орбите
 
     const P = 1.; // сила притяжения на круговой орбите
  
     // Производные размерные параметры 
+
     // Расчет констант взаимодействия
  
 
const T = 2 * Math.PI * Math.sqrt(m * a / P); // период движения по круговой орбите
 
const T = 2 * Math.PI * Math.sqrt(m * a / P); // период движения по круговой орбите
 
const v1 = Math.sqrt(P * a / m); // скорость движения по круговой орбите (1-ая космическая)
 
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 n, v0, zoom, t_max, dt;
+
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 = 22; Slider_01.step = 0.1; // v0 / v1 - начальная скорость
+
    // настройка слайдеров и текстовых полей
Slider_02.max = 6; Slider_02.min = -Slider_02.max; Slider_02.step = 0.01; // n - показатель степени
+
   
Slider_03.min = 0;      Slider_03.max = 6; Slider_03.step = 0.01; // zoom - увеличение
+
Slider_01.min = 1;
Slider_04.min = 0;      Slider_04.max = 100; Slider_04.step = 0.1; // t_max/T - время расчета
+
    Slider_01.max = 2;
Slider_05.min = 1;      Slider_05.max = set_exp(0); Slider_05.step = 1; // N_exp - номер эксперимента
+
    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_05.focus();
+
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;
 
 
dt = T / 200;      // шаг интегрирования
+
Slider_04.min = 0;       
set_exp(6); // переменные заданы для эксперимента 6
+
    Slider_04.max = 100;
 
+
    Slider_04.step = 0.1;
// Отображение
+
Slider_04.value = t_max / T;       
 +
    Text_04.value = Slider_04.value;
 
 
 
draw();
 
draw();
  
     // функции, запускающиеся при изменении значений слайдеров и текстовых полей
+
     // функции, запускающиеся при перемещении слайдера
  
     this.set_01 = function(input) { v0 = Number(input) * v1; draw(); }   
+
     this.set_01 = function(input) { v0 = Number(input) * v1; draw(); }   
     this.set_02 = function(input) { n = Number(input); draw(); }   
+
     this.set_02 = function(input) { set_n(input); draw(); }   
     this.set_03 = function(input) { zoom = Number(input); draw(); }  
+
     this.set_03 = function(input) { set_zoom(input); draw(); }  
     this.set_04 = function(input) { t_max = Number(input) * T; draw(); }
+
     this.set_04 = function(input) { t_max = Number(input) * T; draw(); }
    this.set_05 = function(input) { set_exp(input); 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()  
 
function draw()  
 
{  
 
{  
// Оптимизация
+
  // Расчет параметров графики
 
var n1 = (1 - n) / 2;
 
var dt1 = -P / m * Math.pow(a, -n) * dt;
 
 
// Область построения графика
 
 
const X_max = canvas.width, Y_max = canvas.height;
 
var x_max, y_max, sx, sy, X0, Y0;
 
 
x_max = y_max = Math.pow(2, zoom) * a; // размер области отображения
 
x_min = y_min = -x_max; 
 
 
 
sx = sy = Y_max / (y_max - y_min); // масштаб по оси y
 
X0 = Y0 = Y_max + y_min * sy;  // положение 0 оси y в экранных координатах
 
 
 
  // Инициализация графики
 
 
 
var context = canvas.getContext("2d");  // на context происходит рисование
+
context = canvas.getContext("2d");  // на context происходит рисование
 
context.clearRect(0, 0, X_max, Y_max); // очистить экран
 
context.clearRect(0, 0, X_max, Y_max); // очистить экран
 
          
 
          
Строка 104: Строка 137:
 
         context.fillText("0", X0 - 15, Y0 - 7);
 
         context.fillText("0", X0 - 15, Y0 - 7);
 
 
// График
 
 
context.strokeStyle = 'black';
 
context.strokeStyle = 'black';
 
context.beginPath();
 
context.beginPath();
var vx = v0, vy = 0;
+
var vx = v0;
var x = 0, y = a;
+
var vy = 0;
 +
var x = 0;
 +
var y = a;
 
context.moveTo(X0, Y0 - a * sy);
 
context.moveTo(X0, Y0 - a * sy);
 
for (var t = 0; t < t_max; t += dt)
 
for (var t = 0; t < t_max; t += dt)
 
{
 
{
 
var r2 = x * x + y * y;
 
var r2 = x * x + y * y;
 +
// var r = Math.sqrt(r2); var rn = Math.pow(r, 1 - n);
 
var rn = Math.pow(r2, n1);
 
var rn = Math.pow(r2, n1);
 
vx += x / rn * dt1;
 
vx += x / rn * dt1;
Строка 123: Строка 158:
 
}
 
}
 
context.stroke();
 
context.stroke();
}
 
 
// Выбор эксперимента
 
 
function set_exp(N_exp)
 
{
 
var k = Number(N_exp);
 
 
// показатель степени начальная скорость увеличение максимальное число шагов
 
 
if (!--k) { n = -3; v0 = 1.004 * v1; zoom = 2.98; t_max = 17.4 * T; }  // спираль
 
if (!--k) { n = -2.9; v0 = 1.023 * v1; zoom = 2.98; t_max = 67.6 * T; } 
 
if (!--k) { n = -2.87; v0 = 1.029 * v1; zoom = 2.57; t_max = 21.6 * T; } 
 
if (!--k) { n = -2.87; v0 = 1.03 * v1; zoom = 2.96; t_max = 94.4 * T; } 
 
if (!--k) { n = -2.5; v0 = 1.135 * v1; zoom = 2.98; t_max = 31.1 * T; }  // 2
 
 
if (!--k) { n = -2; v0 = 1.25 * v1; zoom = 2; t_max = 20 * T; }  // эллипс
 
 
if (!--k) { n = -1; v0 = 1.25 * v1; zoom = 1; t_max = 26 * T; }
 
if (!--k) { n = -1; v0 = 1.36 * v1; zoom = 1.18; t_max = 10.8 * T; } // 10
 
if (!--k) { n = -1; v0 = 1.63 * v1; zoom = 1.87; t_max = 25.3 * T; }
 
if (!--k) { n = -1; v0 = 1.93 * v1; zoom = 2.8; t_max = 8 * T; } //  3 !
 
if (!--k) { n = -1; v0 = 2.31 * v1; zoom = 3.92; t_max = 64.1 * T; } // 11
 
if (!--k) { n = -1; v0 = 2.43 * v1; zoom = 4.29; t_max = 61.8 * T; } //  8
 
if (!--k) { n = -1; v0 = 2.74 * v1; zoom = 5.5; t_max = 85.5 * T; } //  5
 
 
if (!--k) { n = -0.74; v0 = 2.665 * v1; zoom = 3.81; t_max = 18.8 * T; } //  5
 
 
if (!--k) { n = 0; v0 = 1.66 * v1; zoom = 1.39; t_max = 5.1 * T; } //  7
 
if (!--k) { n = 0; v0 = 2.7  * v1; zoom = 2.34; t_max = 8.9 * T; } //  9
 
if (!--k) { n = 0; v0 = 3.46 * v1; zoom = 3.03; t_max = 13.3 * T; } // 11
 
 
if (!--k) { n = 1; v0 = 2 * v1; zoom = 1.3; t_max = 1 * T; } // 11
 
 
if (!--k) { n = 2; v0 = 2.39 * v1; zoom = 1.18; t_max = 4.0 * T; } // 11
 
 
if (!--k) { n = 3; v0 = 3.58 * v1; zoom = 1.28; t_max = 1.8 * T; } //  7
 
if (!--k) { n = 3; v0 = 6.97 * v1; zoom = 1.87; t_max = 1.7 * T; } //  9
 
if (!--k) { n = 3; v0 = 11.28 * v1; zoom = 2.13; t_max = 1.6 * T; } // 11
 
if (!--k) { n = 3; v0 = 16.13 * v1; zoom = 2.50; t_max = 1.6 * T; } // 13
 
 
if (!--k) { n = 3.29; v0 = 1.3 * v1; zoom = 0.48; t_max = 1.8 * T; } // 13
 
 
if (!--k) { n = 4; v0 = 3.36 * v1; zoom = 1.12; t_max = 1.1 * T; } //  5 !
 
if (!--k) { n = 4; v0 = 6.08 * v1; zoom = 1.44; t_max = 1.9 * T; } // 12
 
if (!--k) { n = 4; v0 = 9.52 * v1; zoom = 1.66; t_max = 0.9 * T; } //  7 !
 
if (!--k) { n = 4; v0 = 18.45 * v1; zoom = 2.18; t_max = 0.728 * T; } //  9
 
 
if (!--k) { n = 5; v0 = 7.15 * v1; zoom = 1.55; t_max = 0.6 * T; } //  5 !
 
 
if (!--k) { n = 4; v0 = 3.304 * v1; zoom = 1.12; t_max = 36.4 * T; } //  5 ~~~
 
if (!--k) { n = 4; v0 = 9.394 * v1; zoom = 1.66; t_max = 19.6 * T; } //  7 ~~~
 
 
if (N_exp)
 
{
 
Text_01.value = v0 / v1; Slider_01.value = Text_01.value; // начальная скорость    
 
Text_02.value = n;    Slider_02.value = Text_02.value;        // показатель степени
 
Text_03.value = zoom;    Slider_03.value = Text_03.value;     // увеличение
 
Text_04.value = t_max / T;    Slider_04.value = Text_04.value; // время расчета  
 
Text_05.value = N_exp;          Slider_05.value = Text_05.value;        // номер эксперимента
 
}
 
 
return -k; // Если N_exp = 0 возвращает общее количество экспериментов, в остальных случаях возвращает 0
 
 
}
 
}
 
}
 
}
</syntaxhighlight>
+
</source>
 
Файл '''"FC.html"'''
 
Файл '''"FC.html"'''
<syntaxhighlight lang="html5" line start="1" enclose="div">
+
<source lang="html" first-line="1">
 +
<!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>
 
     <canvas id="canvasGraph" width="600" height="600" style="border:1px solid #000000;"></canvas>
  
Строка 228: Строка 208:
 
</font>
 
</font>
 
</div>
 
</div>
    <div>
+
   
        <font face= "Times New Roman">
 
        Номер эксперимента <input id="Text_05" style="width: 4.2ex;" required pattern="[-+]?([0-9]*\.[0-9]+|[0-9]+)" oninput="
 
            // если введено не число - строка не пройдет валидацию по паттерну выше, и checkValidity() вернет false
 
            if (!this.checkValidity()) return;
 
            app.set_05(this.value);
 
            document.getElementById('Slider_05').value = this.value;
 
        ">
 
<input type="range" id="Slider_05" style="width: 100px;" oninput="app.set_05(this.value); document.getElementById('Text_05').value = this.value;">
 
</div>
 
 
 
<script type="text/javascript">var app = new MainFC (
 
<script type="text/javascript">var app = new MainFC (
 
document.getElementById('canvasGraph')
 
document.getElementById('canvasGraph')
 
);</script>
 
);</script>
</syntaxhighlight>
+
 
</div>
+
</body>
</div>
+
</html>  
 +
</source>
 +
</toggledisplay>
  
 
Приложение позволяет интерактивно задавать следующие параметры:
 
Приложение позволяет интерактивно задавать следующие параметры:
 
* <math>v_0</math> — начальная скорость точки. Начальная скорость направлена тангенциально (перпендикулярно радиальному направлению). Скорость измеряется по отношению к <math>v_1</math> — скорости кругового движения на начальном удалении от центра (1-ая космическая скорость).   
 
* <math>v_0</math> — начальная скорость точки. Начальная скорость направлена тангенциально (перпендикулярно радиальному направлению). Скорость измеряется по отношению к <math>v_1</math> — скорости кругового движения на начальном удалении от центра (1-ая космическая скорость).   
* <math>n</math> — показатель степени в законе взаимодействия (<math>n=-2</math> соответствует гравитационному взаимодействию, <math>n=1</math> — линейно-упругому).
+
* <math>n</math> — показатель степени в законе взаимодействия (<math>n=-2</math> соответствует гравитационному взаимодействию, <math>n=1</math> — линейной пружине).
 
* zoom — логарифмический масштаб отображения графика (используется логарифм по основанию 2).
 
* zoom — логарифмический масштаб отображения графика (используется логарифм по основанию 2).
 
* <math>t_{\rm max}</math> — время интегрирования, выраженное в периодах кругового движения <math>T</math> на начальном удалении от центра.
 
* <math>t_{\rm max}</math> — время интегрирования, выраженное в периодах кругового движения <math>T</math> на начальном удалении от центра.
 
Кроме того, возможно задать "номер эксперимента". На каждый номер приходится отдельный набор из перечисленных выше четырех параметров, для которого реализуется некоторый характерный вид движения. Эксперименты упорядочены по <math>n</math> (в первую очередь), затем по <math>v_0</math>.
 
 
== Предлагаемые направления исследований ==
 
 
* Определить возможные варианты движения.
 
* Определить зависимость расстояния до апоцентра (наиболее удаленной точки) орбиты от <math>n</math> и <math>u=v_0/v_1</math>.
 
* Найти замкнутые траектории различной топологии (например, 5-и, 7-и конечные звезды и др.) и определить их положение на плоскости параметров <math>n</math>, <math>u</math>.
 
* Найти метод интегрирования уравнений движения с переменным шагом, позволяющий эффективно моделировать движение точки при больших <math>|n|</math>.
 
* Подобрать значения параметров (и разработать метод такого подбора), позволяющий получать "красивые" графики, которые могут рассматриваться как объекты Science Art (см. в частности, последние номера экспериментов).
 
 
[[Category: Виртуальная лаборатория]]
 
[[Category: Программирование]]
 
[[Category: JavaScript]]
 
Вам запрещено изменять защиту статьи. 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:

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