- PVSM.RU - https://www.pvsm.ru -

Есть мнение, что в оптимальной компоновке многоступенчатой ракеты каждая ступень должна иметь запас характеристической скорости (delta-V) в 4 км/с. Считается, что оптимальная начальная тяговооруженность 1.2. Но эти идеи надо как-нибудь подтвердить. Также мне хотелось наглядно показать, почему ракеты делают многоступенчатыми. Формулы — это хорошо, но нужно ещё что-то интересное, и в качестве такого идеально подходят игры и соревнования. Так родился проект образовательной/игровой программы под кодовым названием «enlarge your ПН»
Виртуально разгонять ракету в вакууме вдали от планет мне показалось неинтересным. Поэтому задачей будет стартовать с Земли. Расчет аэродинамического сопротивления и выхода на орбиту с поверхности представился сложным, поэтому ракета, как в мысленном эксперименте Ньютона, будет стартовать с «высокой горы» в вакууме:

В качестве входных данных были выбраны следующие параметры:
Те, кто хотя бы чуть-чуть интересовался ракетной техникой, могут спросить, куда пропал удельный импульс, который используется в формуле Циолковского? На самом деле, он никуда не пропал. Удельный импульс неявно содержится в тяге двигателя и расходе топлива. УИ пропорционален тяге и обратно пропорционален расходу топлива. Чем больше тяга и чем меньше расход топлива, тем больше УИ.
Тягу двигателя в тоннах можно пересчитать в тягу в килоньютонах, умножив её на 9,81.
Масса баков, переходников и прочих вспомогательных конструкций считается «навскидку» как 10% массы топлива и названа «паразитной массой». Это достаточно серьезное упрощение, потому что в реальности этот параметр сильно влияет на общую эффективность ракеты и отличается у разных ракет. Чем легче баки, переходники и прочие конструкции, тем меньше паразитной массы надо поднимать ракете.
Полная и пустая массы рассчитываются на базе известных параметров. Пустая масса — это масса всех двигателей и паразитная масса, полная масса — это пустая масса и масса топлива
Расчет гравитационных потерь подробно показан ниже.
Разгон ракеты в модели происходит так:

Высота полёта предполагается постоянной. Тогда тягу ракеты можно будет разделить на две проекции: Fx и Fy. Fy должен быть равен mg, это наши гравитационные потери, а Fx — это сила, которая будет разгонять ракету. F постоянна, это тяга двигателей, m меняется из-за расхода топлива.
Изначально была попытка аналитического решения уравнения движения ракеты. Однако, она не увенчалась успехом, поскольку гравитационные потери зависят от скорости ракеты. Проведем мысленный эксперимент:
Получается, что фактические гравитационные потери являются функцией от массы и скорости ракеты. В качестве упрощённого приближения гравитационные потери я решил считать как:

V1 — это первая космическая скорость.
Т.е. когда скорость ракеты составляет 4 км/с, у ракеты уже как бы хватает времени, чтобы разогнаться, и гравитационные потери считаются нулевыми. Это сделано для возможности существования верхних ступеней с очень низкой тяговооруженностью.
Поэтому для расчета итоговой скорости пришлось использовать численное моделирование. С шагом в одну секунду производятся следующие расчеты:

Верхний индекс t — это текущая секунда, t-1 — предыдущая.
for (int time = 0; time < iBurnTime[stage]; time++) {
int m1 = m0 - iEngineFuelUsage[stage] * iEngineQuantity[stage];
double ms = ((m0 + m1) / 2);
double Fy = (9.81 * ms - 9.81 * ms * (result / 7900) * 2);
if (Fy < 0) {
Fy = 0;
}
double Fx = iEngineThrust[stage] * iEngineQuantity[stage] * 1000 - Fy;
if (Fx < 0) {
Fx = 0;
}
result = (result + Fx / ms);
m0 = m1;
}
Зная итоговую скорость для каждой допустимой полезной нагрузки, можно решать задачу максимизации полезной нагрузки как задачу нахождения корня нелинейного уравнения.

Мне показалось удобнее всего решать это уравнение методом половинного деления [1]:

public static int calculateMaxPN(int stages) {
deltaV = new double[5];
int result = 0;
int PNLeft = 50;
while (calculateVelocity(PNLeft, stages, false) > 7900) {
PNLeft = PNLeft + 1000;
}
System.out.println(calculateVelocity(PNLeft, stages, false));
int PNRight = PNLeft - 1000;
double error = Math.abs(calculateVelocity(PNLeft, stages, false) - 7900);
System.out.println("Слева " + Double.toString(PNLeft) + "; Справа " + Double.toString(PNRight) + "; Ошибка " + Double.toString(error));
boolean calcError = false;
while ((error / 7900 > 0.001) && !calcError) {
double olderror = error;
if (calculateVelocity((PNLeft + PNRight) / 2, stages, false) > 7900) {
PNRight = (PNLeft + PNRight) / 2;
} else {
PNLeft = (PNLeft + PNRight) / 2;
}
error = Math.abs(calculateVelocity((PNLeft + PNRight) / 2, stages, false) - 7900);
System.out.println("Слева " + Double.toString(PNLeft) + "; Справа " + Double.toString(PNRight) + "; Ошибка " + Double.toString(error));
if (Math.abs(olderror - error) < 0.0001) { //аварийный выход если алгоритм уйдет не туда
PNLeft = 0;
PNRight = 0;
calcError = true;
}
}
result = (PNLeft + PNRight) / 2;
calculateVelocity(result, stages, true);
return result;
}
Теперь, после теоретической части, можно и поиграть.
Проект расположен на GitHub [2]. Лицензия MIT, пользуйтесь и модифицируйте на здоровье, а распространение даже приветствуется.
Главное и единственное окно программы:

Вы можете рассчитать конечную скорость ракеты для указанной ПН, заполнив текстовые поля параметров, введя ПН сверху и нажав кнопку «Посчитать скорость».
Также можно рассчитать максимальную полезную нагрузку для данных параметров ракеты, в этом случае поле «ПН» не учитывается.
Есть реальная ракета с пятью ступенями «Minotaur V». Кнопка «Minotaur V» загружает параметры, похожие на эту ракету для того, чтобы показать пример работы программы.
По сути это режим «песочницы», в котором можно создавать ракеты с произвольными параметрами, изучая, как различные параметры влияют на грузоподъемность ракеты.
Режим «Соревнование» активируется нажатием кнопки «Соревнование». В этом режиме количество управляемых параметров сильно ограничено для одинаковости условий соревнования. На всех ступенях стоят однотипные двигатели (это нужно для наглядности необходимости нескольких ступеней). Можно управлять количеством двигателей. Также можно управлять распределением топлива по ступеням и количеством ступеней. Максимальный вес топлива — 300 тонн. Залить меньше топлива можно.
Задача: используя минимальное количество двигателей добиться максимальной ПН. Если желающих поиграть будет много, то в каждом количестве двигателей будет свой зачет.
Желающие могут оставлять свой результат с использованными параметрами в комментариях. Успехов!
Автор: lozga
Источник [4]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/fizika/57677
Ссылки в тексте:
[1] методом половинного деления: http://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BF%D0%BE%D0%BB%D0%BE%D0%B2%D0%B8%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F
[2] расположен на GitHub: https://github.com/lozga/rocketcalc
[3] с оф. сайта: http://java.com/ru/
[4] Источник: http://habrahabr.ru/post/216767/
Нажмите здесь для печати.