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

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


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

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

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

<addscript src=FC/>

Не удается найти HTML-файл FC_TM.html

Текст приложения на языке JavaScript: <toggledisplay status=hide showtext="Показать↓" hidetext="Скрыть↑" linkstyle="font-size:default"> Файл "FC.js"

// Движение материальной точки в центральном поле
// Разработчик А.М. Кривцов 
// 18.05.2014 
// Интернет: tm.spbstu.ru/FC

function MainFC(canvas) {

    // Предварительные установки

	const X_max = canvas.width;
 	const Y_max = canvas.height;
	
    // Размерные параметры
    
    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, n1, dt1, zoom;
	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 = 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;       
    Slider_03.max = 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();

    // функции, запускающиеся при перемещении слайдера

    this.set_01 = function(input) { v0 = Number(input) * v1; 	draw(); }  
    this.set_02 = function(input) { set_n(input); 				draw(); }  
    this.set_03 = function(input) { set_zoom(input); 			draw(); } 
    this.set_04 = function(input) { t_max = Number(input) * T; 	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() 
	{ 
	   // Расчет параметров графики
		
		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;
		var vy = 0;
		var x = 0;
		var y = a;
		context.moveTo(X0, Y0 - a * sy);
		for (var t = 0; t < t_max; t += dt)
		{
			var r2 = x * x + y * y;
//			var r = Math.sqrt(r2);	var rn = Math.pow(r, 1 - n);
			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();			
	}
}

Файл "FC.html"

<!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>

    <!--Установка параметров взаимодействия (текстовые поля и слайдеры)-->
    <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>
    
	<script type="text/javascript">var app = new MainFC	(
		document.getElementById('canvasGraph')
	);</script>

</body>
</html>

</toggledisplay>

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

  • [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] на начальном удалении от центра.