Для решения задачи на понадобится ввести структуру body,
которая будет иметь 3 координаты в пространстве и вектор скорости. Каждое тело,
присутствующее в задаче описывается именно этими параметрами.
Изначально система покоится, количество и координаты тел считываются
программой из файла. Также считывается время, при достижении которого
происходит остановка алгоритма и вывод результатов.
Исходные данные:
- Количество тел.
- Координаты каждого тела в пространстве.
- Время работы программы.
Результат:
- Координаты каждого тела в пространстве.
- Время работы программы.
Шаг 0:
Задаём начальный параметры задачи.
TIME - квант времени.
MASS - масса каждого тела.
G - гравитационная постоянная.
Получаем исходные данные задачи.
Шаг 1:
Для каждого тела вычисляется сила, действующая на него со стороны всех других
тел по формуле, приведённой в постановке задачи.
Fx += G * system[i].weight * system[j].weight / pow(Length(system[i],system[j]),3) * (system[j].x - system[i].x);
Fy += G * system[i].weight * system[j].weight / pow(Length(system[i],system[j]),3) * (system[j].y - system[i].y);
Fz += G * system[i].weight * system[j].weight / pow(Length(system[i],system[j]),3) * (system[j].z - system[i].z);
Шаг 2:
Каждое тело сдвигается на некоторую величину, зависящую
от скорости и прошедшего кванта времени.
// передвижение тела
void Motion(body &b,long double Fx,long double Fy,long double Fz){
long double accelx, accely, accelz;
accelx = Fx / b.weight;
accely = Fy / b.weight;
accelz = Fz / b.weight;
b.x += b.vx * TIME + accelx * pow(TIME, 2)/2;
b.y += b.vy * TIME + accely * pow(TIME, 2)/2;
b.z += b.vz * TIME + accelz * pow(TIME, 2)/2;
b.vx += accelx * TIME;
b.vy += accely * TIME;
b.vz += accelz * TIME;
};
Шаг 4:
Увеличиваем прошедшее время на некий заданный квант:
time += TIME;
Проверяем критерий остановки:
while(time < T)
Если критерий выполняется, то останавливается и выдаём результаты, иначе на Шаг 1.