Dynamics of a particle in a central field — различия между версиями

Материал из Department of Theoretical and Applied Mechanics
Перейти к: навигация, поиск
(Новая страница: «Virtual laboratory > Dynamics of a particle in a central field <HR> Developer: А.М. Кривцов<HR> Interactive application, shown below, allow…»)
 
(Полностью удалено содержимое страницы)
 
Строка 1: Строка 1:
[[Virtual laboratory]] > [[Dynamics of a particle in a central field]] <HR>
 
Developer:  [[А.М. Кривцов]]<HR>
 
  
Interactive application, shown below, allows us to study the trajectories of a particle in the central power-law potential field. The interaction force <math>F</math> is a degree function of distance <math>r</math>:
 
 
:<math>F \sim r^n,</math>
 
 
where <math>n</math> is some real dimensionless degree exponent. The attraction center is at the <math>0</math> point.
 
 
<htmlet nocache="yes">Krivtsov/FC_TM</htmlet>
 
 
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 
'''The text of the program is written in JavaScript:''' <div class="mw-collapsible-content">
 
Файл '''"FC.js"'''
 
<syntaxhighlight lang="javascript" line start="1" enclose="div">
 
// Движение материальной точки в центральном поле
 
// Разработчик А.М. Кривцов
 
// 18-21.05.2014
 
// Интернет: tm.spbstu.ru/FC
 
 
function MainFC(canvas) {
 
 
    // Основные размерные параметры
 
   
 
    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, v0, zoom, t_max, dt;
 
 
// настройка слайдеров
 
 
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();
 
 
// Задание значений переменных
 
 
dt = T / 200;      // шаг интегрирования
 
set_exp(6); // переменные заданы для эксперимента 6
 
 
// Отображение
 
 
draw();
 
 
    // функции, запускающиеся при изменении значений слайдеров и текстовых полей
 
 
    this.set_01 = function(input) { v0 = Number(input) * v1; draw(); } 
 
    this.set_02 = function(input) { n = Number(input); draw(); } 
 
    this.set_03 = function(input) { zoom = Number(input); draw(); }
 
    this.set_04 = function(input) { t_max = Number(input) * T; draw(); }
 
    this.set_05 = function(input) { set_exp(input); 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.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, vy = 0;
 
var x = 0, y = a;
 
context.moveTo(X0, Y0 - a * sy);
 
for (var t = 0; t < t_max; t += dt)
 
{
 
var r2 = x * x + y * y;
 
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();
 
}
 
 
// Выбор эксперимента
 
 
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>
 
Файл '''"FC.html"'''
 
<syntaxhighlight lang="html5" line start="1" enclose="div">
 
    <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>
 
    <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 (
 
document.getElementById('canvasGraph')
 
);</script>
 
</syntaxhighlight>
 
</div>
 
</div>
 
 
The application allows to set the following parameters interactively:
 
* <math>v_0</math> — initial velocity of the point. The initial velocity is directed tangentially (perpendicular to the radial direction).Velocity is measured in relation to the <math>v_1</math> - speed circular motion on the initial distance from the center (the first cosmic speed). 
 
* <math>n</math> — is an index in the law of interaction(<math>n=-2</math> corresponds to the gravitational interaction, <math>n=1</math> - the linear-elastic). 
 
* zoom is the logarithmic scale of display of the schedule (the logarithm on the basis 2 is used).
 
* <math>t_{\rm max}</math> — integration time expressed in <math>T</math> periods of circular motion at the initial distance from the center.
 
 
Besides, it is possible to set "number of the experiment". Every number has a separate set of four parameters named above and characterized by some specific kind of movement. Experiments are ordered by <math>n</math>(first), then by <math>v_0</math>.
 
 
== The proposed research areas ==
 
 
* To define possible variants of motion
 
* To define the dependence of the distance to the epicenter (the most distant point) of the orbit from <math>n</math> and <math>u=v_0/v_1</math>.
 
* To find closed trajectories of different topologies (for example, 5th, the 7th terminating stars, etc.) and to determine their position on the plane of the parameters <math>n</math>, <math>u</math>.
 
* To find a method for integrating of the equations of motion with a variable step allowing to model the movement of a point at large <math>|n|</math> effectively.
 
* • To pick up values of parameters (and to develop a method of such selection), allowing to receive "beautiful" schedules which can be considered as objects of Science Art (see in particular, last numbers of experiments).
 
 
[[Category: Virtual laboratory]]
 
[[Category: Programming]]
 
[[Category: JavaScript]]
 

Текущая версия на 19:15, 30 мая 2016