Движение материальной точки в центральном поле — различия между версиями

Материал из Department of Theoretical and Applied Mechanics
Перейти к: навигация, поиск
 
(не показано 17 промежуточных версий 3 участников)
Строка 1: Строка 1:
 +
[[en:Dynamics of a particle in a central field]]
 
[[Виртуальная лаборатория]] > [[Движение материальной точки в центральном поле]] <HR>
 
[[Виртуальная лаборатория]] > [[Движение материальной точки в центральном поле]] <HR>
 +
Разработчик: [[А.М. Кривцов]]<HR>
  
  
Строка 6: Строка 8:
 
:<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>
 
  
Текст приложения на языке JavaScript: <toggledisplay status=hide showtext="Показать↓" hidetext="Скрыть↑" linkstyle="font-size:default">  
+
<htmlet nocache="yes">Krivtsov/FC_TM</htmlet>
 +
 
 +
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 +
'''Текст приложения на языке JavaScript:''' <div class="mw-collapsible-content">  
 
Файл '''"FC.js"'''
 
Файл '''"FC.js"'''
<source lang="javascript" first-line="1">
+
<syntaxhighlight lang="javascript" line start="1" enclose="div">
 
// Движение материальной точки в центральном поле
 
// Движение материальной точки в центральном поле
 
// Разработчик А.М. Кривцов  
 
// Разработчик А.М. Кривцов  
// 18.05.2014  
+
// 18-21.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.;  // масса частицы
Строка 32: Строка 30:
 
     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 n, v0, zoom, t_max, dt;
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 = 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_04.min = 0;      Slider_04.max = 100; Slider_04.step = 0.1; // t_max/T - время расчета
 +
Slider_05.min = 1;      Slider_05.max = set_exp(0); Slider_05.step = 1; // N_exp - номер эксперимента
 
 
    // настройка слайдеров и текстовых полей
+
Slider_05.focus();
   
+
 
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;       
+
dt = T / 200;      // шаг интегрирования
    Slider_03.max = 6;
+
set_exp(6); // переменные заданы для эксперимента 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();
 
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) { set_n(input); draw(); }   
+
     this.set_02 = function(input) { n = Number(input); draw(); }   
     this.set_03 = function(input) { set_zoom(input); draw(); }  
+
     this.set_03 = function(input) { zoom = Number(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 в экранных координатах
 +
 
 +
  // Инициализация графики
 
 
context = canvas.getContext("2d");  // на context происходит рисование
+
var context = canvas.getContext("2d");  // на context происходит рисование
 
context.clearRect(0, 0, X_max, Y_max); // очистить экран
 
context.clearRect(0, 0, X_max, Y_max); // очистить экран
 
          
 
          
Строка 137: Строка 104:
 
         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;
+
var vx = v0, vy = 0;
var vy = 0;
+
var x = 0, y = a;
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;
Строка 158: Строка 123:
 
}
 
}
 
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
 
}
 
}
 
}
 
}
</source>
+
</syntaxhighlight>
 
Файл '''"FC.html"'''
 
Файл '''"FC.html"'''
<source lang="html" first-line="1">
+
<syntaxhighlight lang="html5" line start="1" enclose="div">
<!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>
  
Строка 208: Строка 228:
 
</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>
</body>
+
</div>
</html>  
+
</div>
</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]]

Текущая версия на 18:40, 18 января 2017

Виртуальная лаборатория > Движение материальной точки в центральном поле
Разработчик: А.М. Кривцов


Интерактивное приложение, представленное ниже, позволяет изучать траектории материальной точки в центральном степенном поле притяжения. Сила взаимодействия [math]F[/math] является степенной функцией расстояния [math]r[/math]:

[math]F \sim r^n,[/math]

где [math]n[/math] — некоторый вещественный безразмерный показатель степени. Притягивающий центр находится в точке [math]0[/math].


v0 = v1 n =
zoom = tmax = T
Номер эксперимента

Текст приложения на языке JavaScript:

Файл "FC.js"

  1 // Движение материальной точки в центральном поле
  2 // Разработчик А.М. Кривцов 
  3 // 18-21.05.2014 
  4 // Интернет: tm.spbstu.ru/FC
  5 
  6 function MainFC(canvas) {
  7 
  8     // Основные размерные параметры
  9     
 10     const m = 1.;   // масса частицы
 11     const a = 1.;   // радиус круговой орбиты
 12     const P = 1.; 	// сила притяжения на круговой орбите
 13 
 14     // Производные размерные параметры  
 15 
 16 	const T = 2 * Math.PI * Math.sqrt(m * a / P);	// период движения по круговой орбите
 17 	const v1 = Math.sqrt(P * a / m);				// скорость движения по круговой орбите (1-ая космическая)
 18 	
 19 	// Переменные
 20 	
 21 	var n, v0, zoom, t_max, dt;
 22 	
 23 	// настройка слайдеров 
 24 	
 25 	Slider_01.min = 1;			Slider_01.max = 22;					Slider_01.step = 0.1;		// v0 / v1	- начальная скорость
 26 	Slider_02.max = 6;			Slider_02.min = -Slider_02.max; 	Slider_02.step = 0.01;		// n		- показатель степени	
 27 	Slider_03.min = 0;       	Slider_03.max = 6;					Slider_03.step = 0.01;		// zoom		- увеличение
 28 	Slider_04.min = 0;       	Slider_04.max = 100;				Slider_04.step = 0.1;		// t_max/T	- время расчета	
 29 	Slider_05.min = 1;       	Slider_05.max = set_exp(0);			Slider_05.step = 1;			// N_exp	- номер эксперимента
 30 	
 31 	Slider_05.focus();
 32 
 33 	// Задание значений переменных
 34 	
 35 	dt = T / 200;       // шаг интегрирования
 36 	set_exp(6);			// переменные заданы для эксперимента 6
 37 
 38 	// Отображение
 39 	
 40 	draw();
 41 
 42     // функции, запускающиеся при изменении значений слайдеров и текстовых полей
 43 
 44     this.set_01 = function(input) { v0 		= Number(input) * v1; 	draw(); }  
 45     this.set_02 = function(input) { n 		= Number(input); 		draw(); }  
 46     this.set_03 = function(input) { zoom 	= Number(input); 		draw(); } 
 47     this.set_04 = function(input) { t_max 	= Number(input) * T; 	draw(); } 	
 48     this.set_05 = function(input) { set_exp(input);					draw(); } 	
 49 	
 50 	// Отображение
 51 	
 52 	function draw() 
 53 	{ 
 54 		// Оптимизация
 55 		
 56 		var n1 = (1 - n) / 2;
 57 		var dt1 = -P / m * Math.pow(a, -n) * dt;
 58 		
 59 		// Область построения графика
 60 		
 61 		const X_max = canvas.width, Y_max = canvas.height;
 62 		var x_max, y_max, sx, sy, X0, Y0;
 63 	
 64 		x_max = y_max = Math.pow(2, zoom) * a;		// размер области отображения
 65 		x_min = y_min = -x_max;  
 66 
 67 		sx = sy = Y_max / (y_max - y_min); 			// масштаб по оси y
 68 		X0 = Y0 = Y_max + y_min * sy;  				// положение 0 оси y в экранных координатах
 69 	   
 70 	   // Инициализация графики
 71 		
 72 		var context = canvas.getContext("2d");  	// на context происходит рисование
 73 		context.clearRect(0, 0, X_max, Y_max); 	// очистить экран
 74         
 75         // Горизонтальная ось
 76         context.strokeStyle = 'lightgrey';
 77         context.beginPath();
 78         context.moveTo(0, Y0);	context.lineTo(X_max, Y0);
 79         context.moveTo(X0, 0);	context.lineTo(X0, Y_max);
 80         context.moveTo(X0 +  a * sx, Y0);	context.arc(X0, Y0, a * sx, 0, 2 * Math.PI);
 81         context.stroke();
 82 
 83         // Надписи
 84         context.fillStyle = 'black';
 85         context.font = "italic 20px Times";
 86         context.fillText("0", X0 - 15, Y0 - 7);
 87 		
 88 		// График 
 89 		context.strokeStyle = 'black';
 90 		context.beginPath();
 91 		var vx = v0, vy = 0;
 92 		var x = 0, y = a;
 93 		context.moveTo(X0, Y0 - a * sy);
 94 		for (var t = 0; t < t_max; t += dt)
 95 		{
 96 			var r2 = x * x + y * y;
 97 			var rn = Math.pow(r2, n1);
 98 			vx += x / rn * dt1;
 99 			vy += y / rn * dt1;
100 			x += vx * dt;			
101 			y += vy * dt; 
102 			var X = X0 + x * sx; 
103 			var Y = Y0 - y * sy; 
104 			context.lineTo(X, Y);
105 		}
106 		context.stroke();			
107 	}
108 	
109 	// Выбор эксперимента
110 	
111 	function set_exp(N_exp)
112 	{	
113 		var k = Number(N_exp);
114 		
115 //			показатель степени	начальная скорость	 увеличение		максимальное число шагов
116 	
117 		if (!--k) { n = -3;		v0 = 1.004 * v1; 	zoom = 2.98;	t_max = 17.4 * T; }  	// спираль			
118 		if (!--k) { n = -2.9;	v0 = 1.023 * v1; 	zoom = 2.98;	t_max = 67.6 * T; }  	 		
119 		if (!--k) { n = -2.87;	v0 = 1.029 * v1; 	zoom = 2.57;	t_max = 21.6 * T; }  	 		
120 		if (!--k) { n = -2.87;	v0 = 1.03 * v1; 	zoom = 2.96;	t_max = 94.4 * T; }  	 		
121 		if (!--k) { n = -2.5;	v0 = 1.135 * v1; 	zoom = 2.98;	t_max = 31.1 * T; }  	// 2
122 
123 		if (!--k) { n = -2;		v0 = 1.25 * v1; 	zoom = 2;	t_max = 20 * T; }  			// эллипс
124 
125 		if (!--k) { n = -1;		v0 = 1.25 * v1; 	zoom = 1;		t_max = 26 * T; }
126 		if (!--k) { n = -1;		v0 = 1.36 * v1; 	zoom = 1.18;	t_max = 10.8 * T; }		// 10
127 		if (!--k) { n = -1;		v0 = 1.63 * v1; 	zoom = 1.87;	t_max = 25.3 * T; }
128 		if (!--k) { n = -1;		v0 = 1.93 * v1; 	zoom = 2.8;		t_max = 8 * T; }		//  3 !
129 		if (!--k) { n = -1;		v0 = 2.31 * v1; 	zoom = 3.92;	t_max = 64.1 * T; }		// 11
130 		if (!--k) { n = -1;		v0 = 2.43 * v1; 	zoom = 4.29;	t_max = 61.8 * T; }		//  8
131 		if (!--k) { n = -1;		v0 = 2.74 * v1; 	zoom = 5.5;		t_max = 85.5 * T; }		//  5
132 
133 		if (!--k) { n = -0.74;	v0 = 2.665 * v1; 	zoom = 3.81;	t_max = 18.8 * T; }		//  5 
134 		
135 		if (!--k) { n = 0;		v0 = 1.66 * v1; 	zoom = 1.39;	t_max = 5.1 * T; }		//  7 
136 		if (!--k) { n = 0;		v0 = 2.7  * v1; 	zoom = 2.34;	t_max = 8.9 * T; }		//  9 
137 		if (!--k) { n = 0;		v0 = 3.46 * v1; 	zoom = 3.03;	t_max = 13.3 * T; }		// 11 
138 	
139 		if (!--k) { n = 1;		v0 = 2 * v1; 		zoom = 1.3;		t_max = 1 * T; }		// 11 	
140 
141 		if (!--k) { n = 2;		v0 = 2.39 * v1; 	zoom = 1.18;	t_max = 4.0 * T; }		// 11 	
142 	
143 		if (!--k) { n = 3;		v0 = 3.58 * v1; 	zoom = 1.28;	t_max = 1.8 * T; }		//  7 
144 		if (!--k) { n = 3;		v0 = 6.97 * v1; 	zoom = 1.87;	t_max = 1.7 * T; }		//  9
145 		if (!--k) { n = 3;		v0 = 11.28 * v1; 	zoom = 2.13;	t_max = 1.6 * T; }		// 11 	
146 		if (!--k) { n = 3;		v0 = 16.13 * v1; 	zoom = 2.50;	t_max = 1.6 * T; }		// 13 	
147 
148 		if (!--k) { n = 3.29;	v0 = 1.3 * v1; 		zoom = 0.48;	t_max = 1.8 * T; }		// 13 	
149 		
150 		if (!--k) { n = 4;		v0 = 3.36 * v1; 	zoom = 1.12;	t_max = 1.1 * T; }		//  5 !	
151 		if (!--k) { n = 4;		v0 = 6.08 * v1; 	zoom = 1.44;	t_max = 1.9 * T; }		// 12 	
152 		if (!--k) { n = 4;		v0 = 9.52 * v1; 	zoom = 1.66;	t_max = 0.9 * T; }		//  7 !	
153 		if (!--k) { n = 4;		v0 = 18.45 * v1; 	zoom = 2.18;	t_max = 0.728 * T; }	//  9	
154 
155 		if (!--k) { n = 5;		v0 = 7.15 * v1; 	zoom = 1.55;	t_max = 0.6 * T; }		//  5 !	
156 
157 		if (!--k) { n = 4;		v0 = 3.304 * v1; 	zoom = 1.12;	t_max = 36.4 * T; }		//  5 ~~~
158 		if (!--k) { n = 4;		v0 = 9.394 * v1; 	zoom = 1.66;	t_max = 19.6 * T; }		//  7 ~~~	
159 
160 		if (N_exp)
161 		{
162 			Text_01.value = v0 / v1; 		Slider_01.value = Text_01.value;		// начальная скорость	    			
163 			Text_02.value = n;     			Slider_02.value = Text_02.value;        // показатель степени
164 			Text_03.value = zoom;     		Slider_03.value = Text_03.value;	    // увеличение
165 			Text_04.value = t_max / T;     	Slider_04.value = Text_04.value;		// время расчета	  			
166 			Text_05.value = N_exp;          Slider_05.value = Text_05.value;        // номер эксперимента
167 		}
168 		
169 		return -k;	// Если N_exp = 0 возвращает общее количество экспериментов, в остальных случаях возвращает 0 
170 	}
171 }

Файл "FC.html"

 1     <canvas id="canvasGraph" width="600" height="600" style="border:1px solid #000000;"></canvas>
 2 
 3     <!--Установка параметров взаимодействия (текстовые поля и слайдеры)-->
 4     <div>
 5         <font face= "Times New Roman"><I>
 6         v</I><SUB>0</SUB> = <input id="Text_01" style="width: 4.2ex;" required pattern="[-+]?([0-9]*\.[0-9]+|[0-9]+)" oninput="
 7             // если введено не число - строка не пройдет валидацию по паттерну выше, и checkValidity() вернет false
 8             if (!this.checkValidity()) return;
 9             app.set_01(this.value);
10             document.getElementById('Slider_01').value = this.value;
11         "><I> v</I><SUB>1</SUB> 
12 		<input type="range" id="Slider_01" style="width: 100px;" oninput="app.set_01(this.value); document.getElementById('Text_01').value = this.value;">
13 		n = <input id="Text_02" style="width: 4.2ex;" required pattern="[-+]?([0-9]*\.[0-9]+|[0-9]+)" oninput="
14             if (!this.checkValidity()) return;
15             app.set_02(this.value);
16             document.getElementById('Slider_02').value = this.value;
17         ">
18 		<input type="range" id="Slider_02" style="width: 100px;" oninput="app.set_02(this.value); document.getElementById('Text_02').value = this.value;">
19 		</font>
20 	</div>
21     <div>
22         <font face= "Times New Roman">
23         zoom = <input id="Text_03" style="width: 4.2ex;" required pattern="[-+]?([0-9]*\.[0-9]+|[0-9]+)" oninput="
24             // если введено не число - строка не пройдет валидацию по паттерну выше, и checkValidity() вернет false
25             if (!this.checkValidity()) return;
26             app.set_03(this.value);
27             document.getElementById('Slider_03').value = this.value;
28         "> 
29 		<input type="range" id="Slider_03" style="width: 100px;" oninput="app.set_03(this.value); document.getElementById('Text_03').value = this.value;">
30 		<I>t</I><SUB>max</SUB> = <input id="Text_04" style="width: 4.2ex;" required pattern="[-+]?([0-9]*\.[0-9]+|[0-9]+)" oninput="
31             if (!this.checkValidity()) return;
32             app.set_04(this.value);
33             document.getElementById('Slider_04').value = this.value;
34         "><I> T</I>
35 		<input type="range" id="Slider_04" style="width: 100px;" oninput="app.set_04(this.value); document.getElementById('Text_04').value = this.value;">
36 		</font>
37 	</div>
38      <div>
39         <font face= "Times New Roman">
40         Номер эксперимента <input id="Text_05" style="width: 4.2ex;" required pattern="[-+]?([0-9]*\.[0-9]+|[0-9]+)" oninput="
41             // если введено не число - строка не пройдет валидацию по паттерну выше, и checkValidity() вернет false
42             if (!this.checkValidity()) return;
43             app.set_05(this.value);
44             document.getElementById('Slider_05').value = this.value;
45         "> 
46 		<input type="range" id="Slider_05" style="width: 100px;" oninput="app.set_05(this.value); document.getElementById('Text_05').value = this.value;">
47 	</div>
48 	
49 	<script type="text/javascript">var app = new MainFC	(
50 		document.getElementById('canvasGraph')
51 	);</script>

Приложение позволяет интерактивно задавать следующие параметры:

  • [math]v_0[/math] — начальная скорость точки. Начальная скорость направлена тангенциально (перпендикулярно радиальному направлению). Скорость измеряется по отношению к [math]v_1[/math] — скорости кругового движения на начальном удалении от центра (1-ая космическая скорость).
  • [math]n[/math] — показатель степени в законе взаимодействия ([math]n=-2[/math] соответствует гравитационному взаимодействию, [math]n=1[/math] — линейно-упругому).
  • zoom — логарифмический масштаб отображения графика (используется логарифм по основанию 2).
  • [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 (см. в частности, последние номера экспериментов).