Dynamics of a particle in a central field

From Department of Theoretical and Applied Mechanics
Jump to: navigation, search
Virtual laboratory > Dynamics of a particle in a central field
Developer: A.M. Krivtsov

Interactive application, shown below, allows us to study trajectories of a particle in the central power-law potential field. Interaction force [math]F[/math] is a power function of distance [math]r[/math]:

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

where [math]n[/math] is some real dimensionless exponent. The attraction center is at [math]0[/math] point.

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

The text of the program is written in JavaScript:

File"FC.js"

  1 //The movement of a material point in the central field
  2 //developer A.M. Krivtsov 
  3 //18-21.05.2014 
  4 //Internet: tm.spbstu.ru/FC
  5 
  6 function MainFC(canvas) {
  7 
  8     // main parameters
  9     
 10     const m = 1.;   // weight
 11     const a = 1.;   // radius
 12     const P = 1.; 	// gravitation force
 13 
 14     // Derivative dimensional parameters
 15 
 16 	const T = 2 * Math.PI * Math.sqrt(m * a / P);	// period of the movement on a circular orbit
 17 	const v1 = Math.sqrt(P * a / m);				// speed of the movement on a circular orbit (the 1st space)
 18 	
 19 	// Variables
 20 	
 21 	var n, v0, zoom, t_max, dt;
 22 	
 23 	// setting of sliders 
 24 	
 25 	Slider_01.min = 1;			Slider_01.max = 22;					Slider_01.step = 0.1;		// v0 / v1 - initial velocity
 26 	Slider_02.max = 6;			Slider_02.min = -Slider_02.max; 	Slider_02.step = 0.01;		// n - degree indicator	
 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	- time for calculation	
 29 	Slider_05.min = 1;       	Slider_05.max = set_exp(0);			Slider_05.step = 1;			// N_exp	- experiment number
 30 	
 31 	Slider_05.focus();
 32 
 33 	// values of variables
 34 	
 35 	dt = T / 200;       // integration step
 36 	set_exp(6);			// variables are set for experiment 6
 37 
 38 	// display
 39 	
 40 	draw();
 41 
 42     // the functions which are started at change of values of sliders and text fields
 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 	// display
 51 	
 52 	function draw() 
 53 	{ 
 54 		// optimizing
 55 		
 56 		var n1 = (1 - n) / 2;
 57 		var dt1 = -P / m * Math.pow(a, -n) * dt;
 58 		
 59 		// Area of creation of the schedule
 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;		// size of area of display
 65 		x_min = y_min = -x_max;  
 66 
 67 		sx = sy = Y_max / (y_max - y_min); 			// scale on an axis y
 68 		X0 = Y0 = Y_max + y_min * sy;  				// the provision 0 of an axis y in screen coordinates
 69 	   
 70 	   // Initialization of graphics
 71 		
 72 		var context = canvas.getContext("2d");  	// context - for drawing
 73 		context.clearRect(0, 0, X_max, Y_max); 	// clear screen
 74         
 75         // horizontal axis
 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         //  inscription
 84         context.fillStyle = 'black';
 85         context.font = "italic 20px Times";
 86         context.fillText("0", X0 - 15, Y0 - 7);
 87 		
 88 		// schedule 
 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 	// Experiment choice
110 	
111 	function set_exp(N_exp)
112 	{	
113 		var k = Number(N_exp);
114 		
115 //			degree indicator	initial velocity	 zoom		max number of steps
116 	
117 		if (!--k) { n = -3;		v0 = 1.004 * v1; 	zoom = 2.98;	t_max = 17.4 * T; }  	// spiral			
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; }  			// ellipse
124 		if (!--k) { n = -1;		v0 = 1.25 * v1; 	zoom = 1;		t_max = 26 * T; }
125 		if (!--k) { n = -1;		v0 = 1.36 * v1; 	zoom = 1.18;	t_max = 10.8 * T; }		// 10
126 		if (!--k) { n = -1;		v0 = 1.63 * v1; 	zoom = 1.87;	t_max = 25.3 * T; }
127 		if (!--k) { n = -1;		v0 = 1.93 * v1; 	zoom = 2.8;		t_max = 8 * T; }		//  3 !
128 		if (!--k) { n = -1;		v0 = 2.31 * v1; 	zoom = 3.92;	t_max = 64.1 * T; }		// 11
129 		if (!--k) { n = -1;		v0 = 2.43 * v1; 	zoom = 4.29;	t_max = 61.8 * T; }		//  8
130 		if (!--k) { n = -1;		v0 = 2.74 * v1; 	zoom = 5.5;		t_max = 85.5 * T; }		//  5
131 
132 		if (!--k) { n = -0.74;	v0 = 2.665 * v1; 	zoom = 3.81;	t_max = 18.8 * T; }		//  5 
133 		
134 		if (!--k) { n = 0;		v0 = 1.66 * v1; 	zoom = 1.39;	t_max = 5.1 * T; }		//  7 
135 		if (!--k) { n = 0;		v0 = 2.7  * v1; 	zoom = 2.34;	t_max = 8.9 * T; }		//  9 
136 		if (!--k) { n = 0;		v0 = 3.46 * v1; 	zoom = 3.03;	t_max = 13.3 * T; }		// 11 
137 	
138 		if (!--k) { n = 1;		v0 = 2 * v1; 		zoom = 1.3;		t_max = 1 * T; }		// 11 	
139 
140 		if (!--k) { n = 2;		v0 = 2.39 * v1; 	zoom = 1.18;	t_max = 4.0 * T; }		// 11 	
141 	
142 		if (!--k) { n = 3;		v0 = 3.58 * v1; 	zoom = 1.28;	t_max = 1.8 * T; }		//  7 
143 		if (!--k) { n = 3;		v0 = 6.97 * v1; 	zoom = 1.87;	t_max = 1.7 * T; }		//  9
144 		if (!--k) { n = 3;		v0 = 11.28 * v1; 	zoom = 2.13;	t_max = 1.6 * T; }		// 11 	
145 		if (!--k) { n = 3;		v0 = 16.13 * v1; 	zoom = 2.50;	t_max = 1.6 * T; }		// 13 	
146 
147 		if (!--k) { n = 3.29;	v0 = 1.3 * v1; 		zoom = 0.48;	t_max = 1.8 * T; }		// 13 	
148 		
149 		if (!--k) { n = 4;		v0 = 3.36 * v1; 	zoom = 1.12;	t_max = 1.1 * T; }		//  5 !	
150 		if (!--k) { n = 4;		v0 = 6.08 * v1; 	zoom = 1.44;	t_max = 1.9 * T; }		// 12 	
151 		if (!--k) { n = 4;		v0 = 9.52 * v1; 	zoom = 1.66;	t_max = 0.9 * T; }		//  7 !	
152 		if (!--k) { n = 4;		v0 = 18.45 * v1; 	zoom = 2.18;	t_max = 0.728 * T; }	//  9	
153 
154 		if (!--k) { n = 5;		v0 = 7.15 * v1; 	zoom = 1.55;	t_max = 0.6 * T; }		//  5 !	
155 
156 		if (!--k) { n = 4;		v0 = 3.304 * v1; 	zoom = 1.12;	t_max = 36.4 * T; }		//  5 ~~~
157 		if (!--k) { n = 4;		v0 = 9.394 * v1; 	zoom = 1.66;	t_max = 19.6 * T; }		//  7 ~~~	
158 
159 		if (N_exp)
160 		{
161 			Text_01.value = v0 / v1; 		Slider_01.value = Text_01.value;		// initial velocity	    			
162 			Text_02.value = n;     			Slider_02.value = Text_02.value;        // degree indicator
163 			Text_03.value = zoom;     		Slider_03.value = Text_03.value;	    // zoom
164 			Text_04.value = t_max / T;     	Slider_04.value = Text_04.value;		// time for calculation 			
165 			Text_05.value = N_exp;          Slider_05.value = Text_05.value;        // number of experiment
166 		}
167 		
168 		return -k;	// Если N_exp = 0 returns total of experiments, in other cases returns 0
169 	}
170 }

File "FC.html"

 1     <canvas id="canvasGraph" width="600" height="600" style="border:1px solid #000000;"></canvas>
 2 
 3     <!--Installation of parameters of interaction (text fields and sliders)-->
 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             // if not the number is entered - the line won't pass validation on a pattern above, and checkValidity () will return 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             // if not the number is entered - the line won't pass validation on a pattern above, and checkValidity () will return 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         Number of experiment <input id="Text_05" style="width: 4.2ex;" required pattern="[-+]?([0-9]*\.[0-9]+|[0-9]+)" oninput="
41             // if not the number is entered - the line won't pass validation on a pattern above, and checkValidity () will return 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>

The application allows to set the following parameters interactively:

  • [math]v_0[/math] is the initial velocity of the point. The initial velocity is directed perpendicular to the radial vector. Velocity is measured relatively to the circular speed [math]v_1[/math] at the initial distance from the center (the first cosmic speed).
  • [math]n[/math] is the index of the interaction law ([math]n=-2[/math] corresponds to the gravitational interaction, [math]n=1[/math] is the elastic interaction).
  • "zoom" is the logarithmic scale (the logarithm to base 2).
  • [math]t_{\rm max}[/math] is the integration time expressed in terms of periods of circular motion [math]T[/math] at the initial distance from the center.

Besides all, it is possible to set "a number of the experiment". Every number has a separate set of four parameters named above and characterized by a specific type of motion.

Research ideas[edit]

  • To find all the possible trajectories
  • To define the dependence of the distance to the epicenter (the most distant point) of the orbit on [math]n[/math] and [math]u=v_0/v_1[/math].
  • To find the closed trajectories of different topologies (for example, 5th, the 7th pointed stars, etc.) and to determine their position on the plane of parameters [math]n[/math] and [math]u[/math].
  • To find a method for integrating the equations of motion with a variable step allowing to model the motion of a point at a large values of [math]|n|[/math] effectively.
  • Fit the parameters values (and develop a handy method to do so), to obtain "beautiful" curves, which can be considered as Science Art objects (see in particular, the last numbers of experiments).