Документ взят из кэша поисковой машины. Адрес оригинального документа : http://www.abitu.ru/en2002/closed/viewwork.html?work=26
Дата изменения: Fri May 5 15:25:33 2006
Дата индексирования: Tue Oct 2 02:18:18 2012
Кодировка: koi8-r

Поисковые слова: р р р р р р п п р р

Автор: Линник Николай Александрович, 11-А класс ровенской гуманитарной
гимназии ?2, г. Ровно, Украина, Olexandr.Lynnyk@renome.rovno.ua

Научный руководитель: Остапюк Петр Степанович


Алгоритм решения задачи двух тел для ПК.

Задача двух тел в физике является классической задачей, которая имеет
общее и четкое решение. Однако, с усовершенствованием ПК и, в частности,
языков программирования высшего уровня, появляется масса новых возможностей
для, например, демонстрации и изучения этого процесса с большей
наглядностю, то есть его визуализации. Этот вопрос и будет рассматриваться,
поскольку для построения алгоритма необходим расчет параметров траектории в
любой момент времени. Как пример рассмотрим гиперболическое движение тела
(из большого расстояния с начальной скоростю) к планете, которая условно
считается неподвижной, то есть масса тела много меньше массы планеты.
ПРИМЕЧАНИЕ: Некоторые соотношения, приведенные ниже, приводятся без
доказательств, так как могут считаться общеизвестными. В частности,
рекомендую:
Д. В. Сивухин, «Общий курс физики», т.1, «Механика», Москва 1979, стр.311-
320;
Г. Корн, Т. Корн «Справочник по математике», Москва 1984, стр. 64-67.
Пусть в начальный момент времени небольшое тело находится на
расстоянии l от планеты, много большем размеров этой планеты. Скорость тела
V0 направлена под углом ( к прямой соединяющей тело и центр планеты (см.
рис.). Тогда тело движется по гиперболической траектории (в случае V0 = 0 -
по параболической). В данном случае для описания траектории тела удобнее
всего пользоваться каноническим уравнением конического сечения: y2=2px-(1-
(2)x2, где p - фокальный параметр, а ( - эксцентриситет. В некоторых
расчетах также будет использована формула [pic]. Найдем фокальный параметр
p и эксцентриситет ( гиперболы. Поскольку [pic] (как видно со схемы), то
секториальная скорость ([pic],м2/с, по второму закону Кеплера) равна [pic]
и фокальный параметр [pic], где G - гравитационная постоянная, M - масса
планеты, ( - угловое расстояние между направлением вектора скорости и
направлением на планету (см. рис.). Величины M и ( также задаются. Чтобы
найти ( сначала найдем угол ( между асимптотой, вдоль которой сначала
направлена скорость, и осью 0x. С одной стороны [pic]. С другой:
[pic]
Из этих двух уравнений получаем [pic].
Параметры гиперболы найдены. Теперь определим, как зависит скорость
тела от расстояния его от планеты r. По закону сохранения энергии:
[pic]
В системе координат (X,Y), на схеме, расстояние расписывается так: [pic]. В
начальный момент времени [pic]и [pic], [pic], где [pic] - фокус гиперболы,
[pic]. Посчитаем изменения координат X и Y за время dt. Известно, что
[pic], а в данном случае [pic], где dx и dy - малые изменения,
соответственно, координат X и Y. Поскольку [pic], то для dx:
[pic], и тогда новые координаты тела равны:
[pic] и [pic], причем следует заметить, что при [pic] [pic] и наоборот.
Ниже приводится программа на языке C++, которая реализует приведенный выше
алгоритм:

#include
#include
#include

const double l=10000000; //параметр [pic]
const float V0=5000; //параметр [pic]
const float angle=0.5; //параметр (
const float dt=10; //масштаб времени
const double G=6.67e-11; //гравитационная постоянная
const double M=5.98e24; //масса планеты (Земли)


double E; //эксцентриситет
float p; //фокальный параметр
float F; //фокус
float b; // параметр b

float b_angle; // параметр (
float S; //секториальная скорость

float x1; //начальные координаты
float y1; //тела
float r;
float Vi;
int xC;

long mash=100000; //масштаб изображения
int radius=3;
int x0=200;
int y0;
double dy;
double dx;

int gdriver = VGA;
int gmode = VGAHI;
int *block;

int main(void)
{

initgraph(&gdriver, &gmode, "d:\\tmp\\");


S=0.5*l*V0*sin(angle); //расчет секториальной скорости

b=l*sin(angle);

b_angle=atan(b*V0*V0/(G*M));
E=sqrt(1+(b*V0*V0/(G*M))*(b*V0*V0/(G*M)));
p=(4*S*S) / (G*M);
F=p/(1+E);

y1= (-1*l*sin(b_angle+angle)/mash);
x1= (l*cos(b_angle+angle)/mash)+F/mash;

xC= x0+F/mash;
y0= getmaxy()/2;

circle(xC, y0, 10);
circle(x1+x0, y0+y1, radius);

getimage(x1+x0-radius, y0+y1-radius,x1+x0+radius, y0+y1+radius, block);

while(!kbhit())
{
r=sqrt(y1*y1+(x1-F)*(x1-F));

Vi=sqrt(V0*V0 + 2*(G*M)/r);

dx=(Vi*dt)/sqrt(1 + ((p-(1-E*E)*x1)*(p-(1-E*E)*x1)) /
(y1*y1))/mash;
dy=(dx * (p-(1-E*E)*x1) / y1)/mash;

if(y1<0)
{
putimage((x1+x0)-dx-radius, (y0+y1)-dy-radius, block ,OR_PUT);
x1=x1-dx;
y1=y1-dy;
}

else
{
putimage((x1+x0)+dx-radius, (y0+y1)-dy-radius, block ,OR_PUT);
x1=x1+dx;
y1=y1+dy;
}
};
closegraph();
return 0;
}

В общем виде алгоритм можно выразить в таком виде:
1. Выбор системы координат и оптимальных уравнений, которыми проще всего
пользоваться в конкретном случае; это значительно облегчает решение
задачи.
2. Подсчет всех параметров в этих уравнениях в соответствии с принятыми
исходными данными (в рассмотренном случае это были расстояние от тела к
планете, угловое расстояние, начальная скорость, масса планеты,
гравитационная постоянная).
3. Вычисление начальных координат тела.
4. Вычисление малых приращений обоих координат в зависимости от этих
координат.
5. Возврат результата в любой удобной или необходимой форме.
Данный подход очень удобен, поскольку позволяет практически без трудностей
строить траектории задачи двух тел при любых достаточных исходных данных,
траектории параболические, эллиптические и круговые, а также без особых
трудностей рассчитывать и строить переходы между ними.
-----------------------
Xcomp


Ycomp


0

F

b

(

(

(

l

X1

X

Y1

Y

A

M