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

Материал из Department of Theoretical and Applied Mechanics
Перейти к: навигация, поиск
Виртуальная лаборатория > Движение материальной точки в центральном поле
Разработчик: А.М. Кривцов


Интерактивное приложение, представленное ниже, позволяет изучать траектории материальной точки в центральном степенном поле притяжения. Сила взаимодействия [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 (см. в частности, последние номера экспериментов).