|
|
Строка 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]]
| |