Цитата: bjaka_max от 12.08.2009 08:53:30
На самом деле Alex_B тоже на службе у НАСА, если в его программе задать $Utang = 30; а не 67 как у него, то корабль при T = 7950 достигает апогея в 15610 км и начинает спускаться обратно. Учитывая, что параметры взяты от балды и методика расчётов вызывает сомнения - попадание поразительное - мои аплодисменты. А если взять для угла тангажа сокральное число 33 то корабль достигает апогея в 17737 километров. И в атмосферу потом входит примерно в момент 17750. Но это можно не рассматривать потому-что в апогее аполо-4 отделился от третьей ступени и потом ещё эволюции совершал.
"если в его программе задать $Utang = 30;" Но по заявленным официальным данным НАСА тангаж 40 градусов. Отделение А-4 от ступени можно не учитывать - при полете по инерции в гравитационном поле в вакууме объекты, объект, "поставленный" на траекторию, будет идти по ней независимо от массы. Если же А-4 "отделить" в апогее (когда? через месяц? допустим, через час поле окончания разгона при помощи S-IVB) и еще его средствами "поднять апогей", то мы ТОЧНО достигнем второй космической и вообще к Юпитеру улетим...если до этого в Луну или Марс не воткнемся...
Параметры первично брались по памяти, потом поднял первоисточники.
Последний расчет я делал по ОФИЦИАЛЬНЫМ данным.
Секундное изменение массы брал как разницу масс перед включением и после выключение двигателя, деленное на время работы (такие вещи, как выход на полную тягу и спад тяги не считал, ибо там по сравнению со временим 333 сек копейки, и опять же этот пойдет вам только на руку - это уменьшает, пусть на чуть-чуть, итоговую скорость).
По J-2 в википедии указано несколько модификаций, для одной из первых тяга 225000 фунтов, она использовалась при полете СА-4,последующие имеют тягу 232000 фунтов. Начинаная с А-8, если я не ошибаюсь, J-2 уже имел 232000 фунтов и удельный импульс на 5 выше. Я брал как раз с меньшей тягой - что опять же на руку НАСА.
По источникам: угол тангажа 40 гадусов, угол рысканья 16 градусов, время работы двигателя 333 сек, начальная скорость и высота орбиты брались оттуда же.
Результат расчета таков: через 100 часов (время Т = 36000 сек) мы имеем высоту 589492.659 км, , Луна осталась изрядно позади, апогей еще не достигнут, скорости "горизонтальная" и "
вертикальная" 119 и
1091 м/с соотвественно, то есть мы радостно продолжаем уходить от Земли... в сторону Марса или Венеры - это нужно тогда считать траекторию не относительно отдельно взятой Земли, а Солнечной системы в целом относительно того момента времени...
В дальнейших планах - переписать программу на Fortran (он быстрее считает, даже быстрее C++, и точнее, чем PERL), модель из двухкоординатной сделать трехкоординатной (на не плоскости, а в пространстве - фактически написать заново), учесть начальное наклонение орбиты и т.д.
Пока последний вариант программы (вычищены баги, алгоритм несколько оптимизирован по скорости, вывод данных идет в файл):
#!/usr/bin/perl -w
use Math::Trig ":pi";
#$|=1;
use strict;
use vars qw($Arx $Ary $Akx $Aky $Ar $Ak); # компоненты радиус-вектора и касательного вектора и их модули
use vars qw($Kx $Ky); # координаты корабля
use vars qw($Vx $Vy $V); # компонеты вектора скорости и его модуль
use vars qw($Gx $Gy $G); # компоненты вектора силы тяжестии его модули
use vars qw($FDA $FDK $FDAx $FDKx $FDAy $FDKy $FDx $FDy $FD $FDt1 $FDt2 $FDr); # компоненты ветора тяги двигателя
#и его модуль в локальной и общей координатах и временной значение для расчетов, тяга во время работы
use vars qw($Fy $Fx $F); # сумма всех сил и ее компонеты.
use vars qw($Ay $Ax $A); # ускорение и его компонеты.
use vars qw($mass0 $mass $massk $dmass $dmass2 $rash_topl_sek); # начальная масса, текущая масса, масса в конце работы
# двигателя, изменение массы за цикл, его половина, секундный расход топлива
use vars qw($dT $Td $Tdn $Tdk $Tr $T); # шаг по времени, время работы двигателя, время включения двигателя, время
# выключения двигателя, время расчета, время от начала расчетов
use vars qw($R $H $Hkm); # Расстояние от центра Земли и высота.
use vars qw($V0x $V0y);
use vars qw($Vras); # Идеальная расчетная первая космическая скрость для высоты
use vars qw($Vmin $Vmax $Hmin $Hmax); # Максимальные и минимальные скорости и высоты
use vars qw($Urys $Utang $DV); # Углы тангажа и рыскания и индикатор работы двигателя
use vars qw($Vkas $Vvert $cosf $Akasmod $Armod); # Вспомогательные переменные
use constant GCONST => 6.67259E-11; # Гравитационная постоянная
use constant MASSZ => 5.97371E24; # Масса Земли
use constant RZ => 6366250; # Радиус Земли
# Начальные значения
$H = 188000; # Начальная высота согласно официальным данным
$Kx = RZ + $H;
$Ky = 0;
$Tr = 360000; # Время окончаня расчетов, сек.
$dT = 0.001; # Шаг расчетов, сек
$Td = 333; # Время работы двигателя
$Tdn = 100; # Момент запуска двигателя
$Tdk = $Tdn + $Td; # Момент выключения двигателя
$FDx = 0; # Двигатель изначально выключен - мы только вышли на орбиту
$FDy = 0;
$FD = 0;
# Из официальных данных НАСА учитываем, что масса комплекса перед включением
# двигателя 124240 кг, в момент выключения 54020 кг, время работы двигателя 333 сек,
# тяга J-2, установленного на S-IV-501 (A-4) 225000 фунтов, возьмем углы танга;а и рысканья
# 40.08 и 14.85 градусов из официальных данных, а угол тангажа во время
# работы двигателя будем дерджать постоянным к меcтному горизонту:
$FDr = 225000 * 0.45359237 * 9.8; # Переводим тягу двигателя из фунтов в килограммы и ньютоны
$mass0 = 124240;
$massk = 54020;
$rash_topl_sek = ($mass0 - $massk) / $Td; # секундное изменение массы комплекса
$dmass = $rash_topl_sek * $dT; # Измение массы за одну итерацию
$dmass2 = $rash_topl_sek * $dT / 2; # Половина изменения массы за итерацию
$mass = $mass0;
$Urys = 14.85;
$Utang = 40.08;
$Vras = sqrt (GCONST * MASSZ / (RZ + $H)); # Расчет 1-й космической для данной высоты
$Vy = -7798.25 ; # Задаем начальную скорость - согласно данных НАСА
$Vx = 0;
$V = 7798.25;
sub VECT # Подпрограмма вычисление опорных весторов и силы тяжести
{
$R = sqrt($Kx**2 + $Ky**2); # Вычисление расстояния от центра земли и высоты от ее поверхности.
$H = $R - RZ;
$Arx = $Kx/$R; # Вычисление радиус-вектора, единичного
$Ary = $Ky/$R;
$Ar = sqrt($Arx**2 + $Ary**2);
$Akx = $Ary; # Вычисление касательного вектора в направлении полета, единичного
$Aky = -$Arx;
$Ak = sqrt($Akx**2 + $Aky**2);
$G = (GCONST * $mass * MASSZ) / ($R**2); # Вычисление вектора силы тяжести
$Gx = -($Arx * $G);
$Gy = -($Ary * $G);
}
&VECT;
open (FH, ">D:\\Private\\Apollo\\apollo-4-2.txt");
print FH "V = $V, Vx = $Vx, Vy = $Vy, Vras = $Vras\n";
print FH "R = $R, H = $H\n";
print FH "Ar = $Ar, Arx = $Arx, Ary = $Ary\n";
print FH "Ak = $Ak, Akx = $Akx, Aky = $Aky\n";
print FH "G = $G, Gx = $Gx, Gy = $Gy\n";
print FH "успешно\n";
use vars qw($i $id);
# Поскольку в течении работы двигателя мы удерживаем вектор тяги под постоянным углом к горизонту,
# и тяга постоянна, посчитать составляющие на радиус-вектор и касательные вектор можно один раз
$FD = $FDr * cos(pi2/360*$Urys); # величина проекции тяги двигателя на плоскость орбиты, пересчет их градусов в радианы.
$FDK = $FD * cos(pi2/360*$Utang); # Составляющая тяги на касательный вектор, пересчет их градусов в радианы
$FDA = $FD * cos(pi2/360*(90-$Utang)); # Составляющая тяги на радиус-вектор, пересчет их градусов в радианы
$FDt1 = sqrt($FDA**2 + $FDK**2); # Контроль совпадения
$FDx = $FDA * $Arx + $FDK * $Akx; # Пересчет составляющей тяги на ось X
$FDy = $FDA * $Ary + $FDK * $Aky; # Пересчет составляющей тяги на ось Y
$FDt2 = sqrt($FDx**2 + $FDy**2); # Контроль совпадения
print FH "FD = $FD, FDt1 = $FDt1, FDx = $FDx, FDy = $FDy, FDt2 = $FDt2\n\n";
$i = 0; # Итератор
$id = 0;
$Vmin = $V; # Начальные значения для минимальных и максимальных скоростей и высот
$Vmax = $V;
$Hmin = $H;
$Hmax = $H;
$mass = $mass0;
$FDx = 0;
$FDy = 0;
$T = 0;
while ($T < $Tdn)
{
&VECT;
if (($i % 10000) == 0)# Для каждой 10000-й итерации (10 сек) вычисляем и печататем данные на начало цикла
{
$V = sqrt($Vx**2 + $Vy**2);
$Hkm = $H / 1000;
$Akasmod = sqrt($Akx**2 + $Aky**2); # Определяем через скалярное умножение векторов выртикальну
# и горизонтальную составляющие скорости
$cosf = ($Akx * $Vx + $Aky * $Vy) / ($V * $Akasmod);
$Vkas = $V * $cosf;
$Armod = sqrt($Arx**2 + $Ary**2);
$cosf = ($Arx * $Vx + $Ary * $Vy) / ($V * $Armod);
$Vvert = $V * $cosf;
print FH "T = $T, H = ";
print FH sprintf "%.3f", $Hkm;
print FH ", V = ";
print FH sprintf "%.3f", $V;
print FH ", Vk = ";
print FH sprintf "%.3f", $Vkas;
print FH ", Vy = ";
print FH sprintf "%.3f", $Vvert;
print FH ", M = ";
print FH sprintf "%.3f", $mass;
print FH "\n";
print "T = $T\n";
}
$Fx = $Gx; # Сила, действующая на корабль, равна силе гравитации
$Fy = $Gy;
$Ax = $Fx / $mass; # Ускорение по X
$Ay = $Fy / $mass; # Ускорение по Y
$V0x = $Vx;
$V0y = $Vy;
$Vx = $V0x + $Ax * $dT; #Скорость в конце цикла
$Vy = $V0y + $Ay * $dT;
$Kx = $Kx + ($V0x + $Vx) * $dT / 2; # Координаты в конце цикла
$Ky = $Ky + ($V0y + $Vy) * $dT / 2;
if ($V < $Vmin) {$Vmin = $V} # Опрелеяем макс и мин. значения высоты и скорости
if ($V > $Vmax) {$Vmax = $V}
if ($H < $Hmin) {$Hmin = $H}
if ($H > $Hmax) {$Hmax = $H}
$i = $i + 1; # Увеличиваем итератор
$T = $dT*$i; # Текущее время
}
print FH "\nВключение двигателя\n";
$T = $dT*$i; # Текущее время
&VECT;
$V = sqrt($Vx**2 + $Vy**2);
$Hkm = $H / 1000;
$Akasmod = sqrt($Akx**2 + $Aky**2); # Определяем через скалярное умножение векторов выртикальну
# и горизонтальную составляющие скорости
$cosf = ($Akx * $Vx + $Aky * $Vy) / ($V * $Akasmod);
$Vkas = $V * $cosf;
$Armod = sqrt($Arx**2 + $Ary**2);
$cosf = ($Arx * $Vx + $Ary * $Vy) / ($V * $Armod);
$Vvert = $V * $cosf;
print FH "T = $T, H = ";
print FH sprintf "%.3f", $Hkm;
print FH ", V = ";
print FH sprintf "%.3f", $V;
print FH ", Vk = ";
print FH sprintf "%.3f", $Vkas;
print FH ", Vy = ";
print FH sprintf "%.3f", $Vvert;
print FH ", M = ";
print FH sprintf "%.3f", $mass;
print FH "\n\n";
while ($T < $Tdk)
{
&VECT;
$mass = $mass0 - (($T - $Tdn) * $rash_topl_sek); # начальная масса цикла
if (($i % 10000) == 0)# Для каждой 10000-й итерации (10 сек) вычисляем и печататем данные на начало цикла
{
$V = sqrt($Vx**2 + $Vy**2);
$Hkm = $H / 1000;
$Akasmod = sqrt($Akx**2 + $Aky**2); # Определяем через скалярное умножение векторов выртикальну
# и горизонтальную составляющие скорости
$cosf = ($Akx * $Vx + $Aky * $Vy) / ($V * $Akasmod);
$Vkas = $V * $cosf;
$Armod = sqrt($Arx**2 + $Ary**2);
$cosf = ($Arx * $Vx + $Ary * $Vy) / ($V * $Armod);
$Vvert = $V * $cosf;
print FH "T = $T, H = ";
print FH sprintf "%.3f", $Hkm;
print FH ", V = ";
print FH sprintf "%.3f", $V;
print FH ", Vk = ";
print FH sprintf "%.3f", $Vkas;
print FH ", Vy = ";
print FH sprintf "%.3f", $Vvert;
print FH ", M = ";
print FH sprintf "%.3f", $mass;
print FH "\n";
print "T = $T\n";
}
$FDx = $FDA * $Arx + $FDK * $Akx;
$FDy = $FDA * $Ary + $FDK * $Aky;
# Средняя масса за цикл
$mass = $mass - $dmass2;
$Fx = $Gx + $FDx; # Сила, действующая на корабль, равна силе гравитации
$Fy = $Gy + $FDy; # плюс силе тяги двигателей
$Ax = $Fx / $mass; # Ускорение по X
$Ay = $Fy / $mass; # Ускорение по Y
$V0x = $Vx;
$V0y = $Vy;
$Vx = $V0x + $Ax * $dT; #Скорость в конце цикла
$Vy = $V0y + $Ay * $dT;
$Kx = $Kx + ($V0x + $Vx) * $dT / 2; # Координаты в конце цикла
$Ky = $Ky + ($V0y + $Vy) * $dT / 2;
if ($V < $Vmin) {$Vmin = $V} # Опрелеяем макс и мин. значения высоты и скорости
if ($V > $Vmax) {$Vmax = $V}
if ($H < $Hmin) {$Hmin = $H}
if ($H > $Hmax) {$Hmax = $H}
$i = $i + 1; # Увеличиваем итератор
$T = $dT*$i; # Текущее время
}
$mass = $mass - $dmass2;
print FH "\nКонец работы двигателя\n";
$T = $dT*$i; # Текущее время
&VECT;
$V = sqrt($Vx**2 + $Vy**2);
$Hkm = $H / 1000;
$Akasmod = sqrt($Akx**2 + $Aky**2); # Определяем через скалярное умножение векторов выртикальну
# и горизонтальную составляющие скорости
$cosf = ($Akx * $Vx + $Aky * $Vy) / ($V * $Akasmod);
$Vkas = $V * $cosf;
$Armod = sqrt($Arx**2 + $Ary**2);
$cosf = ($Arx * $Vx + $Ary * $Vy) / ($V * $Armod);
$Vvert = $V * $cosf;
print FH "T = $T, H = ";
print FH sprintf "%.3f", $Hkm;
print FH ", V = ";
print FH sprintf "%.3f", $V;
print FH ", Vk = ";
print FH sprintf "%.3f", $Vkas;
print FH ", Vy = ";
print FH sprintf "%.3f", $Vvert;
print FH ", M = ";
print FH sprintf "%.3f", $mass;
print FH "\n\n";
while ($T <= $Tr)
{
&VECT;
if (($i % 10000) == 0)# Для каждой 10000-й итерации (10 сек) вычисляем и печататем данные на начало цикла
{
$V = sqrt($Vx**2 + $Vy**2);
$Hkm = $H / 1000;
$Akasmod = sqrt($Akx**2 + $Aky**2); # Определяем через скалярное умножение векторов выртикальну
# и горизонтальную составляющие скорости
$cosf = ($Akx * $Vx + $Aky * $Vy) / ($V * $Akasmod);
$Vkas = $V * $cosf;
$Armod = sqrt($Arx**2 + $Ary**2);
$cosf = ($Arx * $Vx + $Ary * $Vy) / ($V * $Armod);
$Vvert = $V * $cosf;
print FH "T = $T, H = ";
print FH sprintf "%.3f", $Hkm;
print FH ", V = ";
print FH sprintf "%.3f", $V;
print FH ", Vk = ";
print FH sprintf "%.3f", $Vkas;
print FH ", Vy = ";
print FH sprintf "%.3f", $Vvert;
print FH ", M = ";
print FH sprintf "%.3f", $mass;
print FH "\n";
print "T = $T\n";
}
$Fx = $Gx; # Сила, действующая на корабль, равна силе гравитации
$Fy = $Gy;
$Ax = $Fx / $mass; # Ускорение по X
$Ay = $Fy / $mass; # Ускорение по Y
$V0x = $Vx;
$V0y = $Vy;
$Vx = $V0x + $Ax * $dT; #Скорость в конце цикла
$Vy = $V0y + $Ay * $dT;
$Kx = $Kx + ($V0x + $Vx) * $dT / 2; # Координаты в конце цикла
$Ky = $Ky + ($V0y + $Vy) * $dT / 2;
if ($V < $Vmin) {$Vmin = $V} # Опрелеяем макс и мин. значения высоты и скорости
if ($V > $Vmax) {$Vmax = $V}
if ($H < $Hmin) {$Hmin = $H}
if ($H > $Hmax) {$Hmax = $H}
$i = $i + 1; # Увеличиваем итератор
$T = $dT*$i; # Текущее время
}
print FH "\nVmin = $Vmin, Vmax = $Vmax, Hmin = $Hmin, Hmax = $Hmax\n";
close (FH);
exit;
По результатм счета (исходные данные - ОФИЦИАЛЬНЫЕ, даже балласт учтен)
В момент включения двигателя (я его запускал но 100-й секунде от начала расчетов)
данные идут в порядке: время в секундах, высота в километрах, модуль скорости, горизонтальная и вертикальная ее составляющие в м/с, масса.
T = 100, H = 187.998, V = 7798.253, Vk = 7798.253, Vy = -0.045, M = 124240.000
В момент выключения двигателя
T = 433, H = 643.108, V = 10658.368, Vk = 10093.190, Vy = 3424.663, M = 54020.000
В момент 100 часов (окончание расчетов)
T = 360000, H = 589492.659, V = 1097.596, Vk = 118.731, Vy = 1091.155, M = 54020.000
Данные по начальной и конечной массе, тяге двигателя, времени работы, углам тангажа и рысканья - ОФИЦИАЛЬНЫЕ.
Так что для Аполлон-4 НИКАКОГО апогея в 17400 км силами S-IVB, даже с балластом, и на предсерийных экземплярах J-2 с пониченными характеристиками, быть не может - физика с математикой не позволяют... Либо там стояла S-IV, а не S-IVB, с шестью RL-10 вместо одного J-2 и вдвое меньшим запасом топлива (кстати, идея - надо посчитать вариант с S-IV), либо там двигатель работать должен около 160-180 сек даже с учетом тангажа и рысканья (а без них так вообще 145-150 сек), но в любом случае
НАСА врет, т.е. ОФИЦИАЛЬНАЯ версия полета А-4 СИЛЬНО расходится с результатми расчетов. Даже то, что "импульс прикладывали не тангенциально", не спасает, даже вместе с 8 тоннами балласта.
Физико-математическую модель, реализованную в программе, с ее раскладкой в виде графической схемы для большей понятности, я дам вечером.